From 4903a7fd58a5125c8b0736fa25cde51c0d59b8b3 Mon Sep 17 00:00:00 2001 From: wangshaoping Date: Fri, 13 Sep 2024 14:55:22 +0800 Subject: [PATCH] update --- erm.frontend/package.json | 2 +- gradle.properties | 2 +- io.sc.engine.mv.frontend/package.json | 2 +- io.sc.engine.rule.frontend/package.json | 2 +- .../resources/designer/DecisionTreeDialog.vue | 40 +- .../designer/ExecutionFlowDialog.vue | 1 - .../ParameterProcessorWebController.java | 61 +- .../service/ParameterProcessorService.java | 1 - .../impl/ParameterProcessorServiceImpl.java | 33 - .../tools/graph-editor-ext/css/alert.css | 130 - .../tools/graph-editor-ext/images/save.png | Bin 1128 -> 0 bytes .../tools/graph-editor-ext/images/xml.png | Bin 1593 -> 0 bytes .../static/tools/graph-editor-ext/js/alert.js | 59 - .../tools/graph-editor-ext/js/alert.min.js | 2 - .../static/tools/graph-editor/codemirror.css | 3 - .../tools/graph-editor/deflate/base64.js | 151 - .../tools/graph-editor/deflate/pako.min.js | 3 - .../tools/graph-editor/images/checkmark.gif | Bin 1253 -> 0 bytes .../tools/graph-editor/images/clear.gif | Bin 1114 -> 0 bytes .../tools/graph-editor/images/close.png | Bin 118 -> 0 bytes .../tools/graph-editor/images/collapsed.gif | Bin 1113 -> 0 bytes .../tools/graph-editor/images/dropdown.gif | Bin 1110 -> 0 bytes .../tools/graph-editor/images/dropdown.png | Bin 206 -> 0 bytes .../static/tools/graph-editor/images/edit.gif | Bin 66 -> 0 bytes .../tools/graph-editor/images/expanded.gif | Bin 1110 -> 0 bytes .../static/tools/graph-editor/images/grid.gif | Bin 56 -> 0 bytes .../graph-editor/images/handle-fixed.png | Bin 1293 -> 0 bytes .../tools/graph-editor/images/handle-main.png | Bin 379 -> 0 bytes .../graph-editor/images/handle-rotate.png | Bin 3707 -> 0 bytes .../graph-editor/images/handle-secondary.png | Bin 1270 -> 0 bytes .../graph-editor/images/handle-terminal.png | Bin 1286 -> 0 bytes .../static/tools/graph-editor/images/help.png | Bin 338 -> 0 bytes .../tools/graph-editor/images/locked.png | Bin 1020 -> 0 bytes .../static/tools/graph-editor/images/logo.png | Bin 8999 -> 0 bytes .../tools/graph-editor/images/nocolor.png | Bin 948 -> 0 bytes .../tools/graph-editor/images/refresh.png | Bin 1766 -> 0 bytes .../tools/graph-editor/images/round-drop.png | Bin 1216 -> 0 bytes .../tools/graph-editor/images/search.png | Bin 404 -> 0 bytes .../tools/graph-editor/images/tooltip.png | Bin 1006 -> 0 bytes .../tools/graph-editor/images/transparent.gif | Bin 90 -> 0 bytes .../graph-editor/images/triangle-down.png | Bin 1104 -> 0 bytes .../graph-editor/images/triangle-left.png | Bin 1123 -> 0 bytes .../graph-editor/images/triangle-right.png | Bin 1103 -> 0 bytes .../tools/graph-editor/images/triangle-up.png | Bin 1086 -> 0 bytes .../tools/graph-editor/images/unlocked.png | Bin 1024 -> 0 bytes .../static/tools/graph-editor/index.html | 110 - .../static/tools/graph-editor/js/Actions.js | 1413 --- .../static/tools/graph-editor/js/Dialogs.js | 2542 ----- .../static/tools/graph-editor/js/Editor.js | 2252 ----- .../static/tools/graph-editor/js/EditorUi.js | 4234 --------- .../static/tools/graph-editor/js/Format.js | 5496 ----------- .../static/tools/graph-editor/js/Graph.js | 8344 ----------------- .../static/tools/graph-editor/js/Init.js | 30 - .../static/tools/graph-editor/js/Menus.js | 1315 --- .../static/tools/graph-editor/js/Shapes.js | 3879 -------- .../static/tools/graph-editor/js/Sidebar.js | 3602 ------- .../static/tools/graph-editor/js/Toolbar.js | 954 -- .../tools/graph-editor/jscolor/arrow.gif | Bin 66 -> 0 bytes .../tools/graph-editor/jscolor/cross.gif | Bin 83 -> 0 bytes .../static/tools/graph-editor/jscolor/hs.png | Bin 2684 -> 0 bytes .../static/tools/graph-editor/jscolor/hv.png | Bin 2865 -> 0 bytes .../tools/graph-editor/jscolor/jscolor.js | 913 -- .../static/tools/graph-editor/open.html | 222 - .../graph-editor/resources/grapheditor.txt | 321 - .../graph-editor/resources/grapheditor_de.txt | 320 - .../graph-editor/resources/grapheditor_zh.txt | 321 - .../tools/graph-editor/resources/help.html | 20 - .../tools/graph-editor/resources/help_de.html | 20 - .../graph-editor/sanitizer/sanitizer.min.js | 91 - .../tools/graph-editor/stencils/arrows.xml | 849 -- .../tools/graph-editor/stencils/basic.xml | 895 -- .../tools/graph-editor/stencils/bpmn.xml | 1162 --- .../stencils/clipart/Credit_Card_128x128.png | Bin 15493 -> 0 bytes .../stencils/clipart/Database_128x128.png | Bin 10455 -> 0 bytes .../stencils/clipart/Doctor1_128x128.png | Bin 9441 -> 0 bytes .../stencils/clipart/Earth_globe_128x128.png | Bin 14646 -> 0 bytes .../stencils/clipart/Email_128x128.png | Bin 7410 -> 0 bytes .../stencils/clipart/Empty_Folder_128x128.png | Bin 8093 -> 0 bytes .../stencils/clipart/Firewall_02_128x128.png | Bin 8428 -> 0 bytes .../stencils/clipart/Full_Folder_128x128.png | Bin 9568 -> 0 bytes .../stencils/clipart/Gear_128x128.png | Bin 9193 -> 0 bytes .../stencils/clipart/Graph_128x128.png | Bin 8045 -> 0 bytes .../stencils/clipart/Laptop_128x128.png | Bin 12593 -> 0 bytes .../stencils/clipart/Lock_128x128.png | Bin 13233 -> 0 bytes .../stencils/clipart/MacBook_128x128.png | Bin 12713 -> 0 bytes .../clipart/Monitor_Tower_128x128.png | Bin 10301 -> 0 bytes .../stencils/clipart/Piggy_Bank_128x128.png | Bin 12780 -> 0 bytes .../stencils/clipart/Pilot1_128x128.png | Bin 10147 -> 0 bytes .../stencils/clipart/Printer_128x128.png | Bin 12104 -> 0 bytes .../stencils/clipart/Router_Icon_128x128.png | Bin 5670 -> 0 bytes .../stencils/clipart/Safe_128x128.png | Bin 8876 -> 0 bytes .../stencils/clipart/Security1_128x128.png | Bin 10400 -> 0 bytes .../stencils/clipart/Server_Tower_128x128.png | Bin 13352 -> 0 bytes .../clipart/Shopping_Cart_128x128.png | Bin 13803 -> 0 bytes .../stencils/clipart/Software_128x128.png | Bin 11020 -> 0 bytes .../stencils/clipart/Soldier1_128x128.png | Bin 13540 -> 0 bytes .../stencils/clipart/Suit1_128x128.png | Bin 9128 -> 0 bytes .../stencils/clipart/Suit2_128x128.png | Bin 8925 -> 0 bytes .../stencils/clipart/Suit3_128x128.png | Bin 8326 -> 0 bytes .../stencils/clipart/Tech1_128x128.png | Bin 7146 -> 0 bytes .../stencils/clipart/Telesales1_128x128.png | Bin 8257 -> 0 bytes .../clipart/Virtual_Machine_128x128.png | Bin 16557 -> 0 bytes .../stencils/clipart/Virus_128x128.png | Bin 11358 -> 0 bytes .../clipart/Wireless_Router_N_128x128.png | Bin 7468 -> 0 bytes .../stencils/clipart/Worker1_128x128.png | Bin 9519 -> 0 bytes .../stencils/clipart/Workstation_128x128.png | Bin 13635 -> 0 bytes .../stencils/clipart/iMac_128x128.png | Bin 13149 -> 0 bytes .../stencils/clipart/iPad_128x128.png | Bin 11727 -> 0 bytes .../tools/graph-editor/stencils/flowchart.xml | 920 -- .../tools/graph-editor/styles/default.xml | 105 - .../static/tools/graph-editor/styles/down.gif | Bin 1113 -> 0 bytes .../tools/graph-editor/styles/grapheditor.css | 730 -- .../static/tools/graph-editor/styles/help.css | 4 - .../tools/graph-editor/styles/sprites.png | Bin 10155 -> 0 bytes .../tools/graph-editor/styles/thumb_horz.png | Bin 113 -> 0 bytes .../graph-editor/styles/thumb_vertical.png | Bin 122 -> 0 bytes .../static/tools/graph-editor/styles/up.gif | Bin 1113 -> 0 bytes .../static/tools/graph-editor/viewer.html | 71 - .../sc/engine/rule/server/editor/Actions.js | 1416 --- .../sc/engine/rule/server/editor/Dialogs.js | 2603 ----- .../io/sc/engine/rule/server/editor/Format.js | 5511 ----------- .../rule/server/editor/ModelSelectPath.js | 430 - .../engine/rule/server/editor/decisionTree.js | 102 - .../rule/server/editor/executionFlow.js | 137 - .../io/sc/engine/rule/server/editor/init.js | 43 - .../rule/server/editor/mxgraph-common.js | 812 -- .../engine/rule/server/editor/urlParameter.js | 35 - .../engine/rule/server/view/decisionTree.html | 67 - .../rule/server/view/executionFlow.html | 70 - io.sc.engine.st.frontend/package.json | 2 +- .../src/platform/i18n/messages_zh_CN.json | 10 +- .../package.json | 2 +- io.sc.platform.lcdp.frontend/package.json | 2 +- io.sc.platform.mvc.frontend/package.json | 2 +- .../package.json | 2 +- io.sc.platform.system.frontend/package.json | 2 +- io.sc.standard.frontend/package.json | 2 +- 137 files changed, 41 insertions(+), 52836 deletions(-) delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/css/alert.css delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/images/save.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/images/xml.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/js/alert.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/js/alert.min.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/codemirror.css delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/deflate/base64.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/deflate/pako.min.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/checkmark.gif delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/clear.gif delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/close.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/collapsed.gif delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/dropdown.gif delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/dropdown.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/edit.gif delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/expanded.gif delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/grid.gif delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/handle-fixed.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/handle-main.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/handle-rotate.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/handle-secondary.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/handle-terminal.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/help.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/locked.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/logo.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/nocolor.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/refresh.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/round-drop.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/search.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/tooltip.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/transparent.gif delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/triangle-down.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/triangle-left.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/triangle-right.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/triangle-up.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/unlocked.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/index.html delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Actions.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Dialogs.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Editor.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/EditorUi.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Format.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Graph.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Init.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Menus.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Shapes.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Sidebar.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Toolbar.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/jscolor/arrow.gif delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/jscolor/cross.gif delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/jscolor/hs.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/jscolor/hv.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/jscolor/jscolor.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/open.html delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/grapheditor.txt delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/grapheditor_de.txt delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/grapheditor_zh.txt delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/help.html delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/help_de.html delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/sanitizer/sanitizer.min.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/arrows.xml delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/basic.xml delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/bpmn.xml delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Credit_Card_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Database_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Doctor1_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Earth_globe_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Email_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Empty_Folder_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Firewall_02_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Full_Folder_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Gear_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Graph_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Laptop_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Lock_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/MacBook_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Monitor_Tower_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Piggy_Bank_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Pilot1_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Printer_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Router_Icon_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Safe_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Security1_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Server_Tower_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Shopping_Cart_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Software_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Soldier1_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Suit1_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Suit2_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Suit3_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Tech1_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Telesales1_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Virtual_Machine_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Virus_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Wireless_Router_N_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Worker1_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Workstation_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/iMac_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/iPad_128x128.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/flowchart.xml delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/styles/default.xml delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/styles/down.gif delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/styles/grapheditor.css delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/styles/help.css delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/styles/sprites.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/styles/thumb_horz.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/styles/thumb_vertical.png delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/styles/up.gif delete mode 100644 io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/viewer.html delete mode 100644 io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/Actions.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/Dialogs.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/Format.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/ModelSelectPath.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/decisionTree.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/executionFlow.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/init.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/mxgraph-common.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/urlParameter.js delete mode 100644 io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/view/decisionTree.html delete mode 100644 io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/view/executionFlow.html diff --git a/erm.frontend/package.json b/erm.frontend/package.json index 132773c1..272503e6 100644 --- a/erm.frontend/package.json +++ b/erm.frontend/package.json @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.2.2", - "platform-core": "8.1.324", + "platform-core": "8.1.332", "quasar": "2.16.11", "tailwindcss": "3.4.10", "vue": "3.5.4", diff --git a/gradle.properties b/gradle.properties index 89591bd2..9b3cd178 100644 --- a/gradle.properties +++ b/gradle.properties @@ -38,7 +38,7 @@ application_version=1.0.0 platform_group=io.sc platform_version=8.1.48 platform_plugin_version=8.1.48 -platform_core_frontend_version=8.1.324 +platform_core_frontend_version=8.1.332 ########################################################### # dependencies version diff --git a/io.sc.engine.mv.frontend/package.json b/io.sc.engine.mv.frontend/package.json index 8225b4c0..e20fa65b 100644 --- a/io.sc.engine.mv.frontend/package.json +++ b/io.sc.engine.mv.frontend/package.json @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.2.2", - "platform-core": "8.1.324", + "platform-core": "8.1.332", "quasar": "2.16.11", "tailwindcss": "3.4.10", "vue": "3.5.4", diff --git a/io.sc.engine.rule.frontend/package.json b/io.sc.engine.rule.frontend/package.json index bda27758..d0a04633 100644 --- a/io.sc.engine.rule.frontend/package.json +++ b/io.sc.engine.rule.frontend/package.json @@ -115,4 +115,4 @@ "@univerjs/thread-comment": "0.2.12", "svg-path-commander": "2.0.10" } -} +} \ No newline at end of file diff --git a/io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue b/io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue index dc75417d..42837139 100644 --- a/io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue +++ b/io.sc.engine.rule.frontend/src/views/resources/designer/DecisionTreeDialog.vue @@ -356,32 +356,30 @@ const findResourceAbstractByCodeAndVersion = (code, version) => { const open = async (parameterId, processorId) => { processorIdRef.value = processorId; // 获取资源摘要 - const response = await axios.get(Environment.apiContextPath('/api/re/resource/getAllReleasableResourceAbstract')); - resourceAbstractsRef.value = response.data; + const resourceAbstractResponse = await axios.get(Environment.apiContextPath('/api/re/resource/getAllReleasableResourceAbstract')); + resourceAbstractsRef.value = resourceAbstractResponse?.data; //获取自定义函数 - axios.get(Environment.apiContextPath('/api/re/function?pageable=false')).then((response) => { - const options = []; - const items = response.data?.content; - if (items && items.length > 0) { - for (const item of items) { - if (item.enable) { - options.push(item); - } - } + const functionResponse = await axios.get(Environment.apiContextPath('/api/re/function?pageable=false')); + const functionOptions = []; + for (const item of functionResponse?.data?.content || []) { + if (item.enable) { + functionOptions.push(item); } - userDefinedFunctionsRef.value = options; - }); + } + userDefinedFunctionsRef.value = functionOptions; + // 获取代码提示列表 - axios.get(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + parameterId)).then((response) => { - autoCompletionManager.setParameters(response.data.parameters); - autoCompletionManager.setValueTypes(response.data.valueTypes); - }); + const tipResponse = await axios.get(Environment.apiContextPath('/api/re/common/listParameterAndValueTypeByParameterId/' + parameterId)); + autoCompletionManager.setParameters(tipResponse?.data?.parameters); + autoCompletionManager.setValueTypes(tipResponse?.data?.valueTypes); + // 获取决策树 graph xml - axios.get(Environment.apiContextPath('api/re/model/parameter/processor/getDecisionTreeById/' + processorIdRef.value)).then((response) => { - modelValueRef.value = response.data; - dialogRef.value.show(); - }); + const graphResponse = await axios.get(Environment.apiContextPath('api/re/model/parameter/processor/getDecisionTreeById/' + processorIdRef.value)); + modelValueRef.value = graphResponse?.data; + + // 显示对话框 + dialogRef.value.show(); }; const close = () => { diff --git a/io.sc.engine.rule.frontend/src/views/resources/designer/ExecutionFlowDialog.vue b/io.sc.engine.rule.frontend/src/views/resources/designer/ExecutionFlowDialog.vue index f877e319..aeb77267 100644 --- a/io.sc.engine.rule.frontend/src/views/resources/designer/ExecutionFlowDialog.vue +++ b/io.sc.engine.rule.frontend/src/views/resources/designer/ExecutionFlowDialog.vue @@ -361,7 +361,6 @@ const vertexDefines = [ const outputCommands = dom.getAttribute('outputCommands'); const resourceAbstract = findResourceAbstractByCodeAndVersion(code, version); if (resourceAbstract) { - console.log(resourceAbstract); return { resourceAbstractId: resourceAbstract.id, inputCommands: inputCommands, diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterProcessorWebController.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterProcessorWebController.java index f6fcb98d..acfce8fd 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterProcessorWebController.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ParameterProcessorWebController.java @@ -8,25 +8,17 @@ import io.sc.engine.rule.server.model.service.ParameterProcessorService; import io.sc.engine.rule.server.model.service.ParameterService; import io.sc.engine.rule.server.model.service.support.AutoMatchObjectProperties; import io.sc.engine.rule.server.model.service.support.ObjectProperty; -import io.sc.engine.rule.server.model.service.support.ParemterHints; import io.sc.engine.rule.server.model.support.processor.SqlQueryRequest; import io.sc.engine.rule.server.model.support.processor.SqlQueryResult; import io.sc.engine.rule.server.model.vo.ParameterProcessorVo; -import io.sc.engine.rule.server.model.vo.ParameterValidatorVo; import io.sc.engine.rule.server.util.CodeAndNameMapping; import io.sc.engine.rule.server.util.VariableCodeAndNameReplacer; -import io.sc.platform.core.annotation.IgnoreResponseBodyAdvice; import io.sc.platform.mvc.controller.support.RestCrudController; import io.sc.platform.orm.util.EntityVoUtil; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.BufferedOutputStream; import java.util.Collections; import java.util.List; import java.util.Map; @@ -34,13 +26,12 @@ import java.util.Map; /** * 模型参数处理器 Controller */ -@Controller +@RestController @RequestMapping("/api/re/model/parameter/processor") public class ParameterProcessorWebController extends RestCrudController { @Autowired private ParameterService parameterService; @GetMapping("findByParameterId") - @ResponseBody public List findByParameterId(@RequestParam(name="parameterId",required = false)String parameterId) throws Exception { if(!StringUtils.hasText(parameterId)){ return Collections.emptyList(); @@ -52,22 +43,11 @@ public class ParameterProcessorWebController extends RestCrudController autoMatch(@RequestBody AutoMatchObjectProperties autoMatchObjectProperties) throws Exception { return service.autoMatch(autoMatchObjectProperties); } - //决策树========================================================================================================== - @RequestMapping(value="editDecisionTreeById/{processorId}",method=RequestMethod.GET) - public ModelAndView editDecisionTreeById(@PathVariable(name="processorId")String processorId) throws Exception{ - ModelAndView mv =new ModelAndView("io/sc/engine/rule/server/view/decisionTree.html"); - mv.addObject("processorId", processorId); - mv.addObject("paremterHints",parameterService.listParemterHintsByProcessorId(processorId)); - return mv; - } - - @RequestMapping(value="getDecisionTreeById/{processorId}",method=RequestMethod.GET) - @ResponseBody + @GetMapping("getDecisionTreeById/{processorId}") public String getDecisionTreeById(@PathVariable(name="processorId",required=false)String processorId) throws Exception{ ParameterProcessorEntity entity =service.findById(processorId); if(entity!=null && entity instanceof DecisionTreeParameterProcessorEntity) { @@ -79,8 +59,7 @@ public class ParameterProcessorWebController extends RestCrudController map) throws Exception{ String xml =map.get("xml"); ParameterProcessorEntity entity = service.findById(processorId); @@ -92,18 +71,9 @@ public class ParameterProcessorWebController extends RestCrudController map) throws Exception{ String xml =map.get("xml"); ParameterProcessorEntity entity = service.findById(processorId); @@ -129,14 +98,12 @@ public class ParameterProcessorWebController extends RestCrudController listObejctPropertiesByProcessorId(@PathVariable(name="processorId",required=true)String processorId) throws Exception{ return service.listObejctPropertiesByProcessorId(processorId); } - @RequestMapping(value="importFromCsv",method=RequestMethod.POST) - @ResponseBody + @PostMapping("importFromCsv") public void importFromCsv(@RequestBody Map request) throws Exception{ String parameterId =request.get("parameterId"); String csvContent =request.get("csvContent"); @@ -147,16 +114,8 @@ public class ParameterProcessorWebController extends RestCrudController autoMatch(AutoMatchObjectProperties autoMatchObjectProperties) throws Exception; public void importFromCsv(String parameterId,String csvContent, String splitChar) throws Exception; public SqlQueryResult executeSql(SqlQueryRequest request); - public void generateImage(String parameterProcessorId,OutputStream outputStream,String format) throws Exception; } diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterProcessorServiceImpl.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterProcessorServiceImpl.java index 4a068119..d6b1159a 100644 --- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterProcessorServiceImpl.java +++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ParameterProcessorServiceImpl.java @@ -5,8 +5,6 @@ import com.google.common.base.CharMatcher; import com.google.common.base.Splitter; import io.sc.engine.rule.core.code.impl.support.processor.Rule; import io.sc.engine.rule.core.enums.ParameterType; -import io.sc.engine.rule.core.mxgraph.parser.DecisionTreeParser; -import io.sc.engine.rule.core.mxgraph.parser.ExecutionFlowParser; import io.sc.engine.rule.core.util.ExpressionReplacer; import io.sc.engine.rule.core.util.JacksonObjectMapper; import io.sc.engine.rule.server.dictionary.entity.DictionaryEntity; @@ -16,9 +14,6 @@ import io.sc.engine.rule.server.dictionary.entity.UserDefinedJavaClassFieldEntit import io.sc.engine.rule.server.dictionary.service.DictionaryService; import io.sc.engine.rule.server.model.entity.ParameterEntity; import io.sc.engine.rule.server.model.entity.ParameterProcessorEntity; -import io.sc.engine.rule.server.model.entity.processor.DecisionTreeParameterProcessorEntity; -import io.sc.engine.rule.server.model.entity.processor.ExecutionFlowParameterProcessorEntity; -import io.sc.engine.rule.server.model.entity.processor.ObjectPropertiesParameterProcessorEntity; import io.sc.engine.rule.server.model.entity.processor.RuleParameterProcessorEntity; import io.sc.engine.rule.server.model.repository.ParameterProcessorRepository; import io.sc.engine.rule.server.model.service.ParameterProcessorService; @@ -32,13 +27,10 @@ import io.sc.engine.rule.server.model.vo.ParameterProcessorVo; import io.sc.engine.rule.server.model.vo.processor.ObjectPropertiesParameterProcessorVo; import io.sc.engine.rule.server.util.CodeAndNameMapping; import io.sc.engine.rule.server.util.VariableCodeAndNameReplacer; -import io.sc.platform.core.plugins.item.ApplicationProperties; import io.sc.platform.core.util.ObjectMapper4Json; import io.sc.platform.orm.entity.support.EntityChangedEventType; import io.sc.platform.orm.service.impl.DaoServiceImpl; -import io.sc.platform.orm.util.EntityVoUtil; import org.apache.commons.io.IOUtils; -import org.apache.commons.text.similarity.LevenshteinDistance; import org.apache.commons.text.similarity.LongestCommonSubsequenceDistance; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; @@ -49,7 +41,6 @@ import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.io.ByteArrayInputStream; -import java.io.OutputStream; import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; @@ -371,28 +362,4 @@ public class ParameterProcessorServiceImpl } return null; } - - @Override - public void generateImage(String parameterProcessorId,OutputStream outputStream,String format) throws Exception { - if(StringUtils.hasText(parameterProcessorId)) { - ParameterProcessorEntity entity =findById(parameterProcessorId); - if(entity!=null) { - CodeAndNameMapping mapping = parameterService.loadCodeAndNameMappingByParameterId(entity.getParameter().getId()); - VariableCodeAndNameReplacer.replace(entity, mapping.getCode2NameMapping()); - if(entity instanceof ExecutionFlowParameterProcessorEntity) { - ExecutionFlowParameterProcessorEntity _entity =(ExecutionFlowParameterProcessorEntity)entity; - String xml =_entity.getExecutionFlow(); - if(StringUtils.hasText(xml)) { - new ExecutionFlowParser().generateImage(xml, outputStream, format); - } - }else if(entity instanceof DecisionTreeParameterProcessorEntity) { - DecisionTreeParameterProcessorEntity _entity =(DecisionTreeParameterProcessorEntity)entity; - String xml =_entity.getDecisionTree(); - if(StringUtils.hasText(xml)) { - new DecisionTreeParser().generateImage(xml, outputStream, format); - } - } - } - } - } } diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/css/alert.css b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/css/alert.css deleted file mode 100644 index 65b22227..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/css/alert.css +++ /dev/null @@ -1,130 +0,0 @@ -/*为手机端定制的一款皮肤(引用此皮肤时无需引用alert.css) 最后更新2016-07-27*/ -/* -alert_overlay 背景遮罩 -alert_msg 消息框主体 -alert_content 内容容器 -alert_buttons 底部按钮容器 -alert_btn 两个按钮公用class -alert_btn_ok 确定按钮 -alert_btn_cancel 取消按钮 -*/ -.alert_overlay { - position: fixed; - width: 100%; - height: 100%; - top: 0; - left: 0; - z-index: 1000; - background: rgba(0, 0, 0, .1) -} - -.alert_msg { - position: fixed; - width: 280px; - left: 50%; - margin-left: -140px; - top: 20%; - z-index: 1000; - border: 1px solid #ccc; - border-radius: 4px; - box-shadow: 0 0 15px rgba(0, 0, 0, .3); - background: #fff; - animation: alertshow .2s ease -} - -.alert_content { - padding: 20px; - font-size: 14px; - text-align: left -} - -.alert_buttons { - text-align: center; - border-top: 1px solid #ccc; - -webkit-user-select: none -} - -.alert_buttons .alert_btn { - display: inline-block; - width: 50%; - border: none; - height: 45px; - line-height: 45px; - font-size: 14px; - outline: 0; - -webkit-appearance: none; - background: #fff; - -webkit-tap-highlight-color: transparent; - border-radius: 0 0 4px 4px; -} - -.alert_buttons .alert_btn:only-child { - width: 100% -} - -.alert_buttons .alert_btn:first-child + .alert_btn { - border-left: 1px solid #ccc; - border-radius: 0 0 4px 0; -} - -.alert_tips { - position: fixed; - z-index: 10176523; - width: 100%; - top: 55%; - pointer-events: none; - text-align: center; -} - -.alert_tips div { - box-siziong: border-box; - display: inline-block; - padding: 15px; - border-radius: 10px; - background: rgba(0, 0, 0, .7); - min-width: 50px; - max-width: 230px; - text-align: center; - color: #fff; - animation: tipsshow 3s .01s ease; - opacity: 0; -} - -@keyframes alertshow { - 0% { - opacity: 0; - transform: scale(.5) - } - - 70% { - opacity: .7; - transform: scale(1.05) - } - - 100% { - opacity: 1; - transform: scale(1) - } -} - -@keyframes tipsshow { - 0% { - opacity: 0; - transform: scale(1.4) rotateX(-360deg) - } - - 20% { - opacity: 1; - transform: scale(1) rotateX(0deg) - } - - 80% { - opacity: 1; - transform: scale(1) rotateX(0deg) - } - - 100% { - opacity: 0; - transform: scale(1.4) rotateX(360deg) - } -} \ No newline at end of file diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/images/save.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/images/save.png deleted file mode 100644 index 54f7163cae218310c881af899f9c4f86c3f9912c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1128 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{1|(OCFP#RY7>k44ofy`glX(f`a29w(7Bev9 z?E+!OYxg#a0~MUk42dX-@b$4u&d=3LOvz75)vL%Y0IFtSu&J;DGILW)5)~?PbMlI< zDr}X&Dy)EPkg&dz0$52&wyjcxZ-9bxeo?A|sh)|Rfs!4Uf`WogQA(Oskc%5sJCJ9q zlu=SrV5P5LUS6(OZmgGIl&)`RX=$l%V5DzkqzhD`TU?n}l31aeSF8*%1ZIv)YH@N= zW0om z=vR=B>r8kf#>Y{*3gv8?3){R>>e3Fm&CG4~1ij%f>HFt7is-s7T)Y1uI zE}S2|Iv&Z+OFw_+xTB`P{U?^2jjPMfy?Ij?AH8)!S=%O=vq!x%Zy)-9HD=Div>esP zla9ClIJ&q%rtUyigy^-8vp)2m6uZF}y^uNX5U)h@rrVQbpEJ(*6aP~p+vknD*w+H# zf7v@8vFu{2E#P8XC|~tZ;!R8S2i{!|jNUZoY23cD%+9bv=A7~y4?ms6`2yDLuOG%1 z->X|{v$OPqBxChbzA5RUmiE#$$I@<>8H;_rdVId;*ZWqDd2D&6U*{eyDbQ$o91*?z z)KsI+_%8*2PNh|_ITuLGJ6!#PH~ZkL@`l}&T-P6RFY%iAR8VmCyG4=~oc0G(PG4-V z$ZXy=^UCj+vL+j^9|^W){B~NbB6dxX&4uU(iCWQ%?qqt-;@uv9lkfSv1DWiKw;wa! z)Y@LpSd}Q!vwHu#%&=Kkv)^84c+(nNAn@&gYe9Ir!%xSntG1M_KIJvl-qSR6c9ukT z=_{Kz?Ypfql5?Z7ZO^#w*U%14WqN%*chA(+ukMG=r&NA=dnDBIM$Ju!oyj+947IC(IVO?(6Z3s}@*ZY))3v-=bgMy!OKU7V`qJDgQawKbXWPwf?Nrqtz^L z?t1M!AH}~uWS00Jvwcs?UGB(rN1uN^WqS^YQo^Co|_`;q_Ns)=TIeArah l_ZwcVS>C7fcgw3yWpXuo{Ws=(5KaVTe@|CGmvv4FO#pUb!Giz* diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/images/xml.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/images/xml.png deleted file mode 100644 index 938a4f99eb26d5fc77e81cfe8871f27951494a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1593 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{1|(OCFP#RY7>k44ofy`glX(f`a29w(7Bet# z3xhBt!>l_)Q7iwV z%v7MwAoJ}EZNMr~#Gv-r=z}araty?$U{Rn~?YM08;lXCd<#R|ql7WGx($mE;#6oax zNOX=!s>r{8JKyZxz4XnYZ=2p8Gx_GUaxKfkC0>_5XskCC@V%lg&%>{Fs`*A$cc73- zmsi%Jivo*Rs{B%7TXZ*oIakwl%Z2P&*Dh^HEi=FIZmscVi(I^Yw%D)O#n*qEce#er zdhr>{vTxn^A#Zr=Gqa_6U;4*(*$-0>x6l8x?fX_?e^({J7rWRNFIXI)aig#?sV*rl zmc6lYrrNdZpJ&XRdwAt{dple6{RKVA6AU-5UhN$f6Z1r8zV-LJ2UfrBe`lEDX(Ged zu6lZtrspEf)01A7oLDx=Yo=F>VQ~FDGsW&@_up%`Yzyz0=<#*me7!$LZW6^$7KwBp z^*JWNS7vuDGB~)kMlXBK+P_Z?IuBL{hSfcLOt+;;7;Lh## zlScBh?Ej1Go;~}`CnKg}tGOX3n6Bjfy1!u0Y!lzd@;a&$4}JKcaf_R0XKS{^oA>U| zGWd7Rw`}rAP5oH!azM*+vX^JRktr9OppL>!A7#sW#<{wDJvFu+t(%=!{C{9uQvRm- z_(O%vYX`Yc|Fu&t><()ZXT9u~{B_G{iwxD^-bOPxSx$ zUJLZ5w`sxhZ<6gOs}L>u4-kNG>OT%XQS| z43~XxMyxH99sk)8J%n-^H)w-IKhrJ0mmGNo}%Y@Z-Z~+1cDho(ha-9+mIhWz{otre)2?r{*83 z?w)wMsp9DmPU)1&pL|vE_1xOp<%QWrx283fGnk*A=Pv!?kiARh#U!S?GghtA+OpNQ zso$@@Y1_5CA1Z7tzCGfeF>7A)B9($aPp2mcP3WIB&tGR2e@n*2+glqw{26O&zx8h| zx%Gjasbjsy4y!WR_j~TPciZy^z2bax>uQVk;qZw|ox(zLHm`p_w?bxmrtZF?>yLiv ztzXikwCc*`%gN?K=>D|C4^Q@|Vr)-?J88;r#N@@yxV| b`G2Ha1pmuTJ8Lo(RGxdf`njxgN@xNAZdk6n diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/js/alert.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/js/alert.js deleted file mode 100644 index befb65d2..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/js/alert.js +++ /dev/null @@ -1,59 +0,0 @@ -/** - * jQuery/Zepto 弹窗插件 - * 调用方法(中括号的为可选参数): - * $.alert(string[,function]) - * $.confirm(string[,function]) - * $.tips(string[,number]) - * version:2016-11-30 - */ -!function($){ - //所有的css,可以自定义,css和Dom结构请参考 https://github.com/ydq/alert - var css='.alert_overlay{position:fixed;width:100%;height:100%;top:0;left:0;z-index:1000;background:rgba(0,0,0,.05);-webkit-backdrop-filter:blur(3px)}.pc .alert_msg{width:320px}.mob .alert_msg{width:260px;border-radius:4px}.alert_msg{box-sizing:border-box;position:absolute;left:50%;top:30%;border:1px solid #ccc;box-shadow:0 2px 15px rgba(0,0,0,.3);background:#fff;transition:all .2s cubic-bezier(.8,.5,.2,1.4);-webkit-transform:translate(-50%,-50%) scale(.5);opacity:0;transform:translate(-50%,-50%) scale(.5)}.alert_show .alert_msg{opacity:1;transform:translate(-50%,-50%) scale(1);-webkit-transform:translate(-50%,-50%) scale(1)}.alert_content{padding:20px 15px;font-size:14px;text-align:left}.alert_tips{position:fixed;z-index:10176523}.pc .alert_buttons{padding:6px;border-top:1px solid #ccc;text-align:right;box-shadow:0 1px 0 #fff inset;background:#eee;-webkit-user-select:none}.pc .alert_buttons .alert_btn{padding:4px 8px;margin:0 2px;border:1px solid #ccc;background:#eee;cursor:pointer;border-radius:2px;font-size:14px;outline:0;-webkit-appearance:none}.pc .alert_buttons .alert_btn:hover{border-color:#ccc;box-shadow:0 1px 2px #ccc;background:#eaeaea}.pc .alert_buttons .alert_btn:active{box-shadow:0 1px 2px #ccc inset;background:#e6e6e6}.pc.alert_tips{top:50px;right:50px}.pc.alert_tips div{background:rgba(0,0,0,.7);position:relative;color:#fff;font-size:16px;padding:10px 15px;border-radius:2px;margin-bottom:20px;box-shadow:0 0 3px #000;display:none;float:right;clear:both}.mob .alert_buttons{text-align:center;border-top:1px solid #ccc;-webkit-user-select:none}.mob .alert_buttons .alert_btn{display:inline-block;width:50%;border:0;height:40px;font-size:14px;outline:0;-webkit-appearance:none;background:#fff;-webkit-tap-highlight-color:transparent;border-radius:0 0 4px 4px}.mob .alert_buttons .alert_btn:only-child{width:100%}.mob .alert_buttons .alert_btn:first-child+.alert_btn{border-left:1px solid #ccc;border-radius:0 0 4px 0}.mob.alert_tips{width:100%;top:55%;pointer-events:none;text-align:center}.mob.alert_tips div{box-sizing:border-box;display:inline-block;padding:15px;border-radius:10px;background:rgba(0,0,0,.7);min-width:50px;max-width:230px;text-align:center;color:#fff;animation:tipsshow 3s .01s ease;-webkit-animation:tipsshow 3s .01s ease;opacity:0}@keyframes tipsshow{0%{opacity:0;transform:scale(1.4) rotateX(-360deg)}20%,80%{opacity:1;transform:scale(1) rotateX(0deg)}to{transform:scale(1.4) rotateX(360deg)}}@-webkit-keyframes tipsshow{0%,to{opacity:0}0%{-webkit-transform:scale(1.4) rotateX(-360deg)}20%,80%{opacity:1;-webkit-transform:scale(1) rotateX(0deg)}to{opacity:0;-webkit-transform:scale(1.4) rotateX(360deg)}}'; - $('head').append(''); - $._ismob=/i(Phone|Pod)|Android|phone/i.test(navigator.userAgent) - $._isalert=$._isload=0 - $.alert=function(){ - if(arguments.length){ - $._isalert=1; - return $.confirm.apply($,arguments); - } - } - $.confirm=function(){ - var args=arguments,d; - if(args.length){ - var fn=args[1],_click = function(e){typeof fn=='function'?(fn.call(d,e.data.r)!=!1&&d.close()):d.close()}; - d = $('
'+args[0]+'
') - .on('contextmenu',!1) - .on('click','.alert_btn_ok',{r:!0},_click) - .on('click','.alert_btn_cancel',{r:!1},_click) - $._isload?d.find('.alert_content').css('text-align','center').parent().css({width:'auto',borderRadius:'4px'}).find('.alert_buttons').remove():($._isalert&&d.find('.alert_btn_cancel').remove()) - d.appendTo('body').find('.alert_btn_ok').focus();//让对话框打开后支持直接键盘回车触发确定按钮点击 - d.ok = function(t){d.find('.alert_btn_ok').text(t||'Okey');return d} - d.cancel = function(t){d.find('.alert_btn_cancel').text(t||'Cancel');return d} - d.content = function(t){t&&d.find('.alert_content').html(t);return d} - d.close = function(){d.one('webkitTransitionEnd transitionEnd',function(){d.remove();}).removeClass('alert_show')} - d.addClass('alert_show') - } - $._isalert=$._isload=0; - return d; - }, - $.tips=function(m,t){ - if(m){ - if($._ismob){ - $('.alert_tips').remove(); - $('
'+m+'
').appendTo('body').one('webkitAnimationEnd animationEnd',function(){$(this).remove()}) - }else{ - var tipsContainer = $('.alert_tips'); - tipsContainer.length||(tipsContainer=$('
').appendTo('body')); - $('
'+m+'
').appendTo(tipsContainer).fadeIn('fast').delay(t||2e3).slideUp('fast',function(){$(this).remove();}); - } - } - } - $.load=function(){ - $('.alert_overlay').remove(); - $._isload =1; - var d = $.confirm.call($,arguments[0]||"Loading..."); - $.loaded = d.close; - return d; - } -}($) diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/js/alert.min.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/js/alert.min.js deleted file mode 100644 index 8a1429f9..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor-ext/js/alert.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*jQuery/Zepto弹窗插件 | version:2016-11-30*/ -!function(t){var e=".alert_overlay{position:fixed;width:100%;height:100%;top:0;left:0;z-index:1000;background:rgba(0,0,0,.05);-webkit-backdrop-filter:blur(3px)}.pc .alert_msg{width:320px}.mob .alert_msg{width:260px;border-radius:4px}.alert_msg{box-sizing:border-box;position:absolute;left:50%;top:30%;border:1px solid #ccc;box-shadow:0 2px 15px rgba(0,0,0,.3);background:#fff;transition:all .2s cubic-bezier(.8,.5,.2,1.4);-webkit-transform:translate(-50%,-50%) scale(.5);opacity:0;transform:translate(-50%,-50%) scale(.5)}.alert_show .alert_msg{opacity:1;transform:translate(-50%,-50%) scale(1);-webkit-transform:translate(-50%,-50%) scale(1)}.alert_content{padding:20px 15px;font-size:14px;text-align:left}.alert_tips{position:fixed;z-index:10176523}.pc .alert_buttons{padding:6px;border-top:1px solid #ccc;text-align:right;box-shadow:0 1px 0 #fff inset;background:#eee;-webkit-user-select:none}.pc .alert_buttons .alert_btn{padding:4px 8px;margin:0 2px;border:1px solid #ccc;background:#eee;cursor:pointer;border-radius:2px;font-size:14px;outline:0;-webkit-appearance:none}.pc .alert_buttons .alert_btn:hover{border-color:#ccc;box-shadow:0 1px 2px #ccc;background:#eaeaea}.pc .alert_buttons .alert_btn:active{box-shadow:0 1px 2px #ccc inset;background:#e6e6e6}.pc.alert_tips{top:50px;right:50px}.pc.alert_tips div{background:rgba(0,0,0,.7);position:relative;color:#fff;font-size:16px;padding:10px 15px;border-radius:2px;margin-bottom:20px;box-shadow:0 0 3px #000;display:none;float:right;clear:both}.mob .alert_buttons{text-align:center;border-top:1px solid #ccc;-webkit-user-select:none}.mob .alert_buttons .alert_btn{display:inline-block;width:50%;border:0;height:40px;font-size:14px;outline:0;-webkit-appearance:none;background:#fff;-webkit-tap-highlight-color:transparent;border-radius:0 0 4px 4px}.mob .alert_buttons .alert_btn:only-child{width:100%}.mob .alert_buttons .alert_btn:first-child+.alert_btn{border-left:1px solid #ccc;border-radius:0 0 4px 0}.mob.alert_tips{width:100%;top:55%;pointer-events:none;text-align:center}.mob.alert_tips div{box-sizing:border-box;display:inline-block;padding:15px;border-radius:10px;background:rgba(0,0,0,.7);min-width:50px;max-width:230px;text-align:center;color:#fff;animation:tipsshow 3s .01s ease;-webkit-animation:tipsshow 3s .01s ease;opacity:0}@keyframes tipsshow{0%{opacity:0;transform:scale(1.4) rotateX(-360deg)}20%,80%{opacity:1;transform:scale(1) rotateX(0deg)}to{transform:scale(1.4) rotateX(360deg)}}@-webkit-keyframes tipsshow{0%,to{opacity:0}0%{-webkit-transform:scale(1.4) rotateX(-360deg)}20%,80%{opacity:1;-webkit-transform:scale(1) rotateX(0deg)}to{opacity:0;-webkit-transform:scale(1.4) rotateX(360deg)}}";t("head").append('"),t._ismob=/i(Phone|Pod)|Android|phone/i.test(navigator.userAgent),t._isalert=t._isload=0,t.alert=function(){if(arguments.length)return t._isalert=1,t.confirm.apply(t,arguments)},t.confirm=function(){var e,o=arguments;if(o.length){var a=o[1],n=function(t){"function"==typeof a?0!=a.call(e,t.data.r)&&e.close():e.close()};e=t('
'+o[0]+'
').on("contextmenu",!1).on("click",".alert_btn_ok",{r:!0},n).on("click",".alert_btn_cancel",{r:!1},n),t._isload?e.find(".alert_content").css("text-align","center").parent().css({width:"auto",borderRadius:"4px"}).find(".alert_buttons").remove():t._isalert&&e.find(".alert_btn_cancel").remove(),e.appendTo("body").find(".alert_btn_ok").focus(),e.ok=function(t){return e.find(".alert_btn_ok").text(t||"Okey"),e},e.cancel=function(t){return e.find(".alert_btn_cancel").text(t||"Cancel"),e},e.content=function(t){return t&&e.find(".alert_content").html(t),e},e.close=function(){e.one("webkitTransitionEnd transitionEnd",function(){e.remove()}).removeClass("alert_show")},e.addClass("alert_show")}return t._isalert=t._isload=0,e},t.tips=function(e,o){if(e)if(t._ismob)t(".alert_tips").remove(),t('
'+e+"
").appendTo("body").one("webkitAnimationEnd animationEnd",function(){t(this).remove()});else{var a=t(".alert_tips");a.length||(a=t('
').appendTo("body")),t("
"+e+"
").appendTo(a).fadeIn("fast").delay(o||2e3).slideUp("fast",function(){t(this).remove()})}},t.load=function(){t(".alert_overlay").remove(),t._isload=1;var e=t.confirm.call(t,arguments[0]||"Loading...");return t.loaded=e.close,e}}($); diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/codemirror.css b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/codemirror.css deleted file mode 100644 index 8efefff2..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/codemirror.css +++ /dev/null @@ -1,3 +0,0 @@ -.CodeMirror-hints{ - z-index:1000000; -} \ No newline at end of file diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/deflate/base64.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/deflate/base64.js deleted file mode 100644 index 1e870ac4..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/deflate/base64.js +++ /dev/null @@ -1,151 +0,0 @@ - -/** -* -* Base64 encode / decode -* http://www.webtoolkit.info/ -* -**/ - -var Base64 = { - - // private property - _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", - - // public method for encoding - encode : function (input, binary) { - binary = (binary != null) ? binary : false; - var output = ""; - var chr1, chr2, chr3, enc1, enc2, enc3, enc4; - var i = 0; - - if (!binary) - { - input = Base64._utf8_encode(input); - } - - while (i < input.length) { - - chr1 = input.charCodeAt(i++); - chr2 = input.charCodeAt(i++); - chr3 = input.charCodeAt(i++); - - enc1 = chr1 >> 2; - enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); - enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); - enc4 = chr3 & 63; - - if (isNaN(chr2)) { - enc3 = enc4 = 64; - } else if (isNaN(chr3)) { - enc4 = 64; - } - - output = output + - this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + - this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); - - } - - return output; - }, - - // public method for decoding - decode : function (input, binary) { - binary = (binary != null) ? binary : false; - var output = ""; - var chr1, chr2, chr3; - var enc1, enc2, enc3, enc4; - var i = 0; - - input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); - - while (i < input.length) { - - enc1 = this._keyStr.indexOf(input.charAt(i++)); - enc2 = this._keyStr.indexOf(input.charAt(i++)); - enc3 = this._keyStr.indexOf(input.charAt(i++)); - enc4 = this._keyStr.indexOf(input.charAt(i++)); - - chr1 = (enc1 << 2) | (enc2 >> 4); - chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); - chr3 = ((enc3 & 3) << 6) | enc4; - - output = output + String.fromCharCode(chr1); - - if (enc3 != 64) { - output = output + String.fromCharCode(chr2); - } - if (enc4 != 64) { - output = output + String.fromCharCode(chr3); - } - - } - - if (!binary) - { - output = Base64._utf8_decode(output); - } - - return output; - - }, - - // private method for UTF-8 encoding - _utf8_encode : function (string) { - string = string.replace(/\r\n/g,"\n"); - var utftext = ""; - - for (var n = 0; n < string.length; n++) { - - var c = string.charCodeAt(n); - - if (c < 128) { - utftext += String.fromCharCode(c); - } - else if((c > 127) && (c < 2048)) { - utftext += String.fromCharCode((c >> 6) | 192); - utftext += String.fromCharCode((c & 63) | 128); - } - else { - utftext += String.fromCharCode((c >> 12) | 224); - utftext += String.fromCharCode(((c >> 6) & 63) | 128); - utftext += String.fromCharCode((c & 63) | 128); - } - - } - - return utftext; - }, - - // private method for UTF-8 decoding - _utf8_decode : function (utftext) { - var string = ""; - var i = 0; - var c = c1 = c2 = 0; - - while ( i < utftext.length ) { - - c = utftext.charCodeAt(i); - - if (c < 128) { - string += String.fromCharCode(c); - i++; - } - else if((c > 191) && (c < 224)) { - c2 = utftext.charCodeAt(i+1); - string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); - i += 2; - } - else { - c2 = utftext.charCodeAt(i+1); - c3 = utftext.charCodeAt(i+2); - string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); - i += 3; - } - - } - - return string; - } - -} diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/deflate/pako.min.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/deflate/pako.min.js deleted file mode 100644 index 92405bd2..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/deflate/pako.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/* pako 1.0.3 nodeca/pako */ -!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.pako=t()}}(function(){return function t(e,a,i){function n(s,o){if(!a[s]){if(!e[s]){var l="function"==typeof require&&require;if(!o&&l)return l(s,!0);if(r)return r(s,!0);var h=new Error("Cannot find module '"+s+"'");throw h.code="MODULE_NOT_FOUND",h}var d=a[s]={exports:{}};e[s][0].call(d.exports,function(t){var a=e[s][1][t];return n(a?a:t)},d,d.exports,t,e,a,i)}return a[s].exports}for(var r="function"==typeof require&&require,s=0;s0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new f,this.strm.avail_out=0;var a=o.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==b)throw new Error(d[a]);if(e.header&&o.deflateSetHeader(this.strm,e.header),e.dictionary){var n;if(n="string"==typeof e.dictionary?h.string2buf(e.dictionary):"[object ArrayBuffer]"===_.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,a=o.deflateSetDictionary(this.strm,n),a!==b)throw new Error(d[a]);this._dict_set=!0}}function n(t,e){var a=new i(e);if(a.push(t,!0),a.err)throw a.msg;return a.result}function r(t,e){return e=e||{},e.raw=!0,n(t,e)}function s(t,e){return e=e||{},e.gzip=!0,n(t,e)}var o=t("./zlib/deflate"),l=t("./utils/common"),h=t("./utils/strings"),d=t("./zlib/messages"),f=t("./zlib/zstream"),_=Object.prototype.toString,u=0,c=4,b=0,g=1,m=2,w=-1,p=0,v=8;i.prototype.push=function(t,e){var a,i,n=this.strm,r=this.options.chunkSize;if(this.ended)return!1;i=e===~~e?e:e===!0?c:u,"string"==typeof t?n.input=h.string2buf(t):"[object ArrayBuffer]"===_.call(t)?n.input=new Uint8Array(t):n.input=t,n.next_in=0,n.avail_in=n.input.length;do{if(0===n.avail_out&&(n.output=new l.Buf8(r),n.next_out=0,n.avail_out=r),a=o.deflate(n,i),a!==g&&a!==b)return this.onEnd(a),this.ended=!0,!1;0!==n.avail_out&&(0!==n.avail_in||i!==c&&i!==m)||("string"===this.options.to?this.onData(h.buf2binstring(l.shrinkBuf(n.output,n.next_out))):this.onData(l.shrinkBuf(n.output,n.next_out)))}while((n.avail_in>0||0===n.avail_out)&&a!==g);return i===c?(a=o.deflateEnd(this.strm),this.onEnd(a),this.ended=!0,a===b):i!==m||(this.onEnd(b),n.avail_out=0,!0)},i.prototype.onData=function(t){this.chunks.push(t)},i.prototype.onEnd=function(t){t===b&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=l.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},a.Deflate=i,a.deflate=n,a.deflateRaw=r,a.gzip=s},{"./utils/common":3,"./utils/strings":4,"./zlib/deflate":8,"./zlib/messages":13,"./zlib/zstream":15}],2:[function(t,e,a){"use strict";function i(t){if(!(this instanceof i))return new i(t);this.options=o.assign({chunkSize:16384,windowBits:0,to:""},t||{});var e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0===(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new f,this.strm.avail_out=0;var a=s.inflateInit2(this.strm,e.windowBits);if(a!==h.Z_OK)throw new Error(d[a]);this.header=new _,s.inflateGetHeader(this.strm,this.header)}function n(t,e){var a=new i(e);if(a.push(t,!0),a.err)throw a.msg;return a.result}function r(t,e){return e=e||{},e.raw=!0,n(t,e)}var s=t("./zlib/inflate"),o=t("./utils/common"),l=t("./utils/strings"),h=t("./zlib/constants"),d=t("./zlib/messages"),f=t("./zlib/zstream"),_=t("./zlib/gzheader"),u=Object.prototype.toString;i.prototype.push=function(t,e){var a,i,n,r,d,f,_=this.strm,c=this.options.chunkSize,b=this.options.dictionary,g=!1;if(this.ended)return!1;i=e===~~e?e:e===!0?h.Z_FINISH:h.Z_NO_FLUSH,"string"==typeof t?_.input=l.binstring2buf(t):"[object ArrayBuffer]"===u.call(t)?_.input=new Uint8Array(t):_.input=t,_.next_in=0,_.avail_in=_.input.length;do{if(0===_.avail_out&&(_.output=new o.Buf8(c),_.next_out=0,_.avail_out=c),a=s.inflate(_,h.Z_NO_FLUSH),a===h.Z_NEED_DICT&&b&&(f="string"==typeof b?l.string2buf(b):"[object ArrayBuffer]"===u.call(b)?new Uint8Array(b):b,a=s.inflateSetDictionary(this.strm,f)),a===h.Z_BUF_ERROR&&g===!0&&(a=h.Z_OK,g=!1),a!==h.Z_STREAM_END&&a!==h.Z_OK)return this.onEnd(a),this.ended=!0,!1;_.next_out&&(0!==_.avail_out&&a!==h.Z_STREAM_END&&(0!==_.avail_in||i!==h.Z_FINISH&&i!==h.Z_SYNC_FLUSH)||("string"===this.options.to?(n=l.utf8border(_.output,_.next_out),r=_.next_out-n,d=l.buf2string(_.output,n),_.next_out=r,_.avail_out=c-r,r&&o.arraySet(_.output,_.output,n,r,0),this.onData(d)):this.onData(o.shrinkBuf(_.output,_.next_out)))),0===_.avail_in&&0===_.avail_out&&(g=!0)}while((_.avail_in>0||0===_.avail_out)&&a!==h.Z_STREAM_END);return a===h.Z_STREAM_END&&(i=h.Z_FINISH),i===h.Z_FINISH?(a=s.inflateEnd(this.strm),this.onEnd(a),this.ended=!0,a===h.Z_OK):i!==h.Z_SYNC_FLUSH||(this.onEnd(h.Z_OK),_.avail_out=0,!0)},i.prototype.onData=function(t){this.chunks.push(t)},i.prototype.onEnd=function(t){t===h.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=o.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},a.Inflate=i,a.inflate=n,a.inflateRaw=r,a.ungzip=n},{"./utils/common":3,"./utils/strings":4,"./zlib/constants":6,"./zlib/gzheader":9,"./zlib/inflate":11,"./zlib/messages":13,"./zlib/zstream":15}],3:[function(t,e,a){"use strict";var i="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;a.assign=function(t){for(var e=Array.prototype.slice.call(arguments,1);e.length;){var a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(var i in a)a.hasOwnProperty(i)&&(t[i]=a[i])}}return t},a.shrinkBuf=function(t,e){return t.length===e?t:t.subarray?t.subarray(0,e):(t.length=e,t)};var n={arraySet:function(t,e,a,i,n){if(e.subarray&&t.subarray)return void t.set(e.subarray(a,a+i),n);for(var r=0;r=252?6:l>=248?5:l>=240?4:l>=224?3:l>=192?2:1;o[254]=o[254]=1,a.string2buf=function(t){var e,a,i,r,s,o=t.length,l=0;for(r=0;r>>6,e[s++]=128|63&a):a<65536?(e[s++]=224|a>>>12,e[s++]=128|a>>>6&63,e[s++]=128|63&a):(e[s++]=240|a>>>18,e[s++]=128|a>>>12&63,e[s++]=128|a>>>6&63,e[s++]=128|63&a);return e},a.buf2binstring=function(t){return i(t,t.length)},a.binstring2buf=function(t){for(var e=new n.Buf8(t.length),a=0,i=e.length;a4)h[n++]=65533,a+=s-1;else{for(r&=2===s?31:3===s?15:7;s>1&&a1?h[n++]=65533:r<65536?h[n++]=r:(r-=65536,h[n++]=55296|r>>10&1023,h[n++]=56320|1023&r)}return i(h,n)},a.utf8border=function(t,e){var a;for(e=e||t.length,e>t.length&&(e=t.length),a=e-1;a>=0&&128===(192&t[a]);)a--;return a<0?e:0===a?e:a+o[t[a]]>e?a:e}},{"./common":3}],5:[function(t,e,a){"use strict";function i(t,e,a,i){for(var n=65535&t|0,r=t>>>16&65535|0,s=0;0!==a;){s=a>2e3?2e3:a,a-=s;do n=n+e[i++]|0,r=r+n|0;while(--s);n%=65521,r%=65521}return n|r<<16|0}e.exports=i},{}],6:[function(t,e,a){"use strict";e.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],7:[function(t,e,a){"use strict";function i(){for(var t,e=[],a=0;a<256;a++){t=a;for(var i=0;i<8;i++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e}function n(t,e,a,i){var n=r,s=i+a;t^=-1;for(var o=i;o>>8^n[255&(t^e[o])];return t^-1}var r=i();e.exports=n},{}],8:[function(t,e,a){"use strict";function i(t,e){return t.msg=D[e],e}function n(t){return(t<<1)-(t>4?9:0)}function r(t){for(var e=t.length;--e>=0;)t[e]=0}function s(t){var e=t.state,a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(R.arraySet(t.output,e.pending_buf,e.pending_out,a,t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))}function o(t,e){C._tr_flush_block(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,s(t.strm)}function l(t,e){t.pending_buf[t.pending++]=e}function h(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function d(t,e,a,i){var n=t.avail_in;return n>i&&(n=i),0===n?0:(t.avail_in-=n,R.arraySet(e,t.input,t.next_in,n,a),1===t.state.wrap?t.adler=N(t.adler,e,n,a):2===t.state.wrap&&(t.adler=O(t.adler,e,n,a)),t.next_in+=n,t.total_in+=n,n)}function f(t,e){var a,i,n=t.max_chain_length,r=t.strstart,s=t.prev_length,o=t.nice_match,l=t.strstart>t.w_size-ft?t.strstart-(t.w_size-ft):0,h=t.window,d=t.w_mask,f=t.prev,_=t.strstart+dt,u=h[r+s-1],c=h[r+s];t.prev_length>=t.good_match&&(n>>=2),o>t.lookahead&&(o=t.lookahead);do if(a=e,h[a+s]===c&&h[a+s-1]===u&&h[a]===h[r]&&h[++a]===h[r+1]){r+=2,a++;do;while(h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&r<_);if(i=dt-(_-r),r=_-dt,i>s){if(t.match_start=e,s=i,i>=o)break;u=h[r+s-1],c=h[r+s]}}while((e=f[e&d])>l&&0!==--n);return s<=t.lookahead?s:t.lookahead}function _(t){var e,a,i,n,r,s=t.w_size;do{if(n=t.window_size-t.lookahead-t.strstart,t.strstart>=s+(s-ft)){R.arraySet(t.window,t.window,s,s,0),t.match_start-=s,t.strstart-=s,t.block_start-=s,a=t.hash_size,e=a;do i=t.head[--e],t.head[e]=i>=s?i-s:0;while(--a);a=s,e=a;do i=t.prev[--e],t.prev[e]=i>=s?i-s:0;while(--a);n+=s}if(0===t.strm.avail_in)break;if(a=d(t.strm,t.window,t.strstart+t.lookahead,n),t.lookahead+=a,t.lookahead+t.insert>=ht)for(r=t.strstart-t.insert,t.ins_h=t.window[r],t.ins_h=(t.ins_h<t.pending_buf_size-5&&(a=t.pending_buf_size-5);;){if(t.lookahead<=1){if(_(t),0===t.lookahead&&e===I)return vt;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var i=t.block_start+a;if((0===t.strstart||t.strstart>=i)&&(t.lookahead=t.strstart-i,t.strstart=i,o(t,!1),0===t.strm.avail_out))return vt;if(t.strstart-t.block_start>=t.w_size-ft&&(o(t,!1),0===t.strm.avail_out))return vt}return t.insert=0,e===F?(o(t,!0),0===t.strm.avail_out?yt:xt):t.strstart>t.block_start&&(o(t,!1),0===t.strm.avail_out)?vt:vt}function c(t,e){for(var a,i;;){if(t.lookahead=ht&&(t.ins_h=(t.ins_h<=ht)if(i=C._tr_tally(t,t.strstart-t.match_start,t.match_length-ht),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=ht){t.match_length--;do t.strstart++,t.ins_h=(t.ins_h<=ht&&(t.ins_h=(t.ins_h<4096)&&(t.match_length=ht-1)),t.prev_length>=ht&&t.match_length<=t.prev_length){n=t.strstart+t.lookahead-ht,i=C._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-ht),t.lookahead-=t.prev_length-1,t.prev_length-=2;do++t.strstart<=n&&(t.ins_h=(t.ins_h<=ht&&t.strstart>0&&(n=t.strstart-1,i=s[n],i===s[++n]&&i===s[++n]&&i===s[++n])){r=t.strstart+dt;do;while(i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&nt.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=ht?(a=C._tr_tally(t,1,t.match_length-ht),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=C._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(o(t,!1),0===t.strm.avail_out))return vt}return t.insert=0,e===F?(o(t,!0),0===t.strm.avail_out?yt:xt):t.last_lit&&(o(t,!1),0===t.strm.avail_out)?vt:kt}function m(t,e){for(var a;;){if(0===t.lookahead&&(_(t),0===t.lookahead)){if(e===I)return vt;break}if(t.match_length=0,a=C._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(o(t,!1),0===t.strm.avail_out))return vt}return t.insert=0,e===F?(o(t,!0),0===t.strm.avail_out?yt:xt):t.last_lit&&(o(t,!1),0===t.strm.avail_out)?vt:kt}function w(t,e,a,i,n){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=i,this.func=n}function p(t){t.window_size=2*t.w_size,r(t.head),t.max_lazy_match=Z[t.level].max_lazy,t.good_match=Z[t.level].good_length,t.nice_match=Z[t.level].nice_length,t.max_chain_length=Z[t.level].max_chain,t.strstart=0,t.block_start=0,t.lookahead=0,t.insert=0,t.match_length=t.prev_length=ht-1,t.match_available=0,t.ins_h=0}function v(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=V,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new R.Buf16(2*ot),this.dyn_dtree=new R.Buf16(2*(2*rt+1)),this.bl_tree=new R.Buf16(2*(2*st+1)),r(this.dyn_ltree),r(this.dyn_dtree),r(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new R.Buf16(lt+1),this.heap=new R.Buf16(2*nt+1),r(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new R.Buf16(2*nt+1),r(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function k(t){var e;return t&&t.state?(t.total_in=t.total_out=0,t.data_type=Q,e=t.state,e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=e.wrap?ut:wt,t.adler=2===e.wrap?0:1,e.last_flush=I,C._tr_init(e),H):i(t,K)}function y(t){var e=k(t);return e===H&&p(t.state),e}function x(t,e){return t&&t.state?2!==t.state.wrap?K:(t.state.gzhead=e,H):K}function z(t,e,a,n,r,s){if(!t)return K;var o=1;if(e===Y&&(e=6),n<0?(o=0,n=-n):n>15&&(o=2,n-=16),r<1||r>$||a!==V||n<8||n>15||e<0||e>9||s<0||s>W)return i(t,K);8===n&&(n=9);var l=new v;return t.state=l,l.strm=t,l.wrap=o,l.gzhead=null,l.w_bits=n,l.w_size=1<L||e<0)return t?i(t,K):K;if(o=t.state,!t.output||!t.input&&0!==t.avail_in||o.status===pt&&e!==F)return i(t,0===t.avail_out?P:K);if(o.strm=t,a=o.last_flush,o.last_flush=e,o.status===ut)if(2===o.wrap)t.adler=0,l(o,31),l(o,139),l(o,8),o.gzhead?(l(o,(o.gzhead.text?1:0)+(o.gzhead.hcrc?2:0)+(o.gzhead.extra?4:0)+(o.gzhead.name?8:0)+(o.gzhead.comment?16:0)),l(o,255&o.gzhead.time),l(o,o.gzhead.time>>8&255),l(o,o.gzhead.time>>16&255),l(o,o.gzhead.time>>24&255),l(o,9===o.level?2:o.strategy>=G||o.level<2?4:0),l(o,255&o.gzhead.os),o.gzhead.extra&&o.gzhead.extra.length&&(l(o,255&o.gzhead.extra.length),l(o,o.gzhead.extra.length>>8&255)),o.gzhead.hcrc&&(t.adler=O(t.adler,o.pending_buf,o.pending,0)),o.gzindex=0,o.status=ct):(l(o,0),l(o,0),l(o,0),l(o,0),l(o,0),l(o,9===o.level?2:o.strategy>=G||o.level<2?4:0),l(o,zt),o.status=wt);else{var _=V+(o.w_bits-8<<4)<<8,u=-1;u=o.strategy>=G||o.level<2?0:o.level<6?1:6===o.level?2:3,_|=u<<6,0!==o.strstart&&(_|=_t),_+=31-_%31,o.status=wt,h(o,_),0!==o.strstart&&(h(o,t.adler>>>16),h(o,65535&t.adler)),t.adler=1}if(o.status===ct)if(o.gzhead.extra){for(d=o.pending;o.gzindex<(65535&o.gzhead.extra.length)&&(o.pending!==o.pending_buf_size||(o.gzhead.hcrc&&o.pending>d&&(t.adler=O(t.adler,o.pending_buf,o.pending-d,d)),s(t),d=o.pending,o.pending!==o.pending_buf_size));)l(o,255&o.gzhead.extra[o.gzindex]),o.gzindex++;o.gzhead.hcrc&&o.pending>d&&(t.adler=O(t.adler,o.pending_buf,o.pending-d,d)),o.gzindex===o.gzhead.extra.length&&(o.gzindex=0,o.status=bt)}else o.status=bt;if(o.status===bt)if(o.gzhead.name){d=o.pending;do{if(o.pending===o.pending_buf_size&&(o.gzhead.hcrc&&o.pending>d&&(t.adler=O(t.adler,o.pending_buf,o.pending-d,d)),s(t),d=o.pending,o.pending===o.pending_buf_size)){f=1;break}f=o.gzindexd&&(t.adler=O(t.adler,o.pending_buf,o.pending-d,d)),0===f&&(o.gzindex=0,o.status=gt)}else o.status=gt;if(o.status===gt)if(o.gzhead.comment){d=o.pending;do{if(o.pending===o.pending_buf_size&&(o.gzhead.hcrc&&o.pending>d&&(t.adler=O(t.adler,o.pending_buf,o.pending-d,d)),s(t),d=o.pending,o.pending===o.pending_buf_size)){f=1;break}f=o.gzindexd&&(t.adler=O(t.adler,o.pending_buf,o.pending-d,d)),0===f&&(o.status=mt)}else o.status=mt;if(o.status===mt&&(o.gzhead.hcrc?(o.pending+2>o.pending_buf_size&&s(t),o.pending+2<=o.pending_buf_size&&(l(o,255&t.adler),l(o,t.adler>>8&255),t.adler=0,o.status=wt)):o.status=wt),0!==o.pending){if(s(t),0===t.avail_out)return o.last_flush=-1,H}else if(0===t.avail_in&&n(e)<=n(a)&&e!==F)return i(t,P);if(o.status===pt&&0!==t.avail_in)return i(t,P);if(0!==t.avail_in||0!==o.lookahead||e!==I&&o.status!==pt){var c=o.strategy===G?m(o,e):o.strategy===X?g(o,e):Z[o.level].func(o,e);if(c!==yt&&c!==xt||(o.status=pt),c===vt||c===yt)return 0===t.avail_out&&(o.last_flush=-1),H;if(c===kt&&(e===U?C._tr_align(o):e!==L&&(C._tr_stored_block(o,0,0,!1),e===T&&(r(o.head),0===o.lookahead&&(o.strstart=0,o.block_start=0,o.insert=0))),s(t),0===t.avail_out))return o.last_flush=-1,H}return e!==F?H:o.wrap<=0?j:(2===o.wrap?(l(o,255&t.adler),l(o,t.adler>>8&255),l(o,t.adler>>16&255),l(o,t.adler>>24&255),l(o,255&t.total_in),l(o,t.total_in>>8&255),l(o,t.total_in>>16&255),l(o,t.total_in>>24&255)):(h(o,t.adler>>>16),h(o,65535&t.adler)),s(t),o.wrap>0&&(o.wrap=-o.wrap),0!==o.pending?H:j)}function E(t){var e;return t&&t.state?(e=t.state.status,e!==ut&&e!==ct&&e!==bt&&e!==gt&&e!==mt&&e!==wt&&e!==pt?i(t,K):(t.state=null,e===wt?i(t,M):H)):K}function A(t,e){var a,i,n,s,o,l,h,d,f=e.length;if(!t||!t.state)return K;if(a=t.state,s=a.wrap,2===s||1===s&&a.status!==ut||a.lookahead)return K;for(1===s&&(t.adler=N(t.adler,e,f,0)),a.wrap=0,f>=a.w_size&&(0===s&&(r(a.head),a.strstart=0,a.block_start=0,a.insert=0),d=new R.Buf8(a.w_size),R.arraySet(d,e,f-a.w_size,a.w_size,0),e=d,f=a.w_size),o=t.avail_in,l=t.next_in,h=t.input,t.avail_in=f,t.next_in=0,t.input=e,_(a);a.lookahead>=ht;){i=a.strstart,n=a.lookahead-(ht-1);do a.ins_h=(a.ins_h<>>24,b>>>=y,g-=y,y=k>>>16&255,0===y)A[o++]=65535&k;else{if(!(16&y)){if(0===(64&y)){k=m[(65535&k)+(b&(1<>>=y,g-=y),g<15&&(b+=E[r++]<>>24,b>>>=y,g-=y,y=k>>>16&255,!(16&y)){if(0===(64&y)){k=w[(65535&k)+(b&(1<d){t.msg="invalid distance too far back",a.mode=i;break t}if(b>>>=y,g-=y,y=o-l,z>y){if(y=z-y,y>_&&a.sane){t.msg="invalid distance too far back",a.mode=i;break t}if(B=0,S=c,0===u){if(B+=f-y,y2;)A[o++]=S[B++],A[o++]=S[B++],A[o++]=S[B++],x-=3;x&&(A[o++]=S[B++],x>1&&(A[o++]=S[B++]))}else{B=o-z;do A[o++]=A[B++],A[o++]=A[B++],A[o++]=A[B++],x-=3;while(x>2);x&&(A[o++]=A[B++],x>1&&(A[o++]=A[B++]))}break}}break}}while(r>3,r-=x,g-=x<<3,b&=(1<>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function n(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new w.Buf16(320),this.work=new w.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function r(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=T,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new w.Buf32(bt),e.distcode=e.distdyn=new w.Buf32(gt),e.sane=1,e.back=-1,Z):N}function s(t){var e;return t&&t.state?(e=t.state,e.wsize=0,e.whave=0,e.wnext=0,r(t)):N}function o(t,e){var a,i;return t&&t.state?(i=t.state,e<0?(a=0,e=-e):(a=(e>>4)+1,e<48&&(e&=15)),e&&(e<8||e>15)?N:(null!==i.window&&i.wbits!==e&&(i.window=null),i.wrap=a,i.wbits=e,s(t))):N}function l(t,e){var a,i;return t?(i=new n,t.state=i,i.window=null,a=o(t,e),a!==Z&&(t.state=null),a):N}function h(t){return l(t,wt)}function d(t){if(pt){var e;for(g=new w.Buf32(512),m=new w.Buf32(32),e=0;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(y(z,t.lens,0,288,g,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;y(B,t.lens,0,32,m,0,t.work,{bits:5}),pt=!1}t.lencode=g,t.lenbits=9,t.distcode=m,t.distbits=5}function f(t,e,a,i){var n,r=t.state;return null===r.window&&(r.wsize=1<=r.wsize?(w.arraySet(r.window,e,a-r.wsize,r.wsize,0),r.wnext=0,r.whave=r.wsize):(n=r.wsize-r.wnext,n>i&&(n=i),w.arraySet(r.window,e,a-i,n,r.wnext),i-=n,i?(w.arraySet(r.window,e,a-i,i,0),r.wnext=i,r.whave=r.wsize):(r.wnext+=n,r.wnext===r.wsize&&(r.wnext=0),r.whave>>8&255,a.check=v(a.check,Et,2,0),_=0,u=0,a.mode=F;break}if(a.flags=0,a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&_)<<8)+(_>>8))%31){t.msg="incorrect header check",a.mode=_t;break}if((15&_)!==U){t.msg="unknown compression method",a.mode=_t;break}if(_>>>=4,u-=4,yt=(15&_)+8,0===a.wbits)a.wbits=yt;else if(yt>a.wbits){t.msg="invalid window size",a.mode=_t;break}a.dmax=1<>8&1),512&a.flags&&(Et[0]=255&_,Et[1]=_>>>8&255,a.check=v(a.check,Et,2,0)),_=0,u=0,a.mode=L;case L:for(;u<32;){if(0===l)break t;l--,_+=n[s++]<>>8&255,Et[2]=_>>>16&255,Et[3]=_>>>24&255,a.check=v(a.check,Et,4,0)),_=0,u=0,a.mode=H;case H:for(;u<16;){if(0===l)break t;l--,_+=n[s++]<>8),512&a.flags&&(Et[0]=255&_,Et[1]=_>>>8&255,a.check=v(a.check,Et,2,0)),_=0,u=0,a.mode=j;case j:if(1024&a.flags){for(;u<16;){if(0===l)break t;l--,_+=n[s++]<>>8&255,a.check=v(a.check,Et,2,0)),_=0,u=0}else a.head&&(a.head.extra=null);a.mode=K;case K:if(1024&a.flags&&(g=a.length,g>l&&(g=l),g&&(a.head&&(yt=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Array(a.head.extra_len)),w.arraySet(a.head.extra,n,s,g,yt)),512&a.flags&&(a.check=v(a.check,n,g,s)),l-=g,s+=g,a.length-=g),a.length))break t;a.length=0,a.mode=M;case M:if(2048&a.flags){if(0===l)break t;g=0;do yt=n[s+g++],a.head&&yt&&a.length<65536&&(a.head.name+=String.fromCharCode(yt));while(yt&&g>9&1,a.head.done=!0),t.adler=a.check=0,a.mode=X;break;case q:for(;u<32;){if(0===l)break t;l--,_+=n[s++]<>>=7&u,u-=7&u,a.mode=ht;break}for(;u<3;){if(0===l)break t;l--,_+=n[s++]<>>=1,u-=1,3&_){case 0:a.mode=J;break;case 1:if(d(a),a.mode=at,e===A){_>>>=2,u-=2;break t}break;case 2:a.mode=$;break;case 3:t.msg="invalid block type",a.mode=_t}_>>>=2,u-=2;break;case J:for(_>>>=7&u,u-=7&u;u<32;){if(0===l)break t;l--,_+=n[s++]<>>16^65535)){t.msg="invalid stored block lengths",a.mode=_t;break}if(a.length=65535&_,_=0,u=0,a.mode=Q,e===A)break t;case Q:a.mode=V;case V:if(g=a.length){if(g>l&&(g=l),g>h&&(g=h),0===g)break t;w.arraySet(r,n,s,g,o),l-=g,s+=g,h-=g,o+=g,a.length-=g;break}a.mode=X;break;case $:for(;u<14;){if(0===l)break t; -l--,_+=n[s++]<>>=5,u-=5,a.ndist=(31&_)+1,_>>>=5,u-=5,a.ncode=(15&_)+4,_>>>=4,u-=4,a.nlen>286||a.ndist>30){t.msg="too many length or distance symbols",a.mode=_t;break}a.have=0,a.mode=tt;case tt:for(;a.have>>=3,u-=3}for(;a.have<19;)a.lens[At[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,zt={bits:a.lenbits},xt=y(x,a.lens,0,19,a.lencode,0,a.work,zt),a.lenbits=zt.bits,xt){t.msg="invalid code lengths set",a.mode=_t;break}a.have=0,a.mode=et;case et:for(;a.have>>24,mt=St>>>16&255,wt=65535&St,!(gt<=u);){if(0===l)break t;l--,_+=n[s++]<>>=gt,u-=gt,a.lens[a.have++]=wt;else{if(16===wt){for(Bt=gt+2;u>>=gt,u-=gt,0===a.have){t.msg="invalid bit length repeat",a.mode=_t;break}yt=a.lens[a.have-1],g=3+(3&_),_>>>=2,u-=2}else if(17===wt){for(Bt=gt+3;u>>=gt,u-=gt,yt=0,g=3+(7&_),_>>>=3,u-=3}else{for(Bt=gt+7;u>>=gt,u-=gt,yt=0,g=11+(127&_),_>>>=7,u-=7}if(a.have+g>a.nlen+a.ndist){t.msg="invalid bit length repeat",a.mode=_t;break}for(;g--;)a.lens[a.have++]=yt}}if(a.mode===_t)break;if(0===a.lens[256]){t.msg="invalid code -- missing end-of-block",a.mode=_t;break}if(a.lenbits=9,zt={bits:a.lenbits},xt=y(z,a.lens,0,a.nlen,a.lencode,0,a.work,zt),a.lenbits=zt.bits,xt){t.msg="invalid literal/lengths set",a.mode=_t;break}if(a.distbits=6,a.distcode=a.distdyn,zt={bits:a.distbits},xt=y(B,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,zt),a.distbits=zt.bits,xt){t.msg="invalid distances set",a.mode=_t;break}if(a.mode=at,e===A)break t;case at:a.mode=it;case it:if(l>=6&&h>=258){t.next_out=o,t.avail_out=h,t.next_in=s,t.avail_in=l,a.hold=_,a.bits=u,k(t,b),o=t.next_out,r=t.output,h=t.avail_out,s=t.next_in,n=t.input,l=t.avail_in,_=a.hold,u=a.bits,a.mode===X&&(a.back=-1);break}for(a.back=0;St=a.lencode[_&(1<>>24,mt=St>>>16&255,wt=65535&St,!(gt<=u);){if(0===l)break t;l--,_+=n[s++]<>pt)],gt=St>>>24,mt=St>>>16&255,wt=65535&St,!(pt+gt<=u);){if(0===l)break t;l--,_+=n[s++]<>>=pt,u-=pt,a.back+=pt}if(_>>>=gt,u-=gt,a.back+=gt,a.length=wt,0===mt){a.mode=lt;break}if(32&mt){a.back=-1,a.mode=X;break}if(64&mt){t.msg="invalid literal/length code",a.mode=_t;break}a.extra=15&mt,a.mode=nt;case nt:if(a.extra){for(Bt=a.extra;u>>=a.extra,u-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=rt;case rt:for(;St=a.distcode[_&(1<>>24,mt=St>>>16&255,wt=65535&St,!(gt<=u);){if(0===l)break t;l--,_+=n[s++]<>pt)],gt=St>>>24,mt=St>>>16&255,wt=65535&St,!(pt+gt<=u);){if(0===l)break t;l--,_+=n[s++]<>>=pt,u-=pt,a.back+=pt}if(_>>>=gt,u-=gt,a.back+=gt,64&mt){t.msg="invalid distance code",a.mode=_t;break}a.offset=wt,a.extra=15&mt,a.mode=st;case st:if(a.extra){for(Bt=a.extra;u>>=a.extra,u-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){t.msg="invalid distance too far back",a.mode=_t;break}a.mode=ot;case ot:if(0===h)break t;if(g=b-h,a.offset>g){if(g=a.offset-g,g>a.whave&&a.sane){t.msg="invalid distance too far back",a.mode=_t;break}g>a.wnext?(g-=a.wnext,m=a.wsize-g):m=a.wnext-g,g>a.length&&(g=a.length),bt=a.window}else bt=r,m=o-a.offset,g=a.length;g>h&&(g=h),h-=g,a.length-=g;do r[o++]=bt[m++];while(--g);0===a.length&&(a.mode=it);break;case lt:if(0===h)break t;r[o++]=a.length,h--,a.mode=it;break;case ht:if(a.wrap){for(;u<32;){if(0===l)break t;l--,_|=n[s++]<=1&&0===j[N];N--);if(O>N&&(O=N),0===N)return b[g++]=20971520,b[g++]=20971520,w.bits=1,0;for(C=1;C0&&(t===o||1!==N))return-1;for(K[1]=0,Z=1;Zr||t===h&&T>s)return 1;for(var Y=0;;){Y++,B=Z-I,m[R]z?(S=M[P+m[R]],E=L[H+m[R]]):(S=96,E=0),p=1<>I)+v]=B<<24|S<<16|E|0;while(0!==v);for(p=1<>=1;if(0!==p?(F&=p-1,F+=p):F=0,R++,0===--j[Z]){if(Z===N)break;Z=e[a+m[R]]}if(Z>O&&(F&y)!==k){for(0===I&&(I=O),x+=C,D=Z-I,U=1<r||t===h&&T>s)return 1;k=F&y,b[k]=O<<24|D<<16|x-g|0}}return 0!==F&&(b[x+F]=Z-I<<24|64<<16|0),w.bits=O,0}},{"../utils/common":3}],13:[function(t,e,a){"use strict";e.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],14:[function(t,e,a){"use strict";function i(t){for(var e=t.length;--e>=0;)t[e]=0}function n(t,e,a,i,n){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=i,this.max_length=n,this.has_stree=t&&t.length}function r(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}function s(t){return t<256?lt[t]:lt[256+(t>>>7)]}function o(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function l(t,e,a){t.bi_valid>W-a?(t.bi_buf|=e<>W-t.bi_valid,t.bi_valid+=a-W):(t.bi_buf|=e<>>=1,a<<=1;while(--e>0);return a>>>1}function f(t){16===t.bi_valid?(o(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}function _(t,e){var a,i,n,r,s,o,l=e.dyn_tree,h=e.max_code,d=e.stat_desc.static_tree,f=e.stat_desc.has_stree,_=e.stat_desc.extra_bits,u=e.stat_desc.extra_base,c=e.stat_desc.max_length,b=0;for(r=0;r<=X;r++)t.bl_count[r]=0;for(l[2*t.heap[t.heap_max]+1]=0,a=t.heap_max+1;ac&&(r=c,b++),l[2*i+1]=r,i>h||(t.bl_count[r]++,s=0,i>=u&&(s=_[i-u]),o=l[2*i],t.opt_len+=o*(r+s),f&&(t.static_len+=o*(d[2*i+1]+s)));if(0!==b){do{for(r=c-1;0===t.bl_count[r];)r--;t.bl_count[r]--,t.bl_count[r+1]+=2,t.bl_count[c]--,b-=2}while(b>0);for(r=c;0!==r;r--)for(i=t.bl_count[r];0!==i;)n=t.heap[--a],n>h||(l[2*n+1]!==r&&(t.opt_len+=(r-l[2*n+1])*l[2*n],l[2*n+1]=r),i--)}}function u(t,e,a){var i,n,r=new Array(X+1),s=0;for(i=1;i<=X;i++)r[i]=s=s+a[i-1]<<1;for(n=0;n<=e;n++){var o=t[2*n+1];0!==o&&(t[2*n]=d(r[o]++,o))}}function c(){var t,e,a,i,r,s=new Array(X+1);for(a=0,i=0;i>=7;i8?o(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0}function m(t,e,a,i){g(t),i&&(o(t,a),o(t,~a)),N.arraySet(t.pending_buf,t.window,e,a,t.pending),t.pending+=a}function w(t,e,a,i){var n=2*e,r=2*a;return t[n]>1;a>=1;a--)p(t,r,a);n=l;do a=t.heap[1],t.heap[1]=t.heap[t.heap_len--],p(t,r,1),i=t.heap[1],t.heap[--t.heap_max]=a,t.heap[--t.heap_max]=i,r[2*n]=r[2*a]+r[2*i],t.depth[n]=(t.depth[a]>=t.depth[i]?t.depth[a]:t.depth[i])+1,r[2*a+1]=r[2*i+1]=n,t.heap[1]=n++,p(t,r,1);while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],_(t,e),u(r,h,t.bl_count)}function y(t,e,a){var i,n,r=-1,s=e[1],o=0,l=7,h=4;for(0===s&&(l=138,h=3),e[2*(a+1)+1]=65535,i=0;i<=a;i++)n=s,s=e[2*(i+1)+1],++o=3&&0===t.bl_tree[2*nt[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e}function B(t,e,a,i){var n;for(l(t,e-257,5),l(t,a-1,5),l(t,i-4,4),n=0;n>>=1)if(1&a&&0!==t.dyn_ltree[2*e])return D;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return I;for(e=32;e0?(t.strm.data_type===U&&(t.strm.data_type=S(t)),k(t,t.l_desc),k(t,t.d_desc),s=z(t),n=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=n&&(n=r)):n=r=a+5,a+4<=n&&e!==-1?A(t,e,a,i):t.strategy===O||r===n?(l(t,(F<<1)+(i?1:0),3),v(t,st,ot)):(l(t,(L<<1)+(i?1:0),3),B(t,t.l_desc.max_code+1,t.d_desc.max_code+1,s+1),v(t,t.dyn_ltree,t.dyn_dtree)),b(t),i&&g(t)}function C(t,e,a){return t.pending_buf[t.d_buf+2*t.last_lit]=e>>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&a,t.last_lit++,0===e?t.dyn_ltree[2*a]++:(t.matches++,e--,t.dyn_ltree[2*(ht[a]+M+1)]++,t.dyn_dtree[2*s(e)]++),t.last_lit===t.lit_bufsize-1}var N=t("../utils/common"),O=4,D=0,I=1,U=2,T=0,F=1,L=2,H=3,j=258,K=29,M=256,P=M+1+K,Y=30,q=19,G=2*P+1,X=15,W=16,J=7,Q=256,V=16,$=17,tt=18,et=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],at=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],it=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],nt=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],rt=512,st=new Array(2*(P+2));i(st);var ot=new Array(2*Y);i(ot);var lt=new Array(rt);i(lt);var ht=new Array(j-H+1);i(ht);var dt=new Array(K);i(dt);var ft=new Array(Y);i(ft);var _t,ut,ct,bt=!1;a._tr_init=E,a._tr_stored_block=A,a._tr_flush_block=R,a._tr_tally=C,a._tr_align=Z},{"../utils/common":3}],15:[function(t,e,a){"use strict";function i(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}e.exports=i},{}],"/":[function(t,e,a){"use strict";var i=t("./lib/utils/common").assign,n=t("./lib/deflate"),r=t("./lib/inflate"),s=t("./lib/zlib/constants"),o={};i(o,n,r,s),e.exports=o},{"./lib/deflate":1,"./lib/inflate":2,"./lib/utils/common":3,"./lib/zlib/constants":6}]},{},[])("/")}); diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/checkmark.gif b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/checkmark.gif deleted file mode 100644 index d79444daa99b23d12ca3fd0af8b66c5042bed1f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1253 zcmZ?wbhEHb6lD-)I3mxGlao_ZQ`6Pe)z;Sb?c2AaqM~2FejPY)VAiZz(b3V9Cr^I) z@?~RVWy6LI zWo2d0o;};QZ(mwk+W-Im75{Tb_y#DrB$gxsX&d{Bg2d$P)DnfH)bz|eTc!8A_bVx6 zrr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9IEy7UZUuBq~(o=HwMyRoE&e zrsOB3S^?Q0VSOb9u#%E&TO~)3gaXJ;=lr5n1yel(-DCqZ0|hffJwsy?b8~YY1tSAP z1APM{eM2K%Lvt%*BP#;~1t?Gg+E$d3W)Uo-)&qM-FF8L~zap_f-%!s0@{(ZdJ#@7=v~`_|1H*RNf@a{1E53+K6ZM9qnzcEzM1h4fS=kHPuy>73F26CB;RB1^IcoIoVm68R==MDalER3Gs2U zG0{A;Cd`0selzKHgrQ9`0_gF3wJl4)%7oHr7^_7UpKACdNj<45g>5qphW> zp{}N?qO7E-ATK8?BP}H=r8~Q zs5D|=^?0D(my$UzW7WEx)kV|1gBp~(-Iea%f5Is+^Wnq5J4Vg(6In0lh%@pxA9z*4 jHl;~jpit4~0k4}|hnUnJuZM?(18;xWQKQGr$Y2csh?(E! diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/clear.gif b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/clear.gif deleted file mode 100644 index c6acf0a43455a3272d4b584de82d7583cbb401d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1114 zcmZ?wbhEHbIIg#cFVINM%8) zeo$(0erZv1Dp0vH$f^P>=c3falKi5O{QMkPCP(UIa|kjQ{`r{qy_R&mZ5vef{$J z)5j0*-@SeF`qj%9&!0Vg^7zri2lwyYy>t84%^TORUA=Po(!~qs&z(JU`qar2$B!L7 za`@1}1N-;w-Lrew&K=vgZQZhY)5ZeMTG_VdAT{+S(zE>X{jm6 zNr?&Zaj`McQIQehVWAmo_rKzE=rmCW>q^KY-Co3Z@B`F~;CMqH&FX#K^#)_>%=l qGBW5e00F4XU|xM5wf*XucTS2hSOWl)*@>wD diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/close.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/close.png deleted file mode 100644 index d319efb6e1ccda38d7228deb645634808f3b6992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4|3?y&GPYDK6YymzYuGO>l{{R1f!=%%iKoO>r zAiv=M3{STkcma8`o-U3d9J0wbt{+f1eBi>x0|grz9~#bJ+0>}?TZ*CdCdVq1vPfm1 OLIzJ)KbLh*2~7Z!bS2#Y diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/collapsed.gif b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/collapsed.gif deleted file mode 100644 index ce977743d5a8711558dbb0ded3efbedd6027187e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1113 zcmZ?wbhEHbIIg#cFVINM%8) zeo$(0erZv1Dp0vH$f^P>=c3falKi5O{QMkPC=_lU5s3fT+PhfOx+9(T}_?LTr4e|Ow0@oOw5dp zot$8LUGkGlb5rw5V0u#!dd+d_1to>t0-(( z>*tT}-@bnN{ORL|_wU}mdHw3;i|5atK6(7;;e-44?%uh5>*kH?*REcZ;0$^0LyB;-bQW{Jh+p z?5xa;^t9BJ|cQ;oTXD3GodplbjYb#3& zb2C#DVh+i z#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaozEwNPs zx)kDt+yc0-^T+pZU%!0*^zp;{cW>Xke)aOj^Jh<=Jbv`>!To!8@7%t1^TzdSSFc>Ybn(LZ zb7#+-K6UcM@nc7i96ogL!2W%E_w3%abI0~=Teoc9v~k1wb!*qGUbS+?@?}exEMBy5 z!Tfo1=ggipbH?;(Q>RRxG;umQ)5GYU2RQuRb@qaS!qdeQDH%T zUT#iyR%S+eT53viQer}UTx?8qRAfYWSZGLaP+)++pRbR%m#2rjo2!enlcR&Zovn?v zm8FHbnW>4f5im>X>FQ`}X=f4NtU=qlmzFem6RtIr7}3CgaTBb24NWo|M2VQ19~Sf77gE4eLJ0p1A1oCo1_>Me_*O|QcbdU&z~Iop$e`ONuG7tV+Y4wngQu&X%Q~loCIA_z BL?-|M diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/edit.gif b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/edit.gif deleted file mode 100644 index 3c07607352ff29f679e2e6b3383857f5f5b5cb03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66 zcmZ?wbhEHbIIg#cFVINM%8) zeo$(0erZv1Dp0vH$f^P>=c3falKi5O{QMkPC+YK+|11lT-?muOx+9(T}_?LTr4e|Ow0@oOw5dp zot$8LUGkGlb5rw5V0u&FdR+~0>IEf*+ybD@E~!PCWvMA{Mftf3U@u!`;&zJ*PV=C8 zQ*gS)#TBPseV}9XK@p1-(J&!k>H#s~$ri|gC;ZerU}`S{CTqt3|Nj2@{p;tC@87({PcxqRv3h4bgmo;iK$#u35cm<%;FYmM&SmXyJnS^XAT(J!|HS z>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3jP$hB zl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|L7iT9&2YWkP8*3{|3v)A56JsM_ zmeSMJ(bm$`P*+n`QC3n^ke8E{k(QE_5El~_5f%~@;OFDz;pXDxU}s}xVP;}vU{L(Y m0wft3bQpjDRBA9V3HJ1_JbjlzIiyJM<(k`jeuptISOWmXqlmfy diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/grid.gif b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/grid.gif deleted file mode 100644 index f4e7063e878d67961b48bea089c180c9b838dbdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56 zcmZ?wbhEHb&_IsgCw diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/handle-fixed.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/handle-fixed.png deleted file mode 100644 index b4b600b1a50dd62b02fe0a159172df0baa602269..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1293 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 diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/handle-secondary.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/handle-secondary.png deleted file mode 100644 index b4a30900a9ceebc96313e919c1b2f3080e0485e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1270 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|80+w{G(j&jGsVil$G&eP`1g19yq1ObbUQklVEdbi=l3J8mmYU*Ll%J~r_OewbZnqfXG!Lpb z1-Dy_aO%|uIz}H9u}BdO69T3l5EGtkfgE_kPt60S_99@i{(9KTj)8$O%hSa%q~g|^ zkh6Zx4g&XFbzd~jFo}C}uv@%IJa67t%~k#nlwVkXk=?Um{ey!hb`JU~y`2}e=P6V$ zF!|noTa$87GeNjsZKjU#=eNfP)SQOQlNwAXl6eA5xWowicFewR&Z z15-|a@zq`Yyr@;N->N_=|HF9=>jIhQ8mBj1KOeI4=#!wc`L1s}Cc4X7T${MY-G2co$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|80+w{G(j&jGsVil+1S<9#nsZx+|<<2(ACt!(#+V!$i&6j(bdG+ z)!723*Cju>G&eP`1g19yq1O?oUQklVEdbi=l3J8mmYU*Ll%J~r_OewbZnv1@G!Lpb z1-Dx)aO%|uIz}H9u}BdO69T3l5EGtkfgE_kPt60S_99@i?)bxy%D})_<>}%WQgLfd z$U(2e4gzP_-7=Y8p;5Jgoxdxf>eSiAFTykaHvZylnt!2RV2#)xM*g5*+&eptR`o2{ z5~9fIyE5{5tM8m66#=_G%$PfK`{bK5Z*nZI>1;X@#QL-O%vX^~Z>PGQ`L;^Oqe>t` zbw&#pw~@L_ODo?rHXptZ4B9NKZ|3CfSa(~l|9I^E@9z~B9_HKs?BpZggb3vubN$lo zIhxpAU%xaBYfhZwp>yLQyZ>j^{ce*S7hk-=cevn(oW|8%e?pEORbnmy%JrwJsGL6X z=4+MuwA8nA?;dk2pOVk?#q8!o^*HbAK2oiGA+Nsvy7qQ2(y)vBl1JQ_gXAyqxnze*bfpZ}*?Iq&IinKGC7}rN(OR zy~{^-O}Oy2=Ekh)sT-$k-~1)~&-?!;r!z1!cNswPK z!&JwbyygG}Uv4($1rsveO?9+Hdg@D3L#zxmXU4~!xxnNBRNCt4;us=vIk)FFU$X&^ z^W?aN;aogyIlup(kJ;4mv1w`4w~4_!uJ4G7{mapsRS^FKcBZ2j8|11OQaNr2M!a%-_Ep|TbKZgy`vcdDE*TyFd)O}j4Yxm^`u`0~ tLWx(y^%Y;O*%Q8*w;;)e{w6_--d;)=l!nE?h%Hfdm3a?MR_VAI~a{|RRSnBbgRo!0eL z)gmr$#uz?weZ~eLyBPVVwS_5c;7!NNaX(Kw9CYj)x0cpL-OuBuv$7xH>VCOq?QdC% z%`M)9*+^vqE~X}o+-)yZqa4@QRoOYd7C6|4(5)PI8dP1cz&r^sO!H#W5*I|cfOwRe zmu2}nltd&7q9h1hhCKa%yrL77;=gvj&-#EWrC zL!hqzAL_azbVv<+7VkfW!`hyY1p|jzh%N1BKLfqKD z8a=#X(-R*@W6O-u;A4+Xd%(u}_mjk3_9QM=R%?ZWgM&_|b9{WbVNOgO6W~w-h+H sK3rLxeEIa+!+GJ^kA^C|d-3brrFF1-?;LW`$s48vN`tCjbBd diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/logo.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/logo.png deleted file mode 100644 index 053a1eb2b18b59b6807b9324ac7186b988ac146b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8999 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 aAb>-yja#QE9sj?-uBa+%!fO>Q!~YM!0BCgp diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/nocolor.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/nocolor.png deleted file mode 100644 index aec4534d6ae7836a8cfb151aa5e11e9b1e2a662e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmaJ=zi!$<9JUgvs!*e5OuO{ts8WVvpY4Ld!ik8_G)OT*fD}fIeSk&mbL^uwOr;&F zZhe40L5GfAGIXxQ6Z8Q(bm=3|GXc_}^d$T4e)_)e_xCPjei{9n>#Si|vQm z_i&&6Px6o3YtC?Fg=krz^r1Rzti`(#3Oo<(|>f*)>WgLqvgRxmNOLs1f7meK}jS^tOn{uUk6 z7QT=7pTcox8e*}9V={>x*0{lO<|@>T2-}oI9YU@*Rcww3CGm)az-Sl1l^3`qiC1XL z(&|A>?ZClxr1Oj~c%G|O6;!TDCM*>twoK_DT9X%yLvm)lT}O-+QxHJLw&P`TXm%9Jlv~ WGY`4>^G~-Qvv*WC8|ce<@9iHn7c$Wtg_MVM-Ns0b>9MSXa@-&W+1-Dli2h z;yBb#L5YRI01sCo0Na&8lQG;GfIH|4y0JVwJX`=K17y${OghM6Jjuc&li>S zrjkcPA+Y~vU!=vM#u9`QqSG}RjjP7Z6<5X3K`$>aqXv^nBM~&U4kM&m8m4xbR)7(; zOr=l~3LFEBiqa@Nf#6WdNI#{3DraOd_2*+E4~(vrD(Rpr!L=D2mRY)kFyL zCEouOR*Q5>gdT#Z@dTBOEL^mM(UlV7sSqiFt3)^+KYfb9u{eRNV{s+G3uOaBsZ4oLuR zaajV2V8k?6{)Ov4E7#ZxsFL&yBPvBABKKF}C@_^Wq?kPxw^{W*bLF$g!kU#!Cxf9I z3;VA^PcM<(W1P;kEosa&K7x_mt|HsIacEZ#`L;v|U_X(zeL&n4vtz4`Pq~!#7)`2$rocB4W1xM)eeovh=b?jdGp2c-;0Rts=X(^nymrieYkk>T0 zFk^Z&8qCq7v$WI+y&XR`awfp7r-?y<&>iJZwAOpzg2vW2Cq3-P{-E zE(_|qEAu{}^_^wa^A2t?(X;~TO*OnUrT^R)3zAc>Y+86x2*1TFFhix4XEX3q%?bPd zt>3PUtlS77U03Z#{pxNqtv{SN2o|+ib?8mFiSd0_JI;4s@dc`%Jb9ukjeOnH)051w zIaAFZ>aryU5~IdG7U;02G_ZEvk(;}?s;ungqRdmLmTuF#cr95M>MyzR z-5YDJW35c@X8-l5oT<=X>KHs(2j!$66NmF%@&dKphMoD3^85IisT2Esswyg0-S3)X z?YJsnNz!Hg!HNDwixxR$nP@{C|IDw!(x}@no(>BO+h}%V`Qmnkz)w~BeM9l?5nC)t z61vSjGcfIgkEiGEiT%4u_s?&>w*6}1=GC=+~BF3WR%p7CC1Yh9@K?#l5&U5D^~U zrB5-1J2X~~i~Td* h3zpb?)v%{{YJg#lipp diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/round-drop.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/round-drop.png deleted file mode 100644 index b5e2fb603c745f98849d48b31b96651240e9ba27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1216 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L-^Aq1JP;qO z-q+X4Gq1QLF)umQ)5TT^Xo6m5W{Q=og`u07v8$=6fr+c3p{t3bp|h*2iHU)Ug`2sB znTsV%uSMv>2~2MaLa!N4y`ZF!TL84#CABECEH%ZgC_h&L>}9J=+-@<(X&zK> z3U0TU;MA)Rbc{YIVv!;mCIn19ASOK70y*%6pPC0u?M1+3{iy2s9tH+R6Hgb%kcwML zfByfsXSQV!W}eHy-E(lqKW07CTMln{j!bh{!+zvbz{hrn8qSV>=8tg-`?`ET|94;v z>E6J=s^G`)C_^FapwfEQqk;}K>>bmYJ~AoPHC%VkIKbG^-FTz@!~{mmC2}3TjXT6U z_yvUB6}+Q7Hn2$kaQJE^u*rk*m2fuKqq|aBZA^CELMOg(n$1^zu*pMO>f;rrivh-l zIz`7O?mEG$1!8Vm;%K+^NZLd>UY$#a(P%W*9oe39(OGK7e}UPq(=!q-s^*Bv zE^l-_zADR=t9Ukp+6WtJY8 zv^c<6PGD8P!_+X|nRd6Cu2whPkov}O#Wnq7$kP{s{oA$DTTHiS+_gxQDSKbP0l+XkK`s(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-8c9S!RCwBK(XmUFaTJH~&%IY^YmiWohW-GDh6Ka)T0{{zIB3JAK^k-thqF1j z9CvNBDF~OEn%=cA2SE^BqB&3yoUV}fZTY=&!TZ1&&hVUb_?}i>*CL{g1-!>IT;VIe zWab}3bo%}N7&h?rYudU#b;)z5CX`?nF=c!9(LUT00LU@B|e9z2*lFB}o zu@@1WI4Xl)VhcC8XePAEALg-#8JuApPtd{xoZv%d{%X~A4I<)kiSlXrLsjnH!4%H1 ydM7kQ#5e|-d0YA=>|zqf_k>YI#0s|Y`Tqd(7-D7{ea^@L0000x^0MUBX6?y}GY`w9o6}R5rWl5q zE-on*dY+}<<;e-UcOI2K(&HjgYovtzSKB4R3gKPAMI8$EM)n2dH?RM#2`#!TnA16qqRPFVc zZy%R diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/transparent.gif b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/transparent.gif deleted file mode 100644 index 76040f2b09d80470ad0536404ead54c3dba51d8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90 zcmZ?wbhEHbG+;1bXkcLY|NlP&1B2pE7Dgb&paUX6G7L;jF-siv0egDVL!_|Id(Z?5>3=Gx)k9{Vl diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/triangle-down.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/triangle-down.png deleted file mode 100644 index d03b98fc5fe41063eabf961062e81775c54968f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1104 zcmaJ=O-K|`9G_Cl#Lr8iL`|cHg}XDe?z+zCrrXS#ON}h+LR%ebcIN30?tD1&Y*+EH zZ5}ovFf%iXis~342~h-D;=!n>AR;za_VLuNiz&%Yq(qvgm73x8Wd9w&8p2Q@W7Hx#ej;g;kKd}(+8oCK#{Jbpc-qk znzdRcR4_6n8YJzc?38jqLHIvZRoBoK41@J}|0!%mh73T4fu#?c5^7v;t?kNSITMIb zHzT^9$W<{E*P(93bpz*mJh&iAie}r(ctK!;ngvBo0zuwKAO)wQ$gHP@!#=y%FXbcJICd9X;1|k%yH#)u0Jo=9tG7vo_Sy@CxP5)>MFjRGOOf| z#hX`el`H3ur6n(yM8S}DWB+P&?g~wheOwz`WULK7(9pD-Xsnk8o;%Q!m=E&)Na{mO zj{dlIYDaoY)=K|uKQ~abaC1+`)d2VEcEPvCtqpx_Sk&H diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/triangle-left.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/triangle-left.png deleted file mode 100644 index 44b842551164fa8e0d87d5b08ffa0e4e0ed7c3fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1123 zcmeAS@N?(olHy`uVBq!ia0vp^d_XM4!3HGT`Ez4{lw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6H#24v4 zq}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL` zNmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTcwn`Gtf;oFf&jvGt@IQ zHZeCh*HJJsFf`CNFw!?P(ls=ndS0-B(gnVDi`?&fIjXm0FiX=dhTXy|HcVQFgOY;Iy;XklPt z>Edhx)9aF-T$-DjR|37L*#bH6grAxROzlO$WUU*&I~|xM zu6w#ThE&{|a^)iXp#YKNA47#V+G|#Iy;$ioG3b`}e_wywslA%rI<`yxt-h!HOZMH_ z(z|!7&ppf*mM?#sm+f-ZTId|tQ(whfi)80|JYahp=*{%<6W=SFhlg4l{|Pq*PkDLz z@gYvDofG)`YF6;^1$N%r_dnq<<0_{UZMAwviTrm1+kcw~yjirIC3D7)ck}r7U680< zGU1ux(Py!$Hjk64%b9mwRk3HA)&irH&(b!se s=FYYlS>uykYJN+#Us=A={l#g(@ZzX4`}S3Z8$j9K)78&qol`;+0HxQ06aWAK diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/triangle-right.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/triangle-right.png deleted file mode 100644 index 98656281fcbb894b38a90c55d0b3f35eb98268d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1103 zcmaJ=O-K|`9G?&@qz@zs6RKgXNNRUx)}7s*X*bCk&8=q9buF!g#+j!(>dc#Fp6%$Z zBCJD%6rBV?E5n1-p+h7|Ntibe8WnX3!5~nIf(ZI}WA56aZQ#v&|Htq5`+vTx^@$^! zipq)zg4h(VlahGfj91x)Lj3RFVw}O-c2v`h8eu!iC^jGtYp@NFaYN|U8Q&DPq5q*S}=3tKTNjgTeK zbS9JWXDa>B?x0zo=RJ);z=sh&r`JS^>ocA5tbzm_)z&SfLzDCrl{VOeVib<_PYQ;W zlQo^yGU0;Ju42)wpYc-40%iICP{YWf9h3xX@%~fTN%dNQP67w^*eY&Zd%5Sz5=0v) z2-+zKyR%iSPeTNqG_**ukt1bA)lJV{!OOA`HyxyyDu_!l3M=?^T@$#7D2DkOjt_-u zS+<6Y@LW&~2N^cP1bImeX1NkndkkQrELU6OhVpW~Q7|m*Spv3x9%!{TG{}{d1wDT( zm3j46xmx~Mf_b?#4uSU-4I!Qm${6_*aD+&6=B zPm9(yl=OdM7hb=pzI~-+;Q2&x@xXBK#Lx*$gxUrnRHkq C0&@-k diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/triangle-up.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/images/triangle-up.png deleted file mode 100644 index 6d936767357bd402adab9725610d4e8e351eb45b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1086 zcmaJ=O-K|`93MY2F%1im5`$q(Q*h^F-4AzgwQa`Dg+|tO!%YwE?95XqosVXo?dVC( z%mSgJq&kE_k*Dwjy>tk|!%AK{CIlTkL=YZ}2a6oKzT;82j*3o0Q*aZWb@?j>oL zMEhvm$B;~u$M5$y;%=IuDcVgjZWrTco7^l-jxD1OkqR+wDRKmo=(E(ROK8O;&*imSidhRCEn@6vdQ20)qsKbT0+fIFQw> z{W76~QMPDM3`sjFWr2e5f2gV+pe+~!hw=VX*ou!DfQkW2A2B7=xc(Z)mBDf*5TS0y zb$vKn#ps|8b!$*JaIV{n3!dmdoqXhzc~A<;sWLa89l>3aWuT^T1SY06A>xD!!XCtK^P_ z%c-}|m2=0!=j2i-7|LnvUyaUQq3Lms2V;wjgTV(HnsyV7b?e&pZ}cRVBYY@sZ>8kK z_h%FQ=e+f+<3EZUo<7bj$~EOX`KfcgSGJF?PL<6BChTJkbIkqZ#^|Beq~nct7m%37Yjcvm&aUpCx1>onOc8WG?J)Ts+_1G zi4P}FC8xj65^`7mk-7Q4x$*bJz4hu6S7>dxwfxodzK5lc=BH~j$+}H{4gt(7m%i;lE+@~C;tGMyuN29CCjLf-$lrKb|3bD4SS{lcTEwB@Lu%GS6$o;UQH4clSnDev;WR}J(Y9X3 zWo7*++-%L@M(ePc{P=pP(?8{H6;>T z6{h$eS3%~g16|zXS|?m}AU7Tb$0ME<=-X@1n)8tZIw?!`;8-#P^}1YZa4gw@T$TjG z#*O`}(Y-4&J@K(Ww#4WUK6J^n`(&&$k6+v+PvU%GL07l7wsv-Qn$2dtUOzlMY_(dA zMx)(s^Pj%Qm=RpemxviJ>f6J&cjBj%Q)cz(KyTeVM}gtt{acNn&6TJ6?{~@Fy-n)u z_S)AEQdq6L|F!RZ-n@KCJ~;jS-jyHQ($VXyd(@L>r$StUyF`b|sd?p9=Kg~}W#Cav diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/index.html b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/index.html deleted file mode 100644 index eeed4286..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/index.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - Grapheditor - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Actions.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Actions.js deleted file mode 100644 index e7f7bef3..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Actions.js +++ /dev/null @@ -1,1413 +0,0 @@ -/** - * Copyright (c) 2006-2012, JGraph Ltd - */ -/** - * Constructs the actions object for the given UI. - */ -function Actions(editorUi) -{ - this.editorUi = editorUi; - this.actions = new Object(); - this.init(); -}; - -/** - * Adds the default actions. - */ -Actions.prototype.init = function() -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - var isGraphEnabled = function() - { - return Action.prototype.isEnabled.apply(this, arguments) && graph.isEnabled(); - }; - - // File actions - this.addAction('new...', function() { graph.openLink(ui.getUrl()); }); - this.addAction('open...', function() - { - window.openNew = true; - window.openKey = 'open'; - - ui.openFile(); - }); - this.addAction('import...', function() - { - window.openNew = false; - window.openKey = 'import'; - - // Closes dialog after open - window.openFile = new OpenFile(mxUtils.bind(this, function() - { - ui.hideDialog(); - })); - - window.openFile.setConsumer(mxUtils.bind(this, function(xml, filename) - { - try - { - var doc = mxUtils.parseXml(xml); - editor.graph.setSelectionCells(editor.graph.importGraphModel(doc.documentElement)); - } - catch (e) - { - mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message); - } - })); - - // Removes openFile if dialog is closed - ui.showDialog(new OpenDialog(this).container, 320, 220, true, true, function() - { - window.openFile = null; - }); - }).isEnabled = isGraphEnabled; - this.addAction('save', function() { ui.saveFile(false); }, null, null, Editor.ctrlKey + '+S').isEnabled = isGraphEnabled; - this.addAction('saveAs...', function() { ui.saveFile(true); }, null, null, Editor.ctrlKey + '+Shift+S').isEnabled = isGraphEnabled; - this.addAction('export...', function() { ui.showDialog(new ExportDialog(ui).container, 300, 230, true, true); }); - this.addAction('editDiagram...', function() - { - var dlg = new EditDiagramDialog(ui); - ui.showDialog(dlg.container, 620, 420, true, false); - dlg.init(); - }); - this.addAction('pageSetup...', function() { ui.showDialog(new PageSetupDialog(ui).container, 320, 220, true, true); }).isEnabled = isGraphEnabled; - this.addAction('print...', function() { ui.showDialog(new PrintDialog(ui).container, 300, 180, true, true); }, null, 'sprite-print', Editor.ctrlKey + '+P'); - this.addAction('preview', function() { mxUtils.show(graph, null, 10, 10); }); - - // Edit actions - this.addAction('undo', function() { ui.undo(); }, null, 'sprite-undo', Editor.ctrlKey + '+Z'); - this.addAction('redo', function() { ui.redo(); }, null, 'sprite-redo', (!mxClient.IS_WIN) ? Editor.ctrlKey + '+Shift+Z' : Editor.ctrlKey + '+Y'); - this.addAction('cut', function() { mxClipboard.cut(graph); }, null, 'sprite-cut', Editor.ctrlKey + '+X'); - this.addAction('copy', function() { mxClipboard.copy(graph); }, null, 'sprite-copy', Editor.ctrlKey + '+C'); - this.addAction('paste', function() - { - if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) - { - mxClipboard.paste(graph); - } - }, false, 'sprite-paste', Editor.ctrlKey + '+V'); - this.addAction('pasteHere', function(evt) - { - if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) - { - graph.getModel().beginUpdate(); - try - { - var cells = mxClipboard.paste(graph); - - if (cells != null) - { - var includeEdges = true; - - for (var i = 0; i < cells.length && includeEdges; i++) - { - includeEdges = includeEdges && graph.model.isEdge(cells[i]); - } - - var t = graph.view.translate; - var s = graph.view.scale; - var dx = t.x; - var dy = t.y; - var bb = null; - - if (cells.length == 1 && includeEdges) - { - var geo = graph.getCellGeometry(cells[0]); - - if (geo != null) - { - bb = geo.getTerminalPoint(true); - } - } - - bb = (bb != null) ? bb : graph.getBoundingBoxFromGeometry(cells, includeEdges); - - if (bb != null) - { - var x = Math.round(graph.snap(graph.popupMenuHandler.triggerX / s - dx)); - var y = Math.round(graph.snap(graph.popupMenuHandler.triggerY / s - dy)); - - graph.cellsMoved(cells, x - bb.x, y - bb.y); - } - } - } - finally - { - graph.getModel().endUpdate(); - } - } - }); - - this.addAction('copySize', function(evt) - { - var cell = graph.getSelectionCell(); - - if (graph.isEnabled() && cell != null && graph.getModel().isVertex(cell)) - { - var geo = graph.getCellGeometry(cell); - - if (geo != null) - { - ui.copiedSize = new mxRectangle(geo.x, geo.y, geo.width, geo.height); - } - } - }, null, null, 'Alt+Shit+X'); - - this.addAction('pasteSize', function(evt) - { - if (graph.isEnabled() && !graph.isSelectionEmpty() && ui.copiedSize != null) - { - graph.getModel().beginUpdate(); - - try - { - var cells = graph.getSelectionCells(); - - for (var i = 0; i < cells.length; i++) - { - if (graph.getModel().isVertex(cells[i])) - { - var geo = graph.getCellGeometry(cells[i]); - - if (geo != null) - { - geo = geo.clone(); - geo.width = ui.copiedSize.width; - geo.height = ui.copiedSize.height; - - graph.getModel().setGeometry(cells[i], geo); - } - } - } - } - finally - { - graph.getModel().endUpdate(); - } - } - }, null, null, 'Alt+Shit+V'); - - - function deleteCells(includeEdges) - { - // Cancels interactive operations - graph.escape(); - var cells = graph.getDeletableCells(graph.getSelectionCells()); - - if (cells != null && cells.length > 0) - { - var parents = graph.model.getParents(cells); - graph.removeCells(cells, includeEdges); - - // Selects parents for easier editing of groups - if (parents != null) - { - var select = []; - - for (var i = 0; i < parents.length; i++) - { - if (graph.model.contains(parents[i]) && - (graph.model.isVertex(parents[i]) || - graph.model.isEdge(parents[i]))) - { - select.push(parents[i]); - } - } - - graph.setSelectionCells(select); - } - } - }; - - this.addAction('delete', function(evt) - { - deleteCells(evt != null && mxEvent.isShiftDown(evt)); - }, null, null, 'Delete'); - this.addAction('deleteAll', function() - { - deleteCells(true); - }, null, null, Editor.ctrlKey + '+Delete'); - this.addAction('duplicate', function() - { - graph.setSelectionCells(graph.duplicateCells()); - }, null, null, Editor.ctrlKey + '+D'); - this.put('turn', new Action(mxResources.get('turn') + ' / ' + mxResources.get('reverse'), function() - { - graph.turnShapes(graph.getSelectionCells()); - }, null, null, Editor.ctrlKey + '+R')); - this.addAction('selectVertices', function() { graph.selectVertices(); }, null, null, Editor.ctrlKey + '+Shift+I'); - this.addAction('selectEdges', function() { graph.selectEdges(); }, null, null, Editor.ctrlKey + '+Shift+E'); - this.addAction('selectAll', function() { graph.selectAll(null, true); }, null, null, Editor.ctrlKey + '+A'); - this.addAction('selectNone', function() { graph.clearSelection(); }, null, null, Editor.ctrlKey + '+Shift+A'); - this.addAction('lockUnlock', function() - { - if (!graph.isSelectionEmpty()) - { - graph.getModel().beginUpdate(); - try - { - var defaultValue = graph.isCellMovable(graph.getSelectionCell()) ? 1 : 0; - graph.toggleCellStyles(mxConstants.STYLE_MOVABLE, defaultValue); - graph.toggleCellStyles(mxConstants.STYLE_RESIZABLE, defaultValue); - graph.toggleCellStyles(mxConstants.STYLE_ROTATABLE, defaultValue); - graph.toggleCellStyles(mxConstants.STYLE_DELETABLE, defaultValue); - graph.toggleCellStyles(mxConstants.STYLE_EDITABLE, defaultValue); - graph.toggleCellStyles('connectable', defaultValue); - } - finally - { - graph.getModel().endUpdate(); - } - } - }, null, null, Editor.ctrlKey + '+L'); - - // Navigation actions - this.addAction('home', function() { graph.home(); }, null, null, 'Home'); - this.addAction('exitGroup', function() { graph.exitGroup(); }, null, null, Editor.ctrlKey + '+Shift+Home'); - this.addAction('enterGroup', function() { graph.enterGroup(); }, null, null, Editor.ctrlKey + '+Shift+End'); - this.addAction('collapse', function() { graph.foldCells(true); }, null, null, Editor.ctrlKey + '+Home'); - this.addAction('expand', function() { graph.foldCells(false); }, null, null, Editor.ctrlKey + '+End'); - - // Arrange actions - this.addAction('toFront', function() { graph.orderCells(false); }, null, null, Editor.ctrlKey + '+Shift+F'); - this.addAction('toBack', function() { graph.orderCells(true); }, null, null, Editor.ctrlKey + '+Shift+B'); - this.addAction('group', function() - { - if (graph.getSelectionCount() == 1) - { - graph.setCellStyles('container', '1'); - } - else - { - graph.setSelectionCell(graph.groupCells(null, 0)); - } - }, null, null, Editor.ctrlKey + '+G'); - this.addAction('ungroup', function() - { - if (graph.getSelectionCount() == 1 && graph.getModel().getChildCount(graph.getSelectionCell()) == 0) - { - graph.setCellStyles('container', '0'); - } - else - { - graph.setSelectionCells(graph.ungroupCells()); - } - }, null, null, Editor.ctrlKey + '+Shift+U'); - this.addAction('removeFromGroup', function() { graph.removeCellsFromParent(); }); - // Adds action - this.addAction('edit', function() - { - if (graph.isEnabled()) - { - graph.startEditingAtCell(); - } - }, null, null, 'F2/Enter'); - this.addAction('editData...', function() - { - var cell = graph.getSelectionCell() || graph.getModel().getRoot(); - ui.showDataDialog(cell); - }, null, null, Editor.ctrlKey + '+M'); - this.addAction('editTooltip...', function() - { - var graph = ui.editor.graph; - - if (graph.isEnabled() && !graph.isSelectionEmpty()) - { - var cell = graph.getSelectionCell(); - var tooltip = ''; - - if (mxUtils.isNode(cell.value)) - { - var tmp = cell.value.getAttribute('tooltip'); - - if (tmp != null) - { - tooltip = tmp; - } - } - - var dlg = new TextareaDialog(ui, mxResources.get('editTooltip') + ':', tooltip, function(newValue) - { - graph.setTooltipForCell(cell, newValue); - }); - ui.showDialog(dlg.container, 320, 200, true, true); - dlg.init(); - } - }, null, null, 'Alt+Shift+T'); - this.addAction('openLink', function() - { - var link = graph.getLinkForCell(graph.getSelectionCell()); - - if (link != null) - { - graph.openLink(link); - } - }); - this.addAction('editLink...', function() - { - var graph = ui.editor.graph; - - if (graph.isEnabled() && !graph.isSelectionEmpty()) - { - var cell = graph.getSelectionCell(); - var value = graph.getLinkForCell(cell) || ''; - - ui.showLinkDialog(value, mxResources.get('apply'), function(link) - { - link = mxUtils.trim(link); - graph.setLinkForCell(cell, (link.length > 0) ? link : null); - }); - } - }, null, null, 'Alt+Shift+L'); - this.addAction('insertLink...', function() - { - if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) - { - ui.showLinkDialog('', mxResources.get('insert'), function(link, docs) - { - link = mxUtils.trim(link); - - if (link.length > 0) - { - var icon = null; - var title = graph.getLinkTitle(link); - - if (docs != null && docs.length > 0) - { - icon = docs[0].iconUrl; - title = docs[0].name || docs[0].type; - title = title.charAt(0).toUpperCase() + title.substring(1); - - if (title.length > 30) - { - title = title.substring(0, 30) + '...'; - } - } - - var pt = graph.getFreeInsertPoint(); - var linkCell = new mxCell(title, new mxGeometry(pt.x, pt.y, 100, 40), - 'fontColor=#0000EE;fontStyle=4;rounded=1;overflow=hidden;' + ((icon != null) ? - 'shape=label;imageWidth=16;imageHeight=16;spacingLeft=26;align=left;image=' + icon : - 'spacing=10;')); - linkCell.vertex = true; - - graph.setLinkForCell(linkCell, link); - graph.cellSizeUpdated(linkCell, true); - - graph.getModel().beginUpdate(); - try - { - linkCell = graph.addCell(linkCell); - graph.fireEvent(new mxEventObject('cellsInserted', 'cells', [linkCell])); - } - finally - { - graph.getModel().endUpdate(); - } - - graph.setSelectionCell(linkCell); - graph.scrollCellToVisible(graph.getSelectionCell()); - } - }); - } - }).isEnabled = isGraphEnabled; - this.addAction('link...', mxUtils.bind(this, function() - { - var graph = ui.editor.graph; - - if (graph.isEnabled()) - { - if (graph.cellEditor.isContentEditing()) - { - var elt = graph.getSelectedElement(); - var link = graph.getParentByName(elt, 'A', graph.cellEditor.textarea); - var oldValue = ''; - - // Workaround for FF returning the outermost selected element after double - // click on a DOM hierarchy with a link inside (but not as topmost element) - if (link == null && elt != null && elt.getElementsByTagName != null) - { - // Finds all links in the selected DOM and uses the link - // where the selection text matches its text content - var links = elt.getElementsByTagName('a'); - - for (var i = 0; i < links.length && link == null; i++) - { - if (links[i].textContent == elt.textContent) - { - graph.selectNode(links[i]); - link = links[i]; - } - } - } - - if (link != null && link.nodeName == 'A') - { - oldValue = link.getAttribute('href') || ''; - } - - var selState = graph.cellEditor.saveSelection(); - - ui.showLinkDialog(oldValue, mxResources.get('apply'), mxUtils.bind(this, function(value) - { - graph.cellEditor.restoreSelection(selState); - - if (value != null) - { - graph.insertLink(value); - } - })); - } - else if (graph.isSelectionEmpty()) - { - this.get('insertLink').funct(); - } - else - { - this.get('editLink').funct(); - } - } - })).isEnabled = isGraphEnabled; - this.addAction('autosize', function() - { - var cells = graph.getSelectionCells(); - - if (cells != null) - { - graph.getModel().beginUpdate(); - try - { - for (var i = 0; i < cells.length; i++) - { - var cell = cells[i]; - - if (graph.getModel().getChildCount(cell)) - { - graph.updateGroupBounds([cell], 20); - } - else - { - var state = graph.view.getState(cell); - var geo = graph.getCellGeometry(cell); - - if (graph.getModel().isVertex(cell) && state != null && state.text != null && - geo != null && graph.isWrapping(cell)) - { - geo = geo.clone(); - geo.height = state.text.boundingBox.height / graph.view.scale; - graph.getModel().setGeometry(cell, geo); - } - else - { - graph.updateCellSize(cell); - } - } - } - } - finally - { - graph.getModel().endUpdate(); - } - } - }, null, null, Editor.ctrlKey + '+Shift+Y'); - this.addAction('formattedText', function() - { - var state = graph.getView().getState(graph.getSelectionCell()); - - if (state != null) - { - var value = '1'; - graph.stopEditing(); - - graph.getModel().beginUpdate(); - try - { - if (state.style['html'] == '1') - { - value = null; - var label = graph.convertValueToString(state.cell); - - if (mxUtils.getValue(state.style, 'nl2Br', '1') != '0') - { - // Removes newlines from HTML and converts breaks to newlines - // to match the HTML output in plain text - label = label.replace(/\n/g, '').replace(//g, '\n'); - } - - // Removes HTML tags - var temp = document.createElement('div'); - temp.innerHTML = label; - label = mxUtils.extractTextWithWhitespace(temp.childNodes); - - graph.cellLabelChanged(state.cell, label); - } - else - { - // Converts HTML tags to text - var label = mxUtils.htmlEntities(graph.convertValueToString(state.cell), false); - - if (mxUtils.getValue(state.style, 'nl2Br', '1') != '0') - { - // Converts newlines in plain text to breaks in HTML - // to match the plain text output - label = label.replace(/\n/g, '
'); - } - - graph.cellLabelChanged(state.cell, graph.sanitizeHtml(label)); - } - - graph.setCellStyles('html', value); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['html'], - 'values', [(value != null) ? value : '0'], 'cells', - graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - } - }); - this.addAction('wordWrap', function() - { - var state = graph.getView().getState(graph.getSelectionCell()); - var value = 'wrap'; - - graph.stopEditing(); - - if (state != null && state.style[mxConstants.STYLE_WHITE_SPACE] == 'wrap') - { - value = null; - } - - graph.setCellStyles(mxConstants.STYLE_WHITE_SPACE, value); - }); - this.addAction('rotation', function() - { - var value = '0'; - var state = graph.getView().getState(graph.getSelectionCell()); - - if (state != null) - { - value = state.style[mxConstants.STYLE_ROTATION] || value; - } - - var dlg = new FilenameDialog(ui, value, mxResources.get('apply'), function(newValue) - { - if (newValue != null && newValue.length > 0) - { - graph.setCellStyles(mxConstants.STYLE_ROTATION, newValue); - } - }, mxResources.get('enterValue') + ' (' + mxResources.get('rotation') + ' 0-360)'); - - ui.showDialog(dlg.container, 375, 80, true, true); - dlg.init(); - }); - // View actions - this.addAction('resetView', function() - { - graph.zoomTo(1); - ui.resetScrollbars(); - }, null, null, Editor.ctrlKey + '+H'); - this.addAction('zoomIn', function(evt) { graph.zoomIn(); }, null, null, Editor.ctrlKey + ' + (Numpad) / Alt+Mousewheel'); - this.addAction('zoomOut', function(evt) { graph.zoomOut(); }, null, null, Editor.ctrlKey + ' - (Numpad) / Alt+Mousewheel'); - this.addAction('fitWindow', function() { graph.fit(); }, null, null, Editor.ctrlKey + '+Shift+H'); - this.addAction('fitPage', mxUtils.bind(this, function() - { - if (!graph.pageVisible) - { - this.get('pageView').funct(); - } - - var fmt = graph.pageFormat; - var ps = graph.pageScale; - var cw = graph.container.clientWidth - 10; - var ch = graph.container.clientHeight - 10; - var scale = Math.floor(20 * Math.min(cw / fmt.width / ps, ch / fmt.height / ps)) / 20; - graph.zoomTo(scale); - - if (mxUtils.hasScrollbars(graph.container)) - { - var pad = graph.getPagePadding(); - graph.container.scrollTop = pad.y * graph.view.scale - 1; - graph.container.scrollLeft = Math.min(pad.x * graph.view.scale, (graph.container.scrollWidth - graph.container.clientWidth) / 2) - 1; - } - }), null, null, Editor.ctrlKey + '+J'); - this.addAction('fitTwoPages', mxUtils.bind(this, function() - { - if (!graph.pageVisible) - { - this.get('pageView').funct(); - } - - var fmt = graph.pageFormat; - var ps = graph.pageScale; - var cw = graph.container.clientWidth - 10; - var ch = graph.container.clientHeight - 10; - - var scale = Math.floor(20 * Math.min(cw / (2 * fmt.width) / ps, ch / fmt.height / ps)) / 20; - graph.zoomTo(scale); - - if (mxUtils.hasScrollbars(graph.container)) - { - var pad = graph.getPagePadding(); - graph.container.scrollTop = Math.min(pad.y, (graph.container.scrollHeight - graph.container.clientHeight) / 2); - graph.container.scrollLeft = Math.min(pad.x, (graph.container.scrollWidth - graph.container.clientWidth) / 2); - } - }), null, null, Editor.ctrlKey + '+Shift+J'); - this.addAction('fitPageWidth', mxUtils.bind(this, function() - { - if (!graph.pageVisible) - { - this.get('pageView').funct(); - } - - var fmt = graph.pageFormat; - var ps = graph.pageScale; - var cw = graph.container.clientWidth - 10; - - var scale = Math.floor(20 * cw / fmt.width / ps) / 20; - graph.zoomTo(scale); - - if (mxUtils.hasScrollbars(graph.container)) - { - var pad = graph.getPagePadding(); - graph.container.scrollLeft = Math.min(pad.x * graph.view.scale, - (graph.container.scrollWidth - graph.container.clientWidth) / 2); - } - })); - this.put('customZoom', new Action(mxResources.get('custom') + '...', mxUtils.bind(this, function() - { - var dlg = new FilenameDialog(this.editorUi, parseInt(graph.getView().getScale() * 100), mxResources.get('apply'), mxUtils.bind(this, function(newValue) - { - var val = parseInt(newValue); - - if (!isNaN(val) && val > 0) - { - graph.zoomTo(val / 100); - } - }), mxResources.get('zoom') + ' (%)'); - this.editorUi.showDialog(dlg.container, 300, 80, true, true); - dlg.init(); - }), null, null, Editor.ctrlKey + '+0')); - this.addAction('pageScale...', mxUtils.bind(this, function() - { - var dlg = new FilenameDialog(this.editorUi, parseInt(graph.pageScale * 100), mxResources.get('apply'), mxUtils.bind(this, function(newValue) - { - var val = parseInt(newValue); - - if (!isNaN(val) && val > 0) - { - ui.setPageScale(val / 100); - } - }), mxResources.get('pageScale') + ' (%)'); - this.editorUi.showDialog(dlg.container, 300, 80, true, true); - dlg.init(); - })); - - // Option actions - var action = null; - action = this.addAction('grid', function() - { - graph.setGridEnabled(!graph.isGridEnabled()); - ui.fireEvent(new mxEventObject('gridEnabledChanged')); - }, null, null, Editor.ctrlKey + '+Shift+G'); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.isGridEnabled(); }); - action.setEnabled(false); - - action = this.addAction('guides', function() - { - graph.graphHandler.guidesEnabled = !graph.graphHandler.guidesEnabled; - ui.fireEvent(new mxEventObject('guidesEnabledChanged')); - }); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.graphHandler.guidesEnabled; }); - action.setEnabled(false); - - action = this.addAction('tooltips', function() - { - graph.tooltipHandler.setEnabled(!graph.tooltipHandler.isEnabled()); - }); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.tooltipHandler.isEnabled(); }); - - action = this.addAction('collapseExpand', function() - { - var change = new ChangePageSetup(ui); - change.ignoreColor = true; - change.ignoreImage = true; - change.foldingEnabled = !graph.foldingEnabled; - - graph.model.execute(change); - }); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.foldingEnabled; }); - action.isEnabled = isGraphEnabled; - action = this.addAction('scrollbars', function() - { - ui.setScrollbars(!ui.hasScrollbars()); - }); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.scrollbars; }); - action = this.addAction('pageView', mxUtils.bind(this, function() - { - ui.setPageVisible(!graph.pageVisible); - })); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.pageVisible; }); - action = this.addAction('connectionArrows', function() - { - graph.connectionArrowsEnabled = !graph.connectionArrowsEnabled; - ui.fireEvent(new mxEventObject('connectionArrowsChanged')); - }, null, null, 'Alt+Shift+A'); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.connectionArrowsEnabled; }); - action = this.addAction('connectionPoints', function() - { - graph.setConnectable(!graph.connectionHandler.isEnabled()); - ui.fireEvent(new mxEventObject('connectionPointsChanged')); - }, null, null, 'Alt+Shift+P'); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.connectionHandler.isEnabled(); }); - action = this.addAction('copyConnect', function() - { - graph.connectionHandler.setCreateTarget(!graph.connectionHandler.isCreateTarget()); - ui.fireEvent(new mxEventObject('copyConnectChanged')); - }); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.connectionHandler.isCreateTarget(); }); - action.isEnabled = isGraphEnabled; - action = this.addAction('autosave', function() - { - ui.editor.setAutosave(!ui.editor.autosave); - }); - action.setToggleAction(true); - action.setSelectedCallback(function() { return ui.editor.autosave; }); - action.isEnabled = isGraphEnabled; - action.visible = false; - - // Help actions - this.addAction('help', function() - { - var ext = ''; - - if (mxResources.isLanguageSupported(mxClient.language)) - { - ext = '_' + mxClient.language; - } - - graph.openLink(RESOURCES_PATH + '/help' + ext + '.html'); - }); - - var showingAbout = false; - - this.put('about', new Action(mxResources.get('about') + ' Graph Editor...', function() - { - if (!showingAbout) - { - ui.showDialog(new AboutDialog(ui).container, 320, 280, true, true, function() - { - showingAbout = false; - }); - - showingAbout = true; - } - }, null, null, 'F1')); - - // Font style actions - var toggleFontStyle = mxUtils.bind(this, function(key, style, fn, shortcut) - { - return this.addAction(key, function() - { - if (fn != null && graph.cellEditor.isContentEditing()) - { - fn(); - } - else - { - graph.stopEditing(false); - - graph.getModel().beginUpdate(); - try - { - graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, style); - - // Removes bold and italic tags and CSS styles inside labels - if ((style & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD) - { - graph.updateLabelElements(graph.getSelectionCells(), function(elt) - { - elt.style.fontWeight = null; - - if (elt.nodeName == 'B') - { - graph.replaceElement(elt); - } - }); - } - else if ((style & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC) - { - graph.updateLabelElements(graph.getSelectionCells(), function(elt) - { - elt.style.fontStyle = null; - - if (elt.nodeName == 'I') - { - graph.replaceElement(elt); - } - }); - } - else if ((style & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE) - { - graph.updateLabelElements(graph.getSelectionCells(), function(elt) - { - elt.style.textDecoration = null; - - if (elt.nodeName == 'U') - { - graph.replaceElement(elt); - } - }); - } - } - finally - { - graph.getModel().endUpdate(); - } - } - }, null, null, shortcut); - }); - - toggleFontStyle('bold', mxConstants.FONT_BOLD, function() { document.execCommand('bold', false, null); }, Editor.ctrlKey + '+B'); - toggleFontStyle('italic', mxConstants.FONT_ITALIC, function() { document.execCommand('italic', false, null); }, Editor.ctrlKey + '+I'); - toggleFontStyle('underline', mxConstants.FONT_UNDERLINE, function() { document.execCommand('underline', false, null); }, Editor.ctrlKey + '+U'); - - // Color actions - this.addAction('fontColor...', function() { ui.menus.pickColor(mxConstants.STYLE_FONTCOLOR, 'forecolor', '000000'); }); - this.addAction('strokeColor...', function() { ui.menus.pickColor(mxConstants.STYLE_STROKECOLOR); }); - this.addAction('fillColor...', function() { ui.menus.pickColor(mxConstants.STYLE_FILLCOLOR); }); - this.addAction('gradientColor...', function() { ui.menus.pickColor(mxConstants.STYLE_GRADIENTCOLOR); }); - this.addAction('backgroundColor...', function() { ui.menus.pickColor(mxConstants.STYLE_LABEL_BACKGROUNDCOLOR, 'backcolor'); }); - this.addAction('borderColor...', function() { ui.menus.pickColor(mxConstants.STYLE_LABEL_BORDERCOLOR); }); - - // Format actions - this.addAction('vertical', function() { ui.menus.toggleStyle(mxConstants.STYLE_HORIZONTAL, true); }); - this.addAction('shadow', function() { ui.menus.toggleStyle(mxConstants.STYLE_SHADOW); }); - this.addAction('solid', function() - { - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(mxConstants.STYLE_DASHED, null); - graph.setCellStyles(mxConstants.STYLE_DASH_PATTERN, null); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], - 'values', [null, null], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); - this.addAction('dashed', function() - { - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(mxConstants.STYLE_DASHED, '1'); - graph.setCellStyles(mxConstants.STYLE_DASH_PATTERN, null); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], - 'values', ['1', null], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); - this.addAction('dotted', function() - { - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(mxConstants.STYLE_DASHED, '1'); - graph.setCellStyles(mxConstants.STYLE_DASH_PATTERN, '1 4'); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], - 'values', ['1', '1 4'], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); - this.addAction('sharp', function() - { - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(mxConstants.STYLE_ROUNDED, '0'); - graph.setCellStyles(mxConstants.STYLE_CURVED, '0'); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED], - 'values', ['0', '0'], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); - this.addAction('rounded', function() - { - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(mxConstants.STYLE_ROUNDED, '1'); - graph.setCellStyles(mxConstants.STYLE_CURVED, '0'); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED], - 'values', ['1', '0'], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); - this.addAction('toggleRounded', function() - { - if (!graph.isSelectionEmpty() && graph.isEnabled()) - { - graph.getModel().beginUpdate(); - try - { - var cells = graph.getSelectionCells(); - var state = graph.view.getState(cells[0]); - var style = (state != null) ? state.style : graph.getCellStyle(cells[0]); - var value = (mxUtils.getValue(style, mxConstants.STYLE_ROUNDED, '0') == '1') ? '0' : '1'; - - graph.setCellStyles(mxConstants.STYLE_ROUNDED, value); - graph.setCellStyles(mxConstants.STYLE_CURVED, null); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED], - 'values', [value, '0'], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - } - }); - this.addAction('curved', function() - { - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(mxConstants.STYLE_ROUNDED, '0'); - graph.setCellStyles(mxConstants.STYLE_CURVED, '1'); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED], - 'values', ['0', '1'], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); - this.addAction('collapsible', function() - { - var state = graph.view.getState(graph.getSelectionCell()); - var value = '1'; - - if (state != null && graph.getFoldingImage(state) != null) - { - value = '0'; - } - - graph.setCellStyles('collapsible', value); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['collapsible'], - 'values', [value], 'cells', graph.getSelectionCells())); - }); - this.addAction('editStyle...', mxUtils.bind(this, function() - { - var cells = graph.getSelectionCells(); - - if (cells != null && cells.length > 0) - { - var model = graph.getModel(); - - var dlg = new TextareaDialog(this.editorUi, mxResources.get('editStyle') + ':', - model.getStyle(cells[0]) || '', function(newValue) - { - if (newValue != null) - { - graph.setCellStyle(mxUtils.trim(newValue), cells); - } - }, null, null, 400, 220); - this.editorUi.showDialog(dlg.container, 420, 300, true, true); - dlg.init(); - } - }), null, null, Editor.ctrlKey + '+E'); - this.addAction('setAsDefaultStyle', function() - { - if (graph.isEnabled() && !graph.isSelectionEmpty()) - { - ui.setDefaultStyle(graph.getSelectionCell()); - } - }, null, null, Editor.ctrlKey + '+Shift+D'); - this.addAction('clearDefaultStyle', function() - { - if (graph.isEnabled()) - { - ui.clearDefaultStyle(); - } - }, null, null, Editor.ctrlKey + '+Shift+R'); - this.addAction('addWaypoint', function() - { - var cell = graph.getSelectionCell(); - - if (cell != null && graph.getModel().isEdge(cell)) - { - var handler = editor.graph.selectionCellsHandler.getHandler(cell); - - if (handler instanceof mxEdgeHandler) - { - var t = graph.view.translate; - var s = graph.view.scale; - var dx = t.x; - var dy = t.y; - - var parent = graph.getModel().getParent(cell); - var pgeo = graph.getCellGeometry(parent); - - while (graph.getModel().isVertex(parent) && pgeo != null) - { - dx += pgeo.x; - dy += pgeo.y; - - parent = graph.getModel().getParent(parent); - pgeo = graph.getCellGeometry(parent); - } - - var x = Math.round(graph.snap(graph.popupMenuHandler.triggerX / s - dx)); - var y = Math.round(graph.snap(graph.popupMenuHandler.triggerY / s - dy)); - - handler.addPointAt(handler.state, x, y); - } - } - }); - this.addAction('removeWaypoint', function() - { - // TODO: Action should run with "this" set to action - var rmWaypointAction = ui.actions.get('removeWaypoint'); - - if (rmWaypointAction.handler != null) - { - // NOTE: Popupevent handled and action updated in Menus.createPopupMenu - rmWaypointAction.handler.removePoint(rmWaypointAction.handler.state, rmWaypointAction.index); - } - }); - this.addAction('clearWaypoints', function() - { - var cells = graph.getSelectionCells(); - - if (cells != null) - { - cells = graph.addAllEdges(cells); - - graph.getModel().beginUpdate(); - try - { - for (var i = 0; i < cells.length; i++) - { - var cell = cells[i]; - - if (graph.getModel().isEdge(cell)) - { - var geo = graph.getCellGeometry(cell); - - if (geo != null) - { - geo = geo.clone(); - geo.points = null; - graph.getModel().setGeometry(cell, geo); - } - } - } - } - finally - { - graph.getModel().endUpdate(); - } - } - }, null, null, 'Alt+Shift+C'); - action = this.addAction('subscript', mxUtils.bind(this, function() - { - if (graph.cellEditor.isContentEditing()) - { - document.execCommand('subscript', false, null); - } - }), null, null, Editor.ctrlKey + '+,'); - action = this.addAction('superscript', mxUtils.bind(this, function() - { - if (graph.cellEditor.isContentEditing()) - { - document.execCommand('superscript', false, null); - } - }), null, null, Editor.ctrlKey + '+.'); - this.addAction('image...', function() - { - if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) - { - var title = mxResources.get('image') + ' (' + mxResources.get('url') + '):'; - var state = graph.getView().getState(graph.getSelectionCell()); - var value = ''; - - if (state != null) - { - value = state.style[mxConstants.STYLE_IMAGE] || value; - } - - var selectionState = graph.cellEditor.saveSelection(); - - ui.showImageDialog(title, value, function(newValue, w, h) - { - // Inserts image into HTML text - if (graph.cellEditor.isContentEditing()) - { - graph.cellEditor.restoreSelection(selectionState); - graph.insertImage(newValue, w, h); - } - else - { - var cells = graph.getSelectionCells(); - - if (newValue != null && (newValue.length > 0 || cells.length > 0)) - { - var select = null; - - graph.getModel().beginUpdate(); - try - { - // Inserts new cell if no cell is selected - if (cells.length == 0) - { - var pt = graph.getFreeInsertPoint(); - cells = [graph.insertVertex(graph.getDefaultParent(), null, '', pt.x, pt.y, w, h, - 'shape=image;imageAspect=0;aspect=fixed;verticalLabelPosition=bottom;verticalAlign=top;')]; - select = cells; - graph.fireEvent(new mxEventObject('cellsInserted', 'cells', select)); - } - - graph.setCellStyles(mxConstants.STYLE_IMAGE, (newValue.length > 0) ? newValue : null, cells); - - // Sets shape only if not already shape with image (label or image) - var state = graph.view.getState(cells[0]); - var style = (state != null) ? state.style : graph.getCellStyle(cells[0]); - - if (style[mxConstants.STYLE_SHAPE] != 'image' && style[mxConstants.STYLE_SHAPE] != 'label') - { - graph.setCellStyles(mxConstants.STYLE_SHAPE, 'image', cells); - } - else if (newValue.length == 0) - { - graph.setCellStyles(mxConstants.STYLE_SHAPE, null, cells); - } - - if (graph.getSelectionCount() == 1) - { - if (w != null && h != null) - { - var cell = cells[0]; - var geo = graph.getModel().getGeometry(cell); - - if (geo != null) - { - geo = geo.clone(); - geo.width = w; - geo.height = h; - graph.getModel().setGeometry(cell, geo); - } - } - } - } - finally - { - graph.getModel().endUpdate(); - } - - if (select != null) - { - graph.setSelectionCells(select); - graph.scrollCellToVisible(select[0]); - } - } - } - }, graph.cellEditor.isContentEditing(), !graph.cellEditor.isContentEditing()); - } - }).isEnabled = isGraphEnabled; - this.addAction('insertImage...', function() - { - if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) - { - graph.clearSelection(); - ui.actions.get('image').funct(); - } - }).isEnabled = isGraphEnabled; - action = this.addAction('layers', mxUtils.bind(this, function() - { - if (this.layersWindow == null) - { - // LATER: Check outline window for initial placement - this.layersWindow = new LayersWindow(ui, document.body.offsetWidth - 280, 120, 220, 180); - this.layersWindow.window.addListener('show', function() - { - ui.fireEvent(new mxEventObject('layers')); - }); - this.layersWindow.window.addListener('hide', function() - { - ui.fireEvent(new mxEventObject('layers')); - }); - this.layersWindow.window.setVisible(true); - ui.fireEvent(new mxEventObject('layers')); - } - else - { - this.layersWindow.window.setVisible(!this.layersWindow.window.isVisible()); - } - }), null, null, Editor.ctrlKey + '+Shift+L'); - action.setToggleAction(true); - action.setSelectedCallback(mxUtils.bind(this, function() { return this.layersWindow != null && this.layersWindow.window.isVisible(); })); - action = this.addAction('formatPanel', mxUtils.bind(this, function() - { - ui.toggleFormatPanel(); - }), null, null, Editor.ctrlKey + '+Shift+P'); - action.setToggleAction(true); - action.setSelectedCallback(mxUtils.bind(this, function() { return ui.formatWidth > 0; })); - action = this.addAction('outline', mxUtils.bind(this, function() - { - if (this.outlineWindow == null) - { - // LATER: Check layers window for initial placement - this.outlineWindow = new OutlineWindow(ui, document.body.offsetWidth - 260, 100, 180, 180); - this.outlineWindow.window.addListener('show', function() - { - ui.fireEvent(new mxEventObject('outline')); - }); - this.outlineWindow.window.addListener('hide', function() - { - ui.fireEvent(new mxEventObject('outline')); - }); - this.outlineWindow.window.setVisible(true); - ui.fireEvent(new mxEventObject('outline')); - } - else - { - this.outlineWindow.window.setVisible(!this.outlineWindow.window.isVisible()); - } - }), null, null, Editor.ctrlKey + '+Shift+O'); - - action.setToggleAction(true); - action.setSelectedCallback(mxUtils.bind(this, function() { return this.outlineWindow != null && this.outlineWindow.window.isVisible(); })); -}; - -/** - * Registers the given action under the given name. - */ -Actions.prototype.addAction = function(key, funct, enabled, iconCls, shortcut) -{ - var title; - - if (key.substring(key.length - 3) == '...') - { - key = key.substring(0, key.length - 3); - title = mxResources.get(key) + '...'; - } - else - { - title = mxResources.get(key); - } - - return this.put(key, new Action(title, funct, enabled, iconCls, shortcut)); -}; - -/** - * Registers the given action under the given name. - */ -Actions.prototype.put = function(name, action) -{ - this.actions[name] = action; - - return action; -}; - -/** - * Returns the action for the given name or null if no such action exists. - */ -Actions.prototype.get = function(name) -{ - return this.actions[name]; -}; - -/** - * Constructs a new action for the given parameters. - */ -function Action(label, funct, enabled, iconCls, shortcut) -{ - mxEventSource.call(this); - this.label = label; - this.funct = this.createFunction(funct); - this.enabled = (enabled != null) ? enabled : true; - this.iconCls = iconCls; - this.shortcut = shortcut; - this.visible = true; -}; - -// Action inherits from mxEventSource -mxUtils.extend(Action, mxEventSource); - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Action.prototype.createFunction = function(funct) -{ - return funct; -}; - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Action.prototype.setEnabled = function(value) -{ - if (this.enabled != value) - { - this.enabled = value; - this.fireEvent(new mxEventObject('stateChanged')); - } -}; - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Action.prototype.isEnabled = function() -{ - return this.enabled; -}; - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Action.prototype.setToggleAction = function(value) -{ - this.toggleAction = value; -}; - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Action.prototype.setSelectedCallback = function(funct) -{ - this.selectedCallback = funct; -}; - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Action.prototype.isSelected = function() -{ - return this.selectedCallback(); -}; diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Dialogs.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Dialogs.js deleted file mode 100644 index 16bec15b..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Dialogs.js +++ /dev/null @@ -1,2542 +0,0 @@ -/** - * Copyright (c) 2006-2012, JGraph Ltd - */ -/** - * Constructs a new open dialog. - */ -var OpenDialog = function() -{ - var iframe = document.createElement('iframe'); - iframe.style.backgroundColor = 'transparent'; - iframe.allowTransparency = 'true'; - iframe.style.borderStyle = 'none'; - iframe.style.borderWidth = '0px'; - iframe.style.overflow = 'hidden'; - iframe.frameBorder = '0'; - - // Adds padding as a workaround for box model in older IE versions - var dx = (mxClient.IS_VML && (document.documentMode == null || document.documentMode < 8)) ? 20 : 0; - - iframe.setAttribute('width', (((Editor.useLocalStorage) ? 640 : 320) + dx) + 'px'); - iframe.setAttribute('height', (((Editor.useLocalStorage) ? 480 : 220) + dx) + 'px'); - iframe.setAttribute('src', OPEN_FORM); - - this.container = iframe; -}; - -/** - * Constructs a new color dialog. - */ -var ColorDialog = function(editorUi, color, apply, cancelFn) -{ - this.editorUi = editorUi; - - var input = document.createElement('input'); - input.style.marginBottom = '10px'; - input.style.width = '216px'; - - // Required for picker to render in IE - if (mxClient.IS_IE) - { - input.style.marginTop = '10px'; - document.body.appendChild(input); - } - - this.init = function() - { - if (!mxClient.IS_TOUCH) - { - input.focus(); - } - }; - - var picker = new jscolor.color(input); - picker.pickerOnfocus = false; - picker.showPicker(); - - var div = document.createElement('div'); - jscolor.picker.box.style.position = 'relative'; - jscolor.picker.box.style.width = '230px'; - jscolor.picker.box.style.height = '100px'; - jscolor.picker.box.style.paddingBottom = '10px'; - div.appendChild(jscolor.picker.box); - - var center = document.createElement('center'); - - function createRecentColorTable() - { - var table = addPresets((ColorDialog.recentColors.length == 0) ? ['FFFFFF'] : - ColorDialog.recentColors, 11, 'FFFFFF', true); - table.style.marginBottom = '8px'; - - return table; - }; - - function addPresets(presets, rowLength, defaultColor, addResetOption) - { - rowLength = (rowLength != null) ? rowLength : 12; - var table = document.createElement('table'); - table.style.borderCollapse = 'collapse'; - table.setAttribute('cellspacing', '0'); - table.style.marginBottom = '20px'; - table.style.cellSpacing = '0px'; - var tbody = document.createElement('tbody'); - table.appendChild(tbody); - - var rows = presets.length / rowLength; - - for (var row = 0; row < rows; row++) - { - var tr = document.createElement('tr'); - - for (var i = 0; i < rowLength; i++) - { - (function(clr) - { - var td = document.createElement('td'); - td.style.border = '1px solid black'; - td.style.padding = '0px'; - td.style.width = '16px'; - td.style.height = '16px'; - - if (clr == null) - { - clr = defaultColor; - } - - if (clr == 'none') - { - td.style.background = 'url(\'' + Dialog.prototype.noColorImage + '\')'; - } - else - { - td.style.backgroundColor = '#' + clr; - } - - tr.appendChild(td); - - if (clr != null) - { - td.style.cursor = 'pointer'; - - mxEvent.addListener(td, 'click', function() - { - if (clr == 'none') - { - picker.fromString('ffffff'); - input.value = 'none'; - } - else - { - picker.fromString(clr); - } - }); - } - })(presets[row * rowLength + i]); - } - - tbody.appendChild(tr); - } - - if (addResetOption) - { - var td = document.createElement('td'); - td.setAttribute('title', mxResources.get('reset')); - td.style.border = '1px solid black'; - td.style.padding = '0px'; - td.style.width = '16px'; - td.style.height = '16px'; - td.style.backgroundImage = 'url(\'' + Dialog.prototype.closeImage + '\')'; - td.style.backgroundPosition = 'center center'; - td.style.backgroundRepeat = 'no-repeat'; - td.style.cursor = 'pointer'; - - tr.appendChild(td); - - mxEvent.addListener(td, 'click', function() - { - ColorDialog.resetRecentColors(); - table.parentNode.replaceChild(createRecentColorTable(), table); - }); - } - - center.appendChild(table); - - return table; - }; - - div.appendChild(input); - mxUtils.br(div); - - // Adds recent colors - createRecentColorTable(); - - // Adds presets - var table = addPresets(this.presetColors); - table.style.marginBottom = '8px'; - table = addPresets(this.defaultColors); - table.style.marginBottom = '16px'; - - div.appendChild(center); - - var buttons = document.createElement('div'); - buttons.style.textAlign = 'right'; - buttons.style.whiteSpace = 'nowrap'; - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - editorUi.hideDialog(); - - if (cancelFn != null) - { - cancelFn(); - } - }); - cancelBtn.className = 'geBtn'; - - if (editorUi.editor.cancelFirst) - { - buttons.appendChild(cancelBtn); - } - - var applyFunction = (apply != null) ? apply : this.createApplyFunction(); - - var applyBtn = mxUtils.button(mxResources.get('apply'), function() - { - var color = input.value; - ColorDialog.addRecentColor(color, 12); - - if (color != 'none' && color.charAt(0) != '#') - { - color = '#' + color; - } - - applyFunction(color); - editorUi.hideDialog(); - }); - applyBtn.className = 'geBtn gePrimaryBtn'; - buttons.appendChild(applyBtn); - - if (!editorUi.editor.cancelFirst) - { - buttons.appendChild(cancelBtn); - } - - if (color != null) - { - if (color == 'none') - { - picker.fromString('ffffff'); - input.value = 'none'; - } - else - { - picker.fromString(color); - } - } - - div.appendChild(buttons); - this.picker = picker; - this.colorInput = input; - - // LATER: Only fires if input if focused, should always - // fire if this dialog is showing. - mxEvent.addListener(div, 'keydown', function(e) - { - if (e.keyCode == 27) - { - editorUi.hideDialog(); - - if (cancelFn != null) - { - cancelFn(); - } - - mxEvent.consume(e); - } - }); - - this.container = div; -}; - -/** - * Creates function to apply value - */ -ColorDialog.prototype.presetColors = ['E6D0DE', 'CDA2BE', 'B5739D', 'E1D5E7', 'C3ABD0', 'A680B8', 'D4E1F5', 'A9C4EB', '7EA6E0', 'D5E8D4', '9AC7BF', '67AB9F', 'D5E8D4', 'B9E0A5', '97D077', 'FFF2CC', 'FFE599', 'FFD966', 'FFF4C3', 'FFCE9F', 'FFB570', 'F8CECC', 'F19C99', 'EA6B66']; - -/** - * Creates function to apply value - */ -ColorDialog.prototype.defaultColors = ['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']; - -/** - * Creates function to apply value - */ -ColorDialog.prototype.createApplyFunction = function() -{ - return mxUtils.bind(this, function(color) - { - var graph = this.editorUi.editor.graph; - - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(this.currentColorKey, color); - this.editorUi.fireEvent(new mxEventObject('styleChanged', 'keys', [this.currentColorKey], - 'values', [color], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); -}; - -/** - * - */ -ColorDialog.recentColors = []; - -/** - * Adds recent color for later use. - */ -ColorDialog.addRecentColor = function(color, max) -{ - if (color != null) - { - mxUtils.remove(color, ColorDialog.recentColors); - ColorDialog.recentColors.splice(0, 0, color); - - if (ColorDialog.recentColors.length >= max) - { - ColorDialog.recentColors.pop(); - } - } -}; - -/** - * Adds recent color for later use. - */ -ColorDialog.resetRecentColors = function() -{ - ColorDialog.recentColors = []; -}; - -/** - * Constructs a new about dialog. - */ -var AboutDialog = function(editorUi) -{ - var div = document.createElement('div'); - div.setAttribute('align', 'center'); - var h3 = document.createElement('h3'); - mxUtils.write(h3, mxResources.get('about') + ' GraphEditor'); - div.appendChild(h3); - var img = document.createElement('img'); - img.style.border = '0px'; - img.setAttribute('width', '176'); - img.setAttribute('width', '151'); - img.setAttribute('src', IMAGE_PATH + '/logo.png'); - div.appendChild(img); - mxUtils.br(div); - mxUtils.write(div, 'Powered by mxGraph ' + mxClient.VERSION); - mxUtils.br(div); - var link = document.createElement('a'); - link.setAttribute('href', 'http://www.jgraph.com/'); - link.setAttribute('target', '_blank'); - mxUtils.write(link, 'www.jgraph.com'); - div.appendChild(link); - mxUtils.br(div); - mxUtils.br(div); - var closeBtn = mxUtils.button(mxResources.get('close'), function() - { - editorUi.hideDialog(); - }); - closeBtn.className = 'geBtn gePrimaryBtn'; - div.appendChild(closeBtn); - - this.container = div; -}; - -/** - * Constructs a new filename dialog. - */ -var FilenameDialog = function(editorUi, filename, buttonText, fn, label, validateFn, content, helpLink, closeOnBtn, cancelFn) -{ - closeOnBtn = (closeOnBtn != null) ? closeOnBtn : true; - var row, td; - - var table = document.createElement('table'); - var tbody = document.createElement('tbody'); - table.style.marginTop = '8px'; - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.whiteSpace = 'nowrap'; - td.style.fontSize = '10pt'; - td.style.width = '120px'; - mxUtils.write(td, (label || mxResources.get('filename')) + ':'); - - row.appendChild(td); - - var nameInput = document.createElement('input'); - nameInput.setAttribute('value', filename || ''); - nameInput.style.marginLeft = '4px'; - nameInput.style.width = '180px'; - - var genericBtn = mxUtils.button(buttonText, function() - { - if (validateFn == null || validateFn(nameInput.value)) - { - if (closeOnBtn) - { - editorUi.hideDialog(); - } - - fn(nameInput.value); - } - }); - genericBtn.className = 'geBtn gePrimaryBtn'; - - this.init = function() - { - if (label == null && content != null) - { - return; - } - - nameInput.focus(); - - if (mxClient.IS_GC || mxClient.IS_FF || document.documentMode >= 5 || mxClient.IS_QUIRKS) - { - nameInput.select(); - } - else - { - document.execCommand('selectAll', false, null); - } - - // Installs drag and drop handler for links - if (Graph.fileSupport) - { - // Setup the dnd listeners - var dlg = table.parentNode; - var graph = editorUi.editor.graph; - var dropElt = null; - - mxEvent.addListener(dlg, 'dragleave', function(evt) - { - if (dropElt != null) - { - dropElt.style.backgroundColor = ''; - dropElt = null; - } - - evt.stopPropagation(); - evt.preventDefault(); - }); - - mxEvent.addListener(dlg, 'dragover', mxUtils.bind(this, function(evt) - { - // IE 10 does not implement pointer-events so it can't have a drop highlight - if (dropElt == null && (!mxClient.IS_IE || document.documentMode > 10)) - { - dropElt = nameInput; - dropElt.style.backgroundColor = '#ebf2f9'; - } - - evt.stopPropagation(); - evt.preventDefault(); - })); - - mxEvent.addListener(dlg, 'drop', mxUtils.bind(this, function(evt) - { - if (dropElt != null) - { - dropElt.style.backgroundColor = ''; - dropElt = null; - } - - if (mxUtils.indexOf(evt.dataTransfer.types, 'text/uri-list') >= 0) - { - nameInput.value = decodeURIComponent(evt.dataTransfer.getData('text/uri-list')); - genericBtn.click(); - } - - evt.stopPropagation(); - evt.preventDefault(); - })); - } - }; - - td = document.createElement('td'); - td.appendChild(nameInput); - row.appendChild(td); - - if (label != null || content == null) - { - tbody.appendChild(row); - } - - if (content != null) - { - row = document.createElement('tr'); - td = document.createElement('td'); - td.colSpan = 2; - td.appendChild(content); - row.appendChild(td); - tbody.appendChild(row); - } - - row = document.createElement('tr'); - td = document.createElement('td'); - td.colSpan = 2; - td.style.paddingTop = '20px'; - td.style.whiteSpace = 'nowrap'; - td.setAttribute('align', 'right'); - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - editorUi.hideDialog(); - - if (cancelFn != null) - { - cancelFn(); - } - }); - cancelBtn.className = 'geBtn'; - - if (editorUi.editor.cancelFirst) - { - td.appendChild(cancelBtn); - } - - if (helpLink != null) - { - var helpBtn = mxUtils.button(mxResources.get('help'), function() - { - editorUi.editor.graph.openLink(helpLink); - }); - - helpBtn.className = 'geBtn'; - td.appendChild(helpBtn); - } - - mxEvent.addListener(nameInput, 'keypress', function(e) - { - if (e.keyCode == 13) - { - genericBtn.click(); - } - }); - - td.appendChild(genericBtn); - - if (!editorUi.editor.cancelFirst) - { - td.appendChild(cancelBtn); - } - - row.appendChild(td); - tbody.appendChild(row); - table.appendChild(tbody); - - this.container = table; -}; - -/** - * Constructs a new textarea dialog. - */ -var TextareaDialog = function(editorUi, title, url, fn, cancelFn, cancelTitle, w, h, addButtons, noHide, noWrap, applyTitle) -{ - w = (w != null) ? w : 300; - h = (h != null) ? h : 120; - noHide = (noHide != null) ? noHide : false; - var row, td; - - var table = document.createElement('table'); - var tbody = document.createElement('tbody'); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - td.style.width = '100px'; - mxUtils.write(td, title); - - row.appendChild(td); - tbody.appendChild(row); - - row = document.createElement('tr'); - td = document.createElement('td'); - - var nameInput = document.createElement('textarea'); - - if (noWrap) - { - nameInput.setAttribute('wrap', 'off'); - } - - nameInput.setAttribute('spellcheck', 'false'); - nameInput.setAttribute('autocorrect', 'off'); - nameInput.setAttribute('autocomplete', 'off'); - nameInput.setAttribute('autocapitalize', 'off'); - - mxUtils.write(nameInput, url || ''); - nameInput.style.resize = 'none'; - nameInput.style.width = w + 'px'; - nameInput.style.height = h + 'px'; - - this.textarea = nameInput; - - this.init = function() - { - nameInput.focus(); - nameInput.scrollTop = 0; - }; - - td.appendChild(nameInput); - row.appendChild(td); - - tbody.appendChild(row); - - row = document.createElement('tr'); - td = document.createElement('td'); - td.style.paddingTop = '14px'; - td.style.whiteSpace = 'nowrap'; - td.setAttribute('align', 'right'); - - var cancelBtn = mxUtils.button(cancelTitle || mxResources.get('cancel'), function() - { - editorUi.hideDialog(); - - if (cancelFn != null) - { - cancelFn(); - } - }); - cancelBtn.className = 'geBtn'; - - if (editorUi.editor.cancelFirst) - { - td.appendChild(cancelBtn); - } - - if (addButtons != null) - { - addButtons(td); - } - - if (fn != null) - { - var genericBtn = mxUtils.button(applyTitle || mxResources.get('apply'), function() - { - if (!noHide) - { - editorUi.hideDialog(); - } - - fn(nameInput.value); - }); - - genericBtn.className = 'geBtn gePrimaryBtn'; - td.appendChild(genericBtn); - } - - if (!editorUi.editor.cancelFirst) - { - td.appendChild(cancelBtn); - } - - row.appendChild(td); - tbody.appendChild(row); - table.appendChild(tbody); - this.container = table; -}; - -/** - * Constructs a new edit file dialog. - */ -var EditDiagramDialog = function(editorUi) -{ - var div = document.createElement('div'); - div.style.textAlign = 'right'; - var textarea = document.createElement('textarea'); - textarea.setAttribute('wrap', 'off'); - textarea.setAttribute('spellcheck', 'false'); - textarea.setAttribute('autocorrect', 'off'); - textarea.setAttribute('autocomplete', 'off'); - textarea.setAttribute('autocapitalize', 'off'); - textarea.style.overflow = 'auto'; - textarea.style.resize = 'none'; - textarea.style.width = '600px'; - textarea.style.height = '360px'; - textarea.style.marginBottom = '16px'; - - textarea.value = mxUtils.getPrettyXml(editorUi.editor.getGraphXml()); - div.appendChild(textarea); - - this.init = function() - { - textarea.focus(); - }; - - // Enables dropping files - if (Graph.fileSupport) - { - function handleDrop(evt) - { - evt.stopPropagation(); - evt.preventDefault(); - - if (evt.dataTransfer.files.length > 0) - { - var file = evt.dataTransfer.files[0]; - var reader = new FileReader(); - - reader.onload = function(e) - { - textarea.value = e.target.result; - }; - - reader.readAsText(file); - } - else - { - textarea.value = editorUi.extractGraphModelFromEvent(evt); - } - }; - - function handleDragOver(evt) - { - evt.stopPropagation(); - evt.preventDefault(); - }; - - // Setup the dnd listeners. - textarea.addEventListener('dragover', handleDragOver, false); - textarea.addEventListener('drop', handleDrop, false); - } - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - editorUi.hideDialog(); - }); - cancelBtn.className = 'geBtn'; - - if (editorUi.editor.cancelFirst) - { - div.appendChild(cancelBtn); - } - - var select = document.createElement('select'); - select.style.width = '180px'; - select.className = 'geBtn'; - - if (editorUi.editor.graph.isEnabled()) - { - var replaceOption = document.createElement('option'); - replaceOption.setAttribute('value', 'replace'); - mxUtils.write(replaceOption, mxResources.get('replaceExistingDrawing')); - select.appendChild(replaceOption); - } - - var newOption = document.createElement('option'); - newOption.setAttribute('value', 'new'); - mxUtils.write(newOption, mxResources.get('openInNewWindow')); - - if (EditDiagramDialog.showNewWindowOption) - { - select.appendChild(newOption); - } - - if (editorUi.editor.graph.isEnabled()) - { - var importOption = document.createElement('option'); - importOption.setAttribute('value', 'import'); - mxUtils.write(importOption, mxResources.get('addToExistingDrawing')); - select.appendChild(importOption); - } - - div.appendChild(select); - - var okBtn = mxUtils.button(mxResources.get('ok'), function() - { - // Removes all illegal control characters before parsing - var data = editorUi.editor.graph.zapGremlins(mxUtils.trim(textarea.value)); - var error = null; - - if (select.value == 'new') - { - window.openFile = new OpenFile(function() - { - editorUi.hideDialog(); - window.openFile = null; - }); - - window.openFile.setData(data, null); - editorUi.editor.graph.openLink(editorUi.getUrl()); - } - else if (select.value == 'replace') - { - editorUi.editor.graph.model.beginUpdate(); - try - { - editorUi.editor.setGraphXml(mxUtils.parseXml(data).documentElement); - // LATER: Why is hideDialog between begin-/endUpdate faster? - editorUi.hideDialog(); - } - catch (e) - { - error = e; - } - finally - { - editorUi.editor.graph.model.endUpdate(); - } - } - else if (select.value == 'import') - { - editorUi.editor.graph.model.beginUpdate(); - try - { - var doc = mxUtils.parseXml(data); - var model = new mxGraphModel(); - var codec = new mxCodec(doc); - codec.decode(doc.documentElement, model); - - var children = model.getChildren(model.getChildAt(model.getRoot(), 0)); - editorUi.editor.graph.setSelectionCells(editorUi.editor.graph.importCells(children)); - - // LATER: Why is hideDialog between begin-/endUpdate faster? - editorUi.hideDialog(); - } - catch (e) - { - error = e; - } - finally - { - editorUi.editor.graph.model.endUpdate(); - } - } - - if (error != null) - { - mxUtils.alert(error.message); - } - }); - okBtn.className = 'geBtn gePrimaryBtn'; - div.appendChild(okBtn); - - if (!editorUi.editor.cancelFirst) - { - div.appendChild(cancelBtn); - } - - this.container = div; -}; - -/** - * - */ -EditDiagramDialog.showNewWindowOption = true; - -/** - * Constructs a new export dialog. - */ -var ExportDialog = function(editorUi) -{ - var graph = editorUi.editor.graph; - var bounds = graph.getGraphBounds(); - var scale = graph.view.scale; - - var width = Math.ceil(bounds.width / scale); - var height = Math.ceil(bounds.height / scale); - - var row, td; - - var table = document.createElement('table'); - var tbody = document.createElement('tbody'); - table.setAttribute('cellpadding', (mxClient.IS_SF) ? '0' : '2'); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - td.style.width = '100px'; - mxUtils.write(td, mxResources.get('filename') + ':'); - - row.appendChild(td); - - var nameInput = document.createElement('input'); - nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename()); - nameInput.style.width = '180px'; - - td = document.createElement('td'); - td.appendChild(nameInput); - row.appendChild(td); - - tbody.appendChild(row); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - mxUtils.write(td, mxResources.get('format') + ':'); - - row.appendChild(td); - - var imageFormatSelect = document.createElement('select'); - imageFormatSelect.style.width = '180px'; - - var pngOption = document.createElement('option'); - pngOption.setAttribute('value', 'png'); - mxUtils.write(pngOption, mxResources.get('formatPng')); - imageFormatSelect.appendChild(pngOption); - - var gifOption = document.createElement('option'); - - if (ExportDialog.showGifOption) - { - gifOption.setAttribute('value', 'gif'); - mxUtils.write(gifOption, mxResources.get('formatGif')); - imageFormatSelect.appendChild(gifOption); - } - - var jpgOption = document.createElement('option'); - jpgOption.setAttribute('value', 'jpg'); - mxUtils.write(jpgOption, mxResources.get('formatJpg')); - imageFormatSelect.appendChild(jpgOption); - - var pdfOption = document.createElement('option'); - pdfOption.setAttribute('value', 'pdf'); - mxUtils.write(pdfOption, mxResources.get('formatPdf')); - imageFormatSelect.appendChild(pdfOption); - - var svgOption = document.createElement('option'); - svgOption.setAttribute('value', 'svg'); - mxUtils.write(svgOption, mxResources.get('formatSvg')); - imageFormatSelect.appendChild(svgOption); - - if (ExportDialog.showXmlOption) - { - var xmlOption = document.createElement('option'); - xmlOption.setAttribute('value', 'xml'); - mxUtils.write(xmlOption, mxResources.get('formatXml')); - imageFormatSelect.appendChild(xmlOption); - } - - td = document.createElement('td'); - td.appendChild(imageFormatSelect); - row.appendChild(td); - - tbody.appendChild(row); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - mxUtils.write(td, mxResources.get('zoom') + ' (%):'); - - row.appendChild(td); - - var zoomInput = document.createElement('input'); - zoomInput.setAttribute('type', 'number'); - zoomInput.setAttribute('value', '100'); - zoomInput.style.width = '180px'; - - td = document.createElement('td'); - td.appendChild(zoomInput); - row.appendChild(td); - - tbody.appendChild(row); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - mxUtils.write(td, mxResources.get('width') + ':'); - - row.appendChild(td); - - var widthInput = document.createElement('input'); - widthInput.setAttribute('value', width); - widthInput.style.width = '180px'; - - td = document.createElement('td'); - td.appendChild(widthInput); - row.appendChild(td); - - tbody.appendChild(row); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - mxUtils.write(td, mxResources.get('height') + ':'); - - row.appendChild(td); - - var heightInput = document.createElement('input'); - heightInput.setAttribute('value', height); - heightInput.style.width = '180px'; - - td = document.createElement('td'); - td.appendChild(heightInput); - row.appendChild(td); - - tbody.appendChild(row); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - mxUtils.write(td, mxResources.get('background') + ':'); - - row.appendChild(td); - - var transparentCheckbox = document.createElement('input'); - transparentCheckbox.setAttribute('type', 'checkbox'); - transparentCheckbox.checked = graph.background == null || graph.background == mxConstants.NONE; - - td = document.createElement('td'); - td.appendChild(transparentCheckbox); - mxUtils.write(td, mxResources.get('transparent')); - - row.appendChild(td); - - tbody.appendChild(row); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - mxUtils.write(td, mxResources.get('borderWidth') + ':'); - - row.appendChild(td); - - var borderInput = document.createElement('input'); - borderInput.setAttribute('type', 'number'); - borderInput.setAttribute('value', ExportDialog.lastBorderValue); - borderInput.style.width = '180px'; - - td = document.createElement('td'); - td.appendChild(borderInput); - row.appendChild(td); - - tbody.appendChild(row); - table.appendChild(tbody); - - // Handles changes in the export format - function formatChanged() - { - var name = nameInput.value; - var dot = name.lastIndexOf('.'); - - if (dot > 0) - { - nameInput.value = name.substring(0, dot + 1) + imageFormatSelect.value; - } - else - { - nameInput.value = name + '.' + imageFormatSelect.value; - } - - if (imageFormatSelect.value === 'xml') - { - zoomInput.setAttribute('disabled', 'true'); - widthInput.setAttribute('disabled', 'true'); - heightInput.setAttribute('disabled', 'true'); - borderInput.setAttribute('disabled', 'true'); - } - else - { - zoomInput.removeAttribute('disabled'); - widthInput.removeAttribute('disabled'); - heightInput.removeAttribute('disabled'); - borderInput.removeAttribute('disabled'); - } - - if (imageFormatSelect.value === 'png' || imageFormatSelect.value === 'svg') - { - transparentCheckbox.removeAttribute('disabled'); - } - else - { - transparentCheckbox.setAttribute('disabled', 'disabled'); - } - }; - - mxEvent.addListener(imageFormatSelect, 'change', formatChanged); - formatChanged(); - - function checkValues() - { - if (widthInput.value * heightInput.value > MAX_AREA || widthInput.value <= 0) - { - widthInput.style.backgroundColor = 'red'; - } - else - { - widthInput.style.backgroundColor = ''; - } - - if (widthInput.value * heightInput.value > MAX_AREA || heightInput.value <= 0) - { - heightInput.style.backgroundColor = 'red'; - } - else - { - heightInput.style.backgroundColor = ''; - } - }; - - mxEvent.addListener(zoomInput, 'change', function() - { - var s = Math.max(0, parseFloat(zoomInput.value) || 100) / 100; - zoomInput.value = parseFloat((s * 100).toFixed(2)); - - if (width > 0) - { - widthInput.value = Math.floor(width * s); - heightInput.value = Math.floor(height * s); - } - else - { - zoomInput.value = '100'; - widthInput.value = width; - heightInput.value = height; - } - - checkValues(); - }); - - mxEvent.addListener(widthInput, 'change', function() - { - var s = parseInt(widthInput.value) / width; - - if (s > 0) - { - zoomInput.value = parseFloat((s * 100).toFixed(2)); - heightInput.value = Math.floor(height * s); - } - else - { - zoomInput.value = '100'; - widthInput.value = width; - heightInput.value = height; - } - - checkValues(); - }); - - mxEvent.addListener(heightInput, 'change', function() - { - var s = parseInt(heightInput.value) / height; - - if (s > 0) - { - zoomInput.value = parseFloat((s * 100).toFixed(2)); - widthInput.value = Math.floor(width * s); - } - else - { - zoomInput.value = '100'; - widthInput.value = width; - heightInput.value = height; - } - - checkValues(); - }); - - row = document.createElement('tr'); - td = document.createElement('td'); - td.setAttribute('align', 'right'); - td.style.paddingTop = '22px'; - td.colSpan = 2; - - var saveBtn = mxUtils.button(mxResources.get('export'), mxUtils.bind(this, function() - { - if (parseInt(zoomInput.value) <= 0) - { - mxUtils.alert(mxResources.get('drawingEmpty')); - } - else - { - var name = nameInput.value; - var format = imageFormatSelect.value; - var s = Math.max(0, parseFloat(zoomInput.value) || 100) / 100; - var b = Math.max(0, parseInt(borderInput.value)); - var bg = graph.background; - - if ((format == 'svg' || format == 'png') && transparentCheckbox.checked) - { - bg = null; - } - else if (bg == null || bg == mxConstants.NONE) - { - bg = '#ffffff'; - } - - ExportDialog.lastBorderValue = b; - ExportDialog.exportFile(editorUi, name, format, bg, s, b); - } - })); - saveBtn.className = 'geBtn gePrimaryBtn'; - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - editorUi.hideDialog(); - }); - cancelBtn.className = 'geBtn'; - - if (editorUi.editor.cancelFirst) - { - td.appendChild(cancelBtn); - td.appendChild(saveBtn); - } - else - { - td.appendChild(saveBtn); - td.appendChild(cancelBtn); - } - - row.appendChild(td); - tbody.appendChild(row); - table.appendChild(tbody); - this.container = table; -}; - -/** - * Remembers last value for border. - */ -ExportDialog.lastBorderValue = 0; - -/** - * Global switches for the export dialog. - */ -ExportDialog.showGifOption = true; - -/** - * Global switches for the export dialog. - */ -ExportDialog.showXmlOption = true; - -/** - * Hook for getting the export format. Returns null for the default - * intermediate XML export format or a function that returns the - * parameter and value to be used in the request in the form - * key=value, where value should be URL encoded. - */ -ExportDialog.exportFile = function(editorUi, name, format, bg, s, b) -{ - var graph = editorUi.editor.graph; - - if (format == 'xml') - { - ExportDialog.saveLocalFile(editorUi, mxUtils.getXml(editorUi.editor.getGraphXml()), name, format); - } - else if (format == 'svg') - { - ExportDialog.saveLocalFile(editorUi, mxUtils.getXml(graph.getSvg(bg, s, b)), name, format); - } - else - { - var bounds = graph.getGraphBounds(); - - // New image export - var xmlDoc = mxUtils.createXmlDocument(); - var root = xmlDoc.createElement('output'); - xmlDoc.appendChild(root); - - // Renders graph. Offset will be multiplied with state's scale when painting state. - var xmlCanvas = new mxXmlCanvas2D(root); - xmlCanvas.translate(Math.floor((b / s - bounds.x) / graph.view.scale), - Math.floor((b / s - bounds.y) / graph.view.scale)); - xmlCanvas.scale(s / graph.view.scale); - - var imgExport = new mxImageExport() - imgExport.drawState(graph.getView().getState(graph.model.root), xmlCanvas); - - // Puts request data together - var param = 'xml=' + encodeURIComponent(mxUtils.getXml(root)); - var w = Math.ceil(bounds.width * s / graph.view.scale + 2 * b); - var h = Math.ceil(bounds.height * s / graph.view.scale + 2 * b); - - // Requests image if request is valid - if (param.length <= MAX_REQUEST_SIZE && w * h < MAX_AREA) - { - editorUi.hideDialog(); - var req = new mxXmlRequest(EXPORT_URL, 'format=' + format + - '&filename=' + encodeURIComponent(name) + - '&bg=' + ((bg != null) ? bg : 'none') + - '&w=' + w + '&h=' + h + '&' + param); - req.simulate(document, '_blank'); - } - else - { - mxUtils.alert(mxResources.get('drawingTooLarge')); - } - } -}; - -/** - * Hook for getting the export format. Returns null for the default - * intermediate XML export format or a function that returns the - * parameter and value to be used in the request in the form - * key=value, where value should be URL encoded. - */ -ExportDialog.saveLocalFile = function(editorUi, data, filename, format) -{ - if (data.length < MAX_REQUEST_SIZE) - { - editorUi.hideDialog(); - var req = new mxXmlRequest(SAVE_URL, 'xml=' + encodeURIComponent(data) + '&filename=' + - encodeURIComponent(filename) + '&format=' + format); - req.simulate(document, '_blank'); - } - else - { - mxUtils.alert(mxResources.get('drawingTooLarge')); - mxUtils.popup(xml); - } -}; - -/** - * Constructs a new metadata dialog. - */ -var EditDataDialog = function(ui, cell) -{ - var div = document.createElement('div'); - var graph = ui.editor.graph; - - var value = graph.getModel().getValue(cell); - - // Converts the value to an XML node - if (!mxUtils.isNode(value)) - { - var doc = mxUtils.createXmlDocument(); - var obj = doc.createElement('object'); - obj.setAttribute('label', value || ''); - value = obj; - } - - // Creates the dialog contents - var form = new mxForm('properties'); - form.table.style.width = '100%'; - - var attrs = value.attributes; - var names = []; - var texts = []; - var count = 0; - - var id = EditDataDialog.getDisplayIdForCell(ui, cell); - - // FIXME: Fix remove button for quirks mode - var addRemoveButton = function(text, name) - { - var wrapper = document.createElement('div'); - wrapper.style.position = 'relative'; - wrapper.style.paddingRight = '20px'; - wrapper.style.boxSizing = 'border-box'; - wrapper.style.width = '100%'; - - var removeAttr = document.createElement('a'); - var img = mxUtils.createImage(Dialog.prototype.closeImage); - img.style.height = '9px'; - img.style.fontSize = '9px'; - img.style.marginBottom = (mxClient.IS_IE11) ? '-1px' : '5px'; - - removeAttr.className = 'geButton'; - removeAttr.setAttribute('title', mxResources.get('delete')); - removeAttr.style.position = 'absolute'; - removeAttr.style.top = '4px'; - removeAttr.style.right = '0px'; - removeAttr.style.margin = '0px'; - removeAttr.style.width = '9px'; - removeAttr.style.height = '9px'; - removeAttr.style.cursor = 'pointer'; - removeAttr.appendChild(img); - - var removeAttrFn = (function(name) - { - return function() - { - var count = 0; - - for (var j = 0; j < names.length; j++) - { - if (names[j] == name) - { - texts[j] = null; - form.table.deleteRow(count + ((id != null) ? 1 : 0)); - - break; - } - - if (texts[j] != null) - { - count++; - } - } - }; - })(name); - - mxEvent.addListener(removeAttr, 'click', removeAttrFn); - - var parent = text.parentNode; - wrapper.appendChild(text); - wrapper.appendChild(removeAttr); - parent.appendChild(wrapper); - }; - - var addTextArea = function(index, name, value) - { - names[index] = name; - texts[index] = form.addTextarea(names[count] + ':', value, 2); - texts[index].style.width = '100%'; - - addRemoveButton(texts[index], name); - }; - - var temp = []; - var isLayer = graph.getModel().getParent(cell) == graph.getModel().getRoot(); - - for (var i = 0; i < attrs.length; i++) - { - if ((isLayer || attrs[i].nodeName != 'label') && attrs[i].nodeName != 'placeholders') - { - temp.push({name: attrs[i].nodeName, value: attrs[i].nodeValue}); - } - } - - // Sorts by name - temp.sort(function(a, b) - { - if (a.name < b.name) - { - return -1; - } - else if (a.name > b.name) - { - return 1; - } - else - { - return 0; - } - }); - - if (id != null) - { - var text = document.createElement('input'); - text.style.width = '280px'; - text.style.textAlign = 'center'; - text.setAttribute('type', 'text'); - text.setAttribute('readOnly', 'true'); - text.setAttribute('value', id); - - form.addField(mxResources.get('id') + ':', text); - } - - for (var i = 0; i < temp.length; i++) - { - addTextArea(count, temp[i].name, temp[i].value); - count++; - } - - var top = document.createElement('div'); - top.style.cssText = 'position:absolute;left:30px;right:30px;overflow-y:auto;top:30px;bottom:80px;'; - top.appendChild(form.table); - - var newProp = document.createElement('div'); - newProp.style.whiteSpace = 'nowrap'; - newProp.style.marginTop = '6px'; - - var nameInput = document.createElement('input'); - nameInput.setAttribute('placeholder', mxResources.get('enterPropertyName')); - nameInput.setAttribute('type', 'text'); - nameInput.setAttribute('size', (mxClient.IS_IE || mxClient.IS_IE11) ? '18' : '22'); - nameInput.style.marginLeft = '2px'; - - newProp.appendChild(nameInput); - top.appendChild(newProp); - div.appendChild(top); - - var addBtn = mxUtils.button(mxResources.get('addProperty'), function() - { - var name = nameInput.value; - - // Avoid ':' in attribute names which seems to be valid in Chrome - if (name.length > 0 && name != 'label' && name != 'placeholders' && name.indexOf(':') < 0) - { - try - { - var idx = mxUtils.indexOf(names, name); - - if (idx >= 0 && texts[idx] != null) - { - texts[idx].focus(); - } - else - { - // Checks if the name is valid - var clone = value.cloneNode(false); - clone.setAttribute(name, ''); - - if (idx >= 0) - { - names.splice(idx, 1); - texts.splice(idx, 1); - } - - names.push(name); - var text = form.addTextarea(name + ':', '', 2); - text.style.width = '100%'; - texts.push(text); - addRemoveButton(text, name); - - text.focus(); - } - - nameInput.value = ''; - } - catch (e) - { - mxUtils.alert(e); - } - } - else - { - mxUtils.alert(mxResources.get('invalidName')); - } - }); - - this.init = function() - { - if (texts.length > 0) - { - texts[0].focus(); - } - else - { - nameInput.focus(); - } - }; - - addBtn.setAttribute('disabled', 'disabled'); - addBtn.style.marginLeft = '10px'; - addBtn.style.width = '144px'; - newProp.appendChild(addBtn); - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - ui.hideDialog.apply(ui, arguments); - }); - - cancelBtn.className = 'geBtn'; - - var applyBtn = mxUtils.button(mxResources.get('apply'), function() - { - try - { - ui.hideDialog.apply(ui, arguments); - - // Clones and updates the value - value = value.cloneNode(true); - var removeLabel = false; - - for (var i = 0; i < names.length; i++) - { - if (texts[i] == null) - { - value.removeAttribute(names[i]); - } - else - { - value.setAttribute(names[i], texts[i].value); - removeLabel = removeLabel || (names[i] == 'placeholder' && - value.getAttribute('placeholders') == '1'); - } - } - - // Removes label if placeholder is assigned - if (removeLabel) - { - value.removeAttribute('label'); - } - - // Updates the value of the cell (undoable) - graph.getModel().setValue(cell, value); - } - catch (e) - { - mxUtils.alert(e); - } - }); - applyBtn.className = 'geBtn gePrimaryBtn'; - - function updateAddBtn() - { - if (nameInput.value.length > 0) - { - addBtn.removeAttribute('disabled'); - } - else - { - addBtn.setAttribute('disabled', 'disabled'); - } - }; - - mxEvent.addListener(nameInput, 'keyup', updateAddBtn); - - // Catches all changes that don't fire a keyup (such as paste via mouse) - mxEvent.addListener(nameInput, 'change', updateAddBtn); - - var buttons = document.createElement('div'); - buttons.style.cssText = 'position:absolute;left:30px;right:30px;text-align:right;bottom:30px;height:40px;' - - if (ui.editor.graph.getModel().isVertex(cell) || ui.editor.graph.getModel().isEdge(cell)) - { - var replace = document.createElement('span'); - replace.style.marginRight = '10px'; - var input = document.createElement('input'); - input.setAttribute('type', 'checkbox'); - input.style.marginRight = '6px'; - - if (value.getAttribute('placeholders') == '1') - { - input.setAttribute('checked', 'checked'); - input.defaultChecked = true; - } - - mxEvent.addListener(input, 'click', function() - { - if (value.getAttribute('placeholders') == '1') - { - value.removeAttribute('placeholders'); - } - else - { - value.setAttribute('placeholders', '1'); - } - }); - - replace.appendChild(input); - mxUtils.write(replace, mxResources.get('placeholders')); - - if (EditDataDialog.placeholderHelpLink != null) - { - var link = document.createElement('a'); - link.setAttribute('href', EditDataDialog.placeholderHelpLink); - link.setAttribute('title', mxResources.get('help')); - link.setAttribute('target', '_blank'); - link.style.marginLeft = '10px'; - link.style.cursor = 'help'; - - var icon = document.createElement('img'); - icon.setAttribute('border', '0'); - icon.setAttribute('valign', 'middle'); - icon.style.marginTop = (mxClient.IS_IE11) ? '0px' : '-4px'; - icon.setAttribute('src', Editor.helpImage); - link.appendChild(icon); - - replace.appendChild(link); - } - - buttons.appendChild(replace); - } - - if (ui.editor.cancelFirst) - { - buttons.appendChild(cancelBtn); - buttons.appendChild(applyBtn); - } - else - { - buttons.appendChild(applyBtn); - buttons.appendChild(cancelBtn); - } - - div.appendChild(buttons); - this.container = div; -}; - -/** - * Optional help link. - */ -EditDataDialog.getDisplayIdForCell = function(ui, cell) -{ - var id = null; - - if (ui.editor.graph.getModel().getParent(cell) != null) - { - id = cell.getId(); - } - - return id; -}; - -/** - * Optional help link. - */ -EditDataDialog.placeholderHelpLink = null; - -/** - * Constructs a new link dialog. - */ -var LinkDialog = function(editorUi, initialValue, btnLabel, fn) -{ - var div = document.createElement('div'); - mxUtils.write(div, mxResources.get('editLink') + ':'); - - var inner = document.createElement('div'); - inner.className = 'geTitle'; - inner.style.backgroundColor = 'transparent'; - inner.style.borderColor = 'transparent'; - inner.style.whiteSpace = 'nowrap'; - inner.style.textOverflow = 'clip'; - inner.style.cursor = 'default'; - - if (!mxClient.IS_VML) - { - inner.style.paddingRight = '20px'; - } - - var linkInput = document.createElement('input'); - linkInput.setAttribute('value', initialValue); - linkInput.setAttribute('placeholder', 'http://www.example.com/'); - linkInput.setAttribute('type', 'text'); - linkInput.style.marginTop = '6px'; - linkInput.style.width = '400px'; - linkInput.style.backgroundImage = 'url(\'' + Dialog.prototype.clearImage + '\')'; - linkInput.style.backgroundRepeat = 'no-repeat'; - linkInput.style.backgroundPosition = '100% 50%'; - linkInput.style.paddingRight = '14px'; - - var cross = document.createElement('div'); - cross.setAttribute('title', mxResources.get('reset')); - cross.style.position = 'relative'; - cross.style.left = '-16px'; - cross.style.width = '12px'; - cross.style.height = '14px'; - cross.style.cursor = 'pointer'; - - // Workaround for inline-block not supported in IE - cross.style.display = (mxClient.IS_VML) ? 'inline' : 'inline-block'; - cross.style.top = ((mxClient.IS_VML) ? 0 : 3) + 'px'; - - // Needed to block event transparency in IE - cross.style.background = 'url(' + IMAGE_PATH + '/transparent.gif)'; - - mxEvent.addListener(cross, 'click', function() - { - linkInput.value = ''; - linkInput.focus(); - }); - - inner.appendChild(linkInput); - inner.appendChild(cross); - div.appendChild(inner); - - this.init = function() - { - linkInput.focus(); - - if (mxClient.IS_GC || mxClient.IS_FF || document.documentMode >= 5 || mxClient.IS_QUIRKS) - { - linkInput.select(); - } - else - { - document.execCommand('selectAll', false, null); - } - }; - - var btns = document.createElement('div'); - btns.style.marginTop = '18px'; - btns.style.textAlign = 'right'; - - mxEvent.addListener(linkInput, 'keypress', function(e) - { - if (e.keyCode == 13) - { - editorUi.hideDialog(); - fn(linkInput.value); - } - }); - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - editorUi.hideDialog(); - }); - cancelBtn.className = 'geBtn'; - - if (editorUi.editor.cancelFirst) - { - btns.appendChild(cancelBtn); - } - - var mainBtn = mxUtils.button(btnLabel, function() - { - editorUi.hideDialog(); - fn(linkInput.value); - }); - mainBtn.className = 'geBtn gePrimaryBtn'; - btns.appendChild(mainBtn); - - if (!editorUi.editor.cancelFirst) - { - btns.appendChild(cancelBtn); - } - - div.appendChild(btns); - - this.container = div; -}; - -/** - * - */ -var OutlineWindow = function(editorUi, x, y, w, h) -{ - var graph = editorUi.editor.graph; - - var div = document.createElement('div'); - div.style.position = 'absolute'; - div.style.width = '100%'; - div.style.height = '100%'; - div.style.border = '1px solid whiteSmoke'; - div.style.overflow = 'hidden'; - - this.window = new mxWindow(mxResources.get('outline'), div, x, y, w, h, true, true); - this.window.minimumSize = new mxRectangle(0, 0, 80, 80); - this.window.destroyOnClose = false; - this.window.setMaximizable(false); - this.window.setResizable(true); - this.window.setClosable(true); - this.window.setVisible(true); - - this.window.setLocation = function(x, y) - { - var iw = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; - var ih = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; - - x = Math.max(0, Math.min(x, iw - this.table.clientWidth)); - y = Math.max(0, Math.min(y, ih - this.table.clientHeight - 48)); - - if (this.getX() != x || this.getY() != y) - { - mxWindow.prototype.setLocation.apply(this, arguments); - } - }; - - var resizeListener = mxUtils.bind(this, function() - { - var x = this.window.getX(); - var y = this.window.getY(); - - this.window.setLocation(x, y); - }); - - mxEvent.addListener(window, 'resize', resizeListener); - - var outline = editorUi.createOutline(this.window); - - this.destroy = function() - { - mxEvent.removeListener(window, 'resize', resizeListener); - this.window.destroy(); - outline.destroy(); - } - - this.window.addListener(mxEvent.RESIZE, mxUtils.bind(this, function() - { - outline.update(false); - outline.outline.sizeDidChange(); - })); - - this.window.addListener(mxEvent.SHOW, mxUtils.bind(this, function() - { - outline.suspended = false; - outline.outline.refresh(); - outline.update(); - })); - - this.window.addListener(mxEvent.HIDE, mxUtils.bind(this, function() - { - outline.suspended = true; - })); - - this.window.addListener(mxEvent.NORMALIZE, mxUtils.bind(this, function() - { - outline.suspended = false; - outline.update(); - })); - - this.window.addListener(mxEvent.MINIMIZE, mxUtils.bind(this, function() - { - outline.suspended = true; - })); - - var outlineCreateGraph = outline.createGraph; - outline.createGraph = function(container) - { - var g = outlineCreateGraph.apply(this, arguments); - g.gridEnabled = false; - g.pageScale = graph.pageScale; - g.pageFormat = graph.pageFormat; - g.background = (graph.background == null || graph.background == mxConstants.NONE) ? graph.defaultPageBackgroundColor : graph.background; - g.pageVisible = graph.pageVisible; - - var current = mxUtils.getCurrentStyle(graph.container); - div.style.backgroundColor = current.backgroundColor; - - return g; - }; - - function update() - { - outline.outline.pageScale = graph.pageScale; - outline.outline.pageFormat = graph.pageFormat; - outline.outline.pageVisible = graph.pageVisible; - outline.outline.background = (graph.background == null || graph.background == mxConstants.NONE) ? graph.defaultPageBackgroundColor : graph.background;; - - var current = mxUtils.getCurrentStyle(graph.container); - div.style.backgroundColor = current.backgroundColor; - - if (graph.view.backgroundPageShape != null && outline.outline.view.backgroundPageShape != null) - { - outline.outline.view.backgroundPageShape.fill = graph.view.backgroundPageShape.fill; - } - - outline.outline.refresh(); - }; - - outline.init(div); - - editorUi.editor.addListener('resetGraphView', update); - editorUi.addListener('pageFormatChanged', update); - editorUi.addListener('backgroundColorChanged', update); - editorUi.addListener('backgroundImageChanged', update); - editorUi.addListener('pageViewChanged', function() - { - update(); - outline.update(true); - }); - - if (outline.outline.dialect == mxConstants.DIALECT_SVG) - { - var zoomInAction = editorUi.actions.get('zoomIn'); - var zoomOutAction = editorUi.actions.get('zoomOut'); - - mxEvent.addMouseWheelListener(function(evt, up) - { - var outlineWheel = false; - var source = mxEvent.getSource(evt); - - while (source != null) - { - if (source == outline.outline.view.canvas.ownerSVGElement) - { - outlineWheel = true; - break; - } - - source = source.parentNode; - } - - if (outlineWheel) - { - if (up) - { - zoomInAction.funct(); - } - else - { - zoomOutAction.funct(); - } - - mxEvent.consume(evt); - } - }); - } -}; - -/** - * - */ -var LayersWindow = function(editorUi, x, y, w, h) -{ - var graph = editorUi.editor.graph; - - var div = document.createElement('div'); - div.style.userSelect = 'none'; - div.style.background = (Dialog.backdropColor == 'white') ? 'whiteSmoke' : Dialog.backdropColor; - div.style.border = '1px solid whiteSmoke'; - div.style.height = '100%'; - div.style.marginBottom = '10px'; - div.style.overflow = 'auto'; - - var tbarHeight = (!EditorUi.compactUi) ? '30px' : '26px'; - - var listDiv = document.createElement('div') - listDiv.style.backgroundColor = (Dialog.backdropColor == 'white') ? '#dcdcdc' : '#e5e5e5'; - listDiv.style.position = 'absolute'; - listDiv.style.overflow = 'auto'; - listDiv.style.left = '0px'; - listDiv.style.right = '0px'; - listDiv.style.top = '0px'; - listDiv.style.bottom = (parseInt(tbarHeight) + 7) + 'px'; - div.appendChild(listDiv); - - var dragSource = null; - var dropIndex = null; - - mxEvent.addListener(div, 'dragover', function(evt) - { - evt.dataTransfer.dropEffect = 'move'; - dropIndex = 0; - evt.stopPropagation(); - evt.preventDefault(); - }); - - // Workaround for "no element found" error in FF - mxEvent.addListener(div, 'drop', function(evt) - { - evt.stopPropagation(); - evt.preventDefault(); - }); - - var layerCount = null; - var selectionLayer = null; - - var ldiv = document.createElement('div'); - - ldiv.className = 'geToolbarContainer'; - ldiv.style.position = 'absolute'; - ldiv.style.bottom = '0px'; - ldiv.style.left = '0px'; - ldiv.style.right = '0px'; - ldiv.style.height = tbarHeight; - ldiv.style.overflow = 'hidden'; - ldiv.style.padding = (!EditorUi.compactUi) ? '1px' : '4px 0px 3px 0px'; - ldiv.style.backgroundColor = (Dialog.backdropColor == 'white') ? 'whiteSmoke' : Dialog.backdropColor; - ldiv.style.borderWidth = '1px 0px 0px 0px'; - ldiv.style.borderColor = '#c3c3c3'; - ldiv.style.borderStyle = 'solid'; - ldiv.style.display = 'block'; - ldiv.style.whiteSpace = 'nowrap'; - - if (mxClient.IS_QUIRKS) - { - ldiv.style.filter = 'none'; - } - - var link = document.createElement('a'); - link.className = 'geButton'; - - if (mxClient.IS_QUIRKS) - { - link.style.filter = 'none'; - } - - var removeLink = link.cloneNode(); - removeLink.innerHTML = '
'; - - mxEvent.addListener(removeLink, 'click', function(evt) - { - if (graph.isEnabled()) - { - graph.model.beginUpdate(); - try - { - var index = graph.model.root.getIndex(selectionLayer); - graph.removeCells([selectionLayer], false); - - // Creates default layer if no layer exists - if (graph.model.getChildCount(graph.model.root) == 0) - { - graph.model.add(graph.model.root, new mxCell()); - graph.setDefaultParent(null); - } - else if (index > 0 && index <= graph.model.getChildCount(graph.model.root)) - { - graph.setDefaultParent(graph.model.getChildAt(graph.model.root, index - 1)); - } - else - { - graph.setDefaultParent(null); - } - } - finally - { - graph.model.endUpdate(); - } - } - - mxEvent.consume(evt); - }); - - if (!graph.isEnabled()) - { - removeLink.className = 'geButton mxDisabled'; - } - - ldiv.appendChild(removeLink); - - var insertLink = link.cloneNode(); - insertLink.innerHTML = '
'; - - mxEvent.addListener(insertLink, 'click', function(evt) - { - if (graph.isEnabled() && !graph.isSelectionEmpty()) - { - graph.moveCells(graph.getSelectionCells(), 0, 0, false, selectionLayer); - } - }); - - ldiv.appendChild(insertLink); - - var dataLink = link.cloneNode(); - dataLink.innerHTML = '
'; - dataLink.setAttribute('title', mxResources.get('rename')); - - mxEvent.addListener(dataLink, 'click', function(evt) - { - if (graph.isEnabled()) - { - editorUi.showDataDialog(selectionLayer); - } - - mxEvent.consume(evt); - }); - - if (!graph.isEnabled()) - { - dataLink.className = 'geButton mxDisabled'; - } - - ldiv.appendChild(dataLink); - - function renameLayer(layer) - { - if (graph.isEnabled() && layer != null) - { - var label = graph.convertValueToString(layer); - var dlg = new FilenameDialog(editorUi, label || mxResources.get('background'), mxResources.get('rename'), mxUtils.bind(this, function(newValue) - { - if (newValue != null) - { - graph.cellLabelChanged(layer, newValue); - } - }), mxResources.get('enterName')); - editorUi.showDialog(dlg.container, 300, 100, true, true); - dlg.init(); - } - }; - - var duplicateLink = link.cloneNode(); - duplicateLink.innerHTML = '
'; - - mxEvent.addListener(duplicateLink, 'click', function(evt) - { - if (graph.isEnabled()) - { - var newCell = null; - graph.model.beginUpdate(); - try - { - newCell = graph.cloneCells([selectionLayer])[0]; - graph.cellLabelChanged(newCell, mxResources.get('untitledLayer')); - newCell.setVisible(true); - newCell = graph.addCell(newCell, graph.model.root); - graph.setDefaultParent(newCell); - } - finally - { - graph.model.endUpdate(); - } - - if (newCell != null && !graph.isCellLocked(newCell)) - { - graph.selectAll(newCell); - } - } - }); - - if (!graph.isEnabled()) - { - duplicateLink.className = 'geButton mxDisabled'; - } - - ldiv.appendChild(duplicateLink); - - var addLink = link.cloneNode(); - addLink.innerHTML = '
'; - addLink.setAttribute('title', mxResources.get('addLayer')); - - mxEvent.addListener(addLink, 'click', function(evt) - { - if (graph.isEnabled()) - { - graph.model.beginUpdate(); - - try - { - var cell = graph.addCell(new mxCell(mxResources.get('untitledLayer')), graph.model.root); - graph.setDefaultParent(cell); - } - finally - { - graph.model.endUpdate(); - } - } - - mxEvent.consume(evt); - }); - - if (!graph.isEnabled()) - { - addLink.className = 'geButton mxDisabled'; - } - - ldiv.appendChild(addLink); - - div.appendChild(ldiv); - - function refresh() - { - layerCount = graph.model.getChildCount(graph.model.root) - listDiv.innerHTML = ''; - - function addLayer(index, label, child, defaultParent) - { - var ldiv = document.createElement('div'); - ldiv.className = 'geToolbarContainer'; - - ldiv.style.overflow = 'hidden'; - ldiv.style.position = 'relative'; - ldiv.style.padding = '4px'; - ldiv.style.height = '22px'; - ldiv.style.display = 'block'; - ldiv.style.backgroundColor = 'whiteSmoke'; - ldiv.style.borderWidth = '0px 0px 1px 0px'; - ldiv.style.borderColor = '#c3c3c3'; - ldiv.style.borderStyle = 'solid'; - ldiv.style.whiteSpace = 'nowrap'; - ldiv.setAttribute('title', label); - - var left = document.createElement('div'); - left.style.display = 'inline-block'; - left.style.width = '100%'; - left.style.textOverflow = 'ellipsis'; - left.style.overflow = 'hidden'; - - mxEvent.addListener(ldiv, 'dragover', function(evt) - { - evt.dataTransfer.dropEffect = 'move'; - dropIndex = index; - evt.stopPropagation(); - evt.preventDefault(); - }); - - mxEvent.addListener(ldiv, 'dragstart', function(evt) - { - dragSource = ldiv; - - // Workaround for no DnD on DIV in FF - if (mxClient.IS_FF) - { - // LATER: Check what triggers a parse as XML on this in FF after drop - evt.dataTransfer.setData('Text', ''); - } - }); - - mxEvent.addListener(ldiv, 'dragend', function(evt) - { - if (dragSource != null && dropIndex != null) - { - graph.addCell(child, graph.model.root, dropIndex); - } - - dragSource = null; - dropIndex = null; - evt.stopPropagation(); - evt.preventDefault(); - }); - - var btn = document.createElement('img'); - btn.setAttribute('draggable', 'false'); - btn.setAttribute('align', 'top'); - btn.setAttribute('border', '0'); - btn.style.padding = '4px'; - btn.setAttribute('title', mxResources.get('lockUnlock')); - - var state = graph.view.getState(child); - var style = (state != null) ? state.style : graph.getCellStyle(child); - - if (mxUtils.getValue(style, 'locked', '0') == '1') - { - btn.setAttribute('src', Dialog.prototype.lockedImage); - } - else - { - btn.setAttribute('src', Dialog.prototype.unlockedImage); - } - - if (graph.isEnabled()) - { - btn.style.cursor = 'pointer'; - } - - mxEvent.addListener(btn, 'click', function(evt) - { - if (graph.isEnabled()) - { - var value = null; - - graph.getModel().beginUpdate(); - try - { - value = (mxUtils.getValue(style, 'locked', '0') == '1') ? null : '1'; - graph.setCellStyles('locked', value, [child]); - } - finally - { - graph.getModel().endUpdate(); - } - - if (value == '1') - { - graph.removeSelectionCells(graph.getModel().getDescendants(child)); - } - - mxEvent.consume(evt); - } - }); - - left.appendChild(btn); - - var inp = document.createElement('input'); - inp.setAttribute('type', 'checkbox'); - inp.setAttribute('title', mxResources.get('hideIt', [child.value || mxResources.get('background')])); - inp.style.marginLeft = '4px'; - inp.style.marginRight = '6px'; - inp.style.marginTop = '4px'; - left.appendChild(inp); - - if (graph.model.isVisible(child)) - { - inp.setAttribute('checked', 'checked'); - inp.defaultChecked = true; - } - - mxEvent.addListener(inp, 'click', function(evt) - { - graph.model.setVisible(child, !graph.model.isVisible(child)); - mxEvent.consume(evt); - }); - - mxUtils.write(left, label); - ldiv.appendChild(left); - - if (graph.isEnabled()) - { - // Fallback if no drag and drop is available - if (mxClient.IS_TOUCH || mxClient.IS_POINTER || mxClient.IS_VML || - (mxClient.IS_IE && document.documentMode < 10)) - { - var right = document.createElement('div'); - right.style.display = 'block'; - right.style.textAlign = 'right'; - right.style.whiteSpace = 'nowrap'; - right.style.position = 'absolute'; - right.style.right = '6px'; - right.style.top = '6px'; - - // Poor man's change layer order - if (index > 0) - { - var img2 = document.createElement('a'); - - img2.setAttribute('title', mxResources.get('toBack')); - - img2.className = 'geButton'; - img2.style.cssFloat = 'none'; - img2.innerHTML = '▼'; - img2.style.width = '14px'; - img2.style.height = '14px'; - img2.style.fontSize = '14px'; - img2.style.margin = '0px'; - img2.style.marginTop = '-1px'; - right.appendChild(img2); - - mxEvent.addListener(img2, 'click', function(evt) - { - if (graph.isEnabled()) - { - graph.addCell(child, graph.model.root, index - 1); - } - - mxEvent.consume(evt); - }); - } - - if (index >= 0 && index < layerCount - 1) - { - var img1 = document.createElement('a'); - - img1.setAttribute('title', mxResources.get('toFront')); - - img1.className = 'geButton'; - img1.style.cssFloat = 'none'; - img1.innerHTML = '▲'; - img1.style.width = '14px'; - img1.style.height = '14px'; - img1.style.fontSize = '14px'; - img1.style.margin = '0px'; - img1.style.marginTop = '-1px'; - right.appendChild(img1); - - mxEvent.addListener(img1, 'click', function(evt) - { - if (graph.isEnabled()) - { - graph.addCell(child, graph.model.root, index + 1); - } - - mxEvent.consume(evt); - }); - } - - ldiv.appendChild(right); - } - - if (mxClient.IS_SVG && (!mxClient.IS_IE || document.documentMode >= 10)) - { - ldiv.setAttribute('draggable', 'true'); - ldiv.style.cursor = 'move'; - } - } - - mxEvent.addListener(ldiv, 'dblclick', function(evt) - { - var nodeName = mxEvent.getSource(evt).nodeName; - - if (nodeName != 'INPUT' && nodeName != 'IMG') - { - renameLayer(child); - mxEvent.consume(evt); - } - }); - - if (graph.getDefaultParent() == child) - { - ldiv.style.background = '#e6eff8'; - ldiv.style.fontWeight = (graph.isEnabled()) ? 'bold' : ''; - selectionLayer = child; - } - else - { - mxEvent.addListener(ldiv, 'click', function(evt) - { - if (graph.isEnabled()) - { - graph.setDefaultParent(defaultParent); - graph.view.setCurrentRoot(null); - refresh(); - } - }); - } - - listDiv.appendChild(ldiv); - }; - - // Cannot be moved or deleted - for (var i = layerCount - 1; i >= 0; i--) - { - (mxUtils.bind(this, function(child) - { - addLayer(i, graph.convertValueToString(child) || - mxResources.get('background'), child, child); - }))(graph.model.getChildAt(graph.model.root, i)); - } - - var label = graph.convertValueToString(selectionLayer) || mxResources.get('background'); - removeLink.setAttribute('title', mxResources.get('removeIt', [label])); - insertLink.setAttribute('title', mxResources.get('moveSelectionTo', [label])); - duplicateLink.setAttribute('title', mxResources.get('duplicateIt', [label])); - dataLink.setAttribute('title', mxResources.get('editData')); - - if (graph.isSelectionEmpty()) - { - insertLink.className = 'geButton mxDisabled'; - } - }; - - refresh(); - graph.model.addListener(mxEvent.CHANGE, function() - { - refresh(); - }); - - graph.selectionModel.addListener(mxEvent.CHANGE, function() - { - if (graph.isSelectionEmpty()) - { - insertLink.className = 'geButton mxDisabled'; - } - else - { - insertLink.className = 'geButton'; - } - }); - - this.window = new mxWindow(mxResources.get('layers'), div, x, y, w, h, true, true); - this.window.minimumSize = new mxRectangle(0, 0, 120, 120); - this.window.destroyOnClose = false; - this.window.setMaximizable(false); - this.window.setResizable(true); - this.window.setClosable(true); - this.window.setVisible(true); - - // Make refresh available via instance - this.refreshLayers = refresh; - - this.window.setLocation = function(x, y) - { - var iw = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; - var ih = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; - - x = Math.max(0, Math.min(x, iw - this.table.clientWidth)); - y = Math.max(0, Math.min(y, ih - this.table.clientHeight - 48)); - - if (this.getX() != x || this.getY() != y) - { - mxWindow.prototype.setLocation.apply(this, arguments); - } - }; - - var resizeListener = mxUtils.bind(this, function() - { - var x = this.window.getX(); - var y = this.window.getY(); - - this.window.setLocation(x, y); - }); - - mxEvent.addListener(window, 'resize', resizeListener); - - this.destroy = function() - { - mxEvent.removeListener(window, 'resize', resizeListener); - this.window.destroy(); - } -}; diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Editor.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Editor.js deleted file mode 100644 index 39838cd2..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Editor.js +++ /dev/null @@ -1,2252 +0,0 @@ -/** - * Copyright (c) 2006-2012, JGraph Ltd - */ -/** - * Editor constructor executed on page load. - */ -Editor = function(chromeless, themes, model, graph, editable) -{ - mxEventSource.call(this); - this.chromeless = (chromeless != null) ? chromeless : this.chromeless; - this.initStencilRegistry(); - this.graph = graph || this.createGraph(themes, model); - this.editable = (editable != null) ? editable : !chromeless; - this.undoManager = this.createUndoManager(); - this.status = ''; - - this.getOrCreateFilename = function() - { - return this.filename || mxResources.get('drawing', [Editor.pageCounter]) + '.xml'; - }; - - this.getFilename = function() - { - return this.filename; - }; - - // Sets the status and fires a statusChanged event - this.setStatus = function(value) - { - this.status = value; - this.fireEvent(new mxEventObject('statusChanged')); - }; - - // Returns the current status - this.getStatus = function() - { - return this.status; - }; - - // Updates modified state if graph changes - this.graphChangeListener = function(sender, eventObject) - { - var edit = (eventObject != null) ? eventObject.getProperty('edit') : null; - - if (edit == null || !edit.ignoreEdit) - { - this.setModified(true); - } - }; - - this.graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function() - { - this.graphChangeListener.apply(this, arguments); - })); - - // Sets persistent graph state defaults - this.graph.resetViewOnRootChange = false; - this.init(); -}; - -/** - * Counts open editor tabs (must be global for cross-window access) - */ -Editor.pageCounter = 0; - -// Cross-domain window access is not allowed in FF, so if we -// were opened from another domain then this will fail. -(function() -{ - try - { - var op = window; - - while (op.opener != null && typeof op.opener.Editor !== 'undefined' && - !isNaN(op.opener.Editor.pageCounter) && - // Workaround for possible infinite loop in FF https://drawio.atlassian.net/browse/DS-795 - op.opener != op) - { - op = op.opener; - } - - // Increments the counter in the first opener in the chain - if (op != null) - { - op.Editor.pageCounter++; - Editor.pageCounter = op.Editor.pageCounter; - } - } - catch (e) - { - // ignore - } -})(); - -/** - * Specifies if local storage should be used (eg. on the iPad which has no filesystem) - */ -Editor.useLocalStorage = typeof(Storage) != 'undefined' && mxClient.IS_IOS; - -/** - * Images below are for lightbox and embedding toolbars. - */ -Editor.helpImage = (mxClient.IS_SVG) ? 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5BxTwAAAAH3RSTlMAlUF8boNQIE0LBgOgkGlHNSwqFIx/dGVUOjApmV9ezNACSAAAAIVJREFUGNNtjNsOgzAMQ5NeoVcKDAZs+//PXLKI8YKlWvaRU7jXuFpb9qsbdK05XILUiE8JHQox1Pv3OgFUzf1AGqWqUg+QBwLF0YAeegBlCNgRWOpB5vUfTCmeoHQ/wNdy0jLH/cM+b+wLTw4n/7ACEmHVVy8h6qy8V7MNcGowWpsNbvUFcGUEdSi1s/oAAAAASUVORK5CYII=' : - IMAGE_PATH + '/help.png'; - -/** - * Sets the default font size. - */ -Editor.checkmarkImage = (mxClient.IS_SVG) ? 'data:image/gif;base64,R0lGODlhFQAVAMQfAGxsbHx8fIqKioaGhvb29nJycvr6+sDAwJqamltbW5OTk+np6YGBgeTk5Ly8vJiYmP39/fLy8qWlpa6ursjIyOLi4vj4+N/f3+3t7fT09LCwsHZ2dubm5r6+vmZmZv///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OEY4NTZERTQ5QUFBMTFFMUE5MTVDOTM5MUZGMTE3M0QiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OEY4NTZERTU5QUFBMTFFMUE5MTVDOTM5MUZGMTE3M0QiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Rjg1NkRFMjlBQUExMUUxQTkxNUM5MzkxRkYxMTczRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Rjg1NkRFMzlBQUExMUUxQTkxNUM5MzkxRkYxMTczRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAB8ALAAAAAAVABUAAAVI4CeOZGmeaKqubKtylktSgCOLRyLd3+QJEJnh4VHcMoOfYQXQLBcBD4PA6ngGlIInEHEhPOANRkaIFhq8SuHCE1Hb8Lh8LgsBADs=' : - IMAGE_PATH + '/checkmark.gif'; - -/** - * Images below are for lightbox and embedding toolbars. - */ -Editor.maximizeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAElBMVEUAAAAAAAAAAAAAAAAAAAAAAADgKxmiAAAABXRSTlMA758vX1Pw3BoAAABJSURBVAjXY8AJQkODGBhUQ0MhbAUGBiYY24CBgRnGFmZgMISwgwwDGRhEhVVBbAVmEQYGRwMmBjIAQi/CTIRd6G5AuA3dzYQBAHj0EFdHkvV4AAAAAElFTkSuQmCC'; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.zoomOutImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAElBMVEUAAAAAAAAsLCxxcXEhISFgYGChjTUxAAAAAXRSTlMAQObYZgAAAEdJREFUCNdjIAMwCQrB2YKCggJQJqMwA7MglK1owMBgqABVApITgLJZXFxgbIQ4Qj3CHIT5ggoIe5kgNkM1KSDYKBKqxPkDAPo5BAZBE54hAAAAAElFTkSuQmCC'; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.zoomInImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAElBMVEUAAAAAAAAsLCwhISFxcXFgYGBavKaoAAAAAXRSTlMAQObYZgAAAElJREFUCNdjIAMwCQrB2YKCggJQJqMIA4sglK3owMzgqABVwsDMwCgAZTMbG8PYCHGEeoQ5CPMFFRD2MkFshmpSQLBRJFSJ8wcAEqcEM2uhl2MAAAAASUVORK5CYII='; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.zoomFitImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVBAMAAABbObilAAAAD1BMVEUAAAAAAAAwMDBwcHBgYGC1xl09AAAAAXRSTlMAQObYZgAAAEFJREFUCNdjIAMwCQrB2YKCggJQJqMwA7MglK1owMBgqABVApITwMdGqEeYgzBfUAFhLxPEZqgmBQQbRUKFOH8AAK5OA3lA+FFOAAAAAElFTkSuQmCC'; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.layersImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAMAAACeyVWkAAAAaVBMVEUAAAAgICAICAgdHR0PDw8WFhYICAgLCwsXFxcvLy8ODg4uLi4iIiIqKiokJCQYGBgKCgonJycFBQUCAgIqKiocHBwcHBwODg4eHh4cHBwnJycJCQkUFBQqKiojIyMuLi4ZGRkgICAEBATOWYXAAAAAGnRSTlMAD7+fnz8/H7/ff18/77+vr5+fn39/b28fH2xSoKsAAACQSURBVBjTrYxJEsMgDARZZMAY73sgCcn/HxnhKtnk7j6oRq0psfuoyndZ/SuODkHPLzfVT6KeyPePnJ7KrnkRjWMXTn4SMnN8mXe2SSM3ts8L/ZUxxrbAULSYJJULE0Iw9pjpenoICcgcX61mGgTgtCv9Be99pzCoDhNQWQnchD1mup5++CYGcoQexajZbfwAj/0MD8ZOaUgAAAAASUVORK5CYII='; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.previousImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAAh0lEQVQ4je3UsQnCUBCA4U8hpa1NsoEjpHQJS0dxADdwEMuMIJkgA1hYChbGQgMi+JC8q4L/AB/vDu7x74cWWEZhJU44RmA1zujR5GIbXF9YNrjD/Q0bDRY4fEBZ4P4LlgTnCbAf84pUM8/9hY08tMUtEoQ1LpEgrNBFglChFXR6Q6GfwwR6AGKJMF74Vtt3AAAAAElFTkSuQmCC'; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.nextImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAAi0lEQVQ4jeXUIQ7CUAwA0MeGxWI2yylwnALJUdBcgYvM7QYLmjOQIAkIPmJZghiIvypoUtX0tfnJL38X5ZfaEgUeUcManFBHgS0SLlhHggk3bCPBhCf2keCQR8wjwYTDp6YiZxJmOU1jGw7vGALescuBxsArNlOwd/CM1VSM/ut1qCIw+uOwiMJ+OF4CQzBCXm3hyAAAAABJRU5ErkJggg=='; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.editImage = (mxClient.IS_SVG) ? 'data:image/gif;base64,R0lGODlhCwALAIABAFdXV////yH5BAEAAAEALAAAAAALAAsAAAIZjB8AiKuc4jvLOGqzrjX6zmkWyChXaUJBAQA7' : IMAGE_PATH + '/edit.gif'; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.zoomOutLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAilBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2N2iNAAAALXRSTlMA+vTcKMM96GRBHwXxi0YaX1HLrKWhiHpWEOnOr52Vb2xKSDcT19PKv5l/Ngdk8+viAAABJklEQVQ4y4WT2XaDMAxEvWD2nSSUNEnTJN3r//+9Sj7ILAY6L0ijC4ONYVZRpo6cByrz2YKSUGorGTpz71lPVHvT+avoB5wIkU/mxk8veceSuNoLg44IzziXjvpih72wKQnm8yc2UoiP/LAd8jQfe2Xf4Pq+2EyYIvv9wbzHHCgwxDdlBtWZOdqDfTCVgqpygQpsZaojVAVc9UjQxnAJDIBhiQv84tq3gMQCAVTxVoSibXJf8tMuc7e1TB/DCmejBNg/w1Y3c+AM5vv4w7xM59/oXamrHaLVqPQ+OTCnmMZxgz0SdL5zji0/ld6j88qGa5KIiBB6WeJGKfUKwSMKLuXgvl1TW0tm5R9UQL/efSDYsnzxD8CinhBsTTdugJatKpJwf8v+ADb8QmvW7AeAAAAAAElFTkSuQmCC'; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.zoomInLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAilBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2N2iNAAAALXRSTlMA+vTcKMM96GRBHwXxi0YaX1HLrKWhiHpWEOnOr52Vb2xKSDcT19PKv5l/Ngdk8+viAAABKElEQVQ4y4WT6WKCMBCENwkBwn2oFKvWqr3L+79es4EkQIDOH2d3Pxk2ABiJlB8JCXjqw4LikHVGLHTm3nM3UeVN5690GBBN0GwyV/3kkrUQR+WeKnREeKpzaXWd77CmJiXGfPIEI4V4yQ9TIW/ntlcMBe731Vts9w5TWG8F5j3mQI4hvrKpdGeYA7CX9qAcl650gVJartxRuhyHVghF8idQAIbFLvCLu28BsQEC6aKtCK6Pyb3JT7PmbmtNH8Ny56CotD/2qOs5cJbuffxgXmCib+xddVU5RNOhkvvkhTlFehzVWCOh3++MYElOhfdovaImnRYVmqDdsuhNp1QrBBE6uGC2+3ZNjGdg5B94oD+9uyVgWT79BwAxEBTWdOu3bWBVgsn/N/AHUD9IC01Oe40AAAAASUVORK5CYII='; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.actualSizeLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAilBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////2N2iNAAAALXRSTlMA+vTcKMM96GRBHwXxi0YaX1HLrKWhiHpWEOnOr52Vb2xKSDcT19PKv5l/Ngdk8+viAAABIUlEQVQ4y4WT2XqDIBCFBxDc9yTWNEnTJN3r+79eGT4BEbXnaubMr8dBBaM450dCQp4LWFAascGIRd48eB4cNYE7f6XjgGiCFs5c+dml6CFN6j1V6IQIlHPpdV/usKcmJcV88gQTRXjLD9Mhb+fWq8YG9/uCmTCFjeeDeY85UGKIUGUuqzN42kv7oCouq9oHamlzVR1lVfpAIu1QVRiW+sAv7r4FpAYIZZVsRXB9TP5Dfpo1d1trCgzz1iiptH/sUbdz4CzN9+mLeXHn3+hdddd4RDegsrvzwZwSs2GLPRJidAqCLTlVwaMPqpYMWjTWBB2WRW86pVkhSKyDK2bdt2tmagZG4sBD/evdLQHLEvQfAOKRoLCmG1FAB6uKmby+gz+REDn7O5+EwQAAAABJRU5ErkJggg=='; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.printLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAXVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9RKvvlAAAAHnRSTlMAydnl77qbMLT093H7K4Nd4Ktn082+lYt5bkklEgP44nQSAAAApUlEQVQ4y73P2Q6DIBRF0cOgbRHHzhP//5m9mBAQKjG1cT0Yc7ITAMu1LNQgUZiQ2DYoNQ0sCQb6qgHAfRx48opq3J9AZ6xuF7uOew8Ik1OsCZRS2UAC9V+D9a+QZYxNA45YFQftPtSkATOhw7dAc0vPBwKWiIOjP0JZ0yMuQJ27g36DipOUsqRAM0dR8KD1/ILHaHSE/w8DIx09E3g/BTce6rHUB5sAPKvfF+JdAAAAAElFTkSuQmCC'; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.layersLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAmVBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v7///+bnZkkAAAAMnRSTlMABPr8ByiD88KsTi/rvJb272mjeUA1CuPe1M/KjVxYHxMP6KZ0S9nYzGRGGRaznpGIbzaGUf0AAAHESURBVDjLbZLZYoIwEEVDgLCjbKIgAlqXqt3m/z+uNwu1rcyDhjl3ktnYL7OY254C0VX3yWFZfzDrOClbbgKxi0YDHjwl4jbnRkXxJS/C1YP3DbBhD1n7Ex4uaAqdVDb3yJ/4J/3nJD2to/ngQz/DfUvzMp4JJ5sSCaF5oXmemgQDfDxzbi+Kq4sU+vNcuAmx94JtyOP2DD4Epz2asWSCz4Z/4fECxyNj9zC9xNLHcdPEO+awDKeSaUu0W4twZQiO2hYVisTR3RCtK/c1X6t4xMEpiGqXqVntEBLolkZZsKY4QtwH6jzq67dEHlJysB1aNOD3XT7n1UkasQN59L4yC2RELMDSeCRtz3yV22Ub3ozIUTknYx8JWqDdQxbUes98cR2kZtUSveF/bAhcedwEWmlxIkpZUy4XOCb6VBjjxHvbwo/1lBAHHi2JCr0NI570QhyHq/DhJoE2lLgyA4RVe6KmZ47O/3b86MCP0HWa73A8/C3SUc5Qc1ajt6fgpXJ+RGpMvDSchepZDOOQRcZVIKcK90x2D7etqtI+56+u6n3sPriO6nfphitR4+O2m3EbM7lh3me1FM1o+LMI887rN+s3/wZdTFlpNVJiOAAAAABJRU5ErkJggg=='; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.closeLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAUVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////8IN+deAAAAGnRSTlMAuvAIg/dDM/QlOeuFhj0S5s4vKgzjxJRQNiLSey0AAADNSURBVDjLfZLbEoMgDEQjRRRs1XqX///QNmOHJSnjPkHOGR7IEmeoGtJZstnwjqbRfIsmgEdtPCqe9Ynz7ZSc07rE2QiSc+qv8TvjRXA2PDUm3dpe82iJhOEUfxJJo3aCv+jKmRmH4lcCjCjeh9GWOdL/GZZkXH3PYYDrHBnfc4D/RVZf5sjoC1was+Y6HQxwaUxFvq/a0Pv343VCTxfBSRiB+ab3M3eiQZXmMNBJ3Y8pGRZtYQ7DgHMXJEdPLTaN/qBjzJOBc3nmNcbsA16bMR0oLqf+AAAAAElFTkSuQmCC'; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.editLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAgVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9d3yJTAAAAKnRSTlMA+hzi3nRQWyXzkm0h2j3u54gzEgSXjlYoTBgJxL2loGpAOS3Jt7Wxm35Ga7gRAAAA6UlEQVQ4y63Q2XaCMBSF4Q0JBasoQ5DJqbXjfv8HbCK2BZNwo/8FXHx7rcMC7lQu0iX8qU/qtvAWCpoqH8dYzS0SwaV5eK/UAf8X9pd2CWKzuF5Jrftp1owXwnIGLUaL3PYndOHf4kNNXWrXK/m7CHunk7K8LE6YtBpcknwG9GKxnroY+ylBXcx4xKyx/u/EuXi509cP9V7OO1oyHnzrdFTcqLG/4ibBA5pIMr/4xvKzuQDkVy9wW8SgBFD6HDvuzMvrZcC9QlkfMzI7w64m+b4PqBMNHB05lH21PVxJo2/fBXxV4hB38PcD+5AkI4FuETsAAAAASUVORK5CYII='; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.previousLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAPFBMVEUAAAD////////////////////////////////////////////////////////////////////////////YSWgTAAAAE3RSTlMA7fci493c0MW8uJ6CZks4MxQHEZL6ewAAAFZJREFUOMvdkskRgDAMA4lDwg2B7b9XOlge/KKvdsa25KFb5XlRvxXC/DNBEv8IFNjBgGdDgXtFgTyhwDXiQAUHCvwa4Uv6mR6UR+1led2mVonvl+tML45qCQNQLIx7AAAAAElFTkSuQmCC'; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.nextLargeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAPFBMVEUAAAD////////////////////////////////////////////////////////////////////////////YSWgTAAAAE3RSTlMA7fci493c0MW8uJ6CZks4MxQHEZL6ewAAAFRJREFUOMvd0skRgCAQBVEFwQ0V7fxzNQP6wI05v6pZ/kyj1b7FNgik2gQzzLcAwiUAigHOTwDHK4A1CmB5BJANJG1hQ9qafYcqFlZP3IFc9eVGrR+iIgkDQRUXIAAAAABJRU5ErkJggg=='; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.ctrlKey = (mxClient.IS_MAC) ? 'Cmd' : 'Ctrl'; - -/** - * Specifies if the diagram should be saved automatically if possible. Default - * is true. - */ -Editor.popupsAllowed = true; - -/** - * Editor inherits from mxEventSource - */ -mxUtils.extend(Editor, mxEventSource); - -/** - * Stores initial state of mxClient.NO_FO. - */ -Editor.prototype.originalNoForeignObject = mxClient.NO_FO; - -/** - * Specifies the image URL to be used for the transparent background. - */ -Editor.prototype.transparentImage = (mxClient.IS_SVG) ? 'data:image/gif;base64,R0lGODlhMAAwAIAAAP///wAAACH5BAEAAAAALAAAAAAwADAAAAIxhI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8egpAAA7' : - IMAGE_PATH + '/transparent.gif'; - -/** - * Specifies if the canvas should be extended in all directions. Default is true. - */ -Editor.prototype.extendCanvas = true; - -/** - * Specifies if the app should run in chromeless mode. Default is false. - * This default is only used if the contructor argument is null. - */ -Editor.prototype.chromeless = false; - -/** - * Specifies the order of OK/Cancel buttons in dialogs. Default is true. - * Cancel first is used on Macs, Windows/Confluence uses cancel last. - */ -Editor.prototype.cancelFirst = true; - -/** - * Specifies if the editor is enabled. Default is true. - */ -Editor.prototype.enabled = true; - -/** - * Contains the name which was used for the last save. Default value is null. - */ -Editor.prototype.filename = null; - -/** - * Contains the current modified state of the diagram. This is false for - * new diagrams and after the diagram was saved. - */ -Editor.prototype.modified = false; - -/** - * Specifies if the diagram should be saved automatically if possible. Default - * is true. - */ -Editor.prototype.autosave = true; - -/** - * Specifies the top spacing for the initial page view. Default is 0. - */ -Editor.prototype.initialTopSpacing = 0; - -/** - * Specifies the app name. Default is document.title. - */ -Editor.prototype.appName = document.title; - -/** - * - */ -Editor.prototype.editBlankUrl = window.location.protocol + '//' + window.location.host + '/'; - -/** - * Initializes the environment. - */ -Editor.prototype.init = function() { }; - -/** - * Sets the XML node for the current diagram. - */ -Editor.prototype.isChromelessView = function() -{ - return this.chromeless; -}; - -/** - * Sets the XML node for the current diagram. - */ -Editor.prototype.setAutosave = function(value) -{ - this.autosave = value; - this.fireEvent(new mxEventObject('autosaveChanged')); -}; - -/** - * - */ -Editor.prototype.getEditBlankUrl = function(params) -{ - return this.editBlankUrl + params; -} - -/** - * - */ -Editor.prototype.editAsNew = function(xml, title) -{ - var p = (title != null) ? '?title=' + encodeURIComponent(title) : ''; - - if (urlParams['ui'] != null) - { - p += ((p.length > 0) ? '&' : '?') + 'ui=' + urlParams['ui']; - } - - if (this.editorWindow != null && !this.editorWindow.closed) - { - this.editorWindow.focus(); - } - else - { - if (typeof window.postMessage !== 'undefined' && (document.documentMode == null || document.documentMode >= 10)) - { - if (this.editorWindow == null) - { - mxEvent.addListener(window, 'message', mxUtils.bind(this, function(evt) - { - if (evt.data == 'ready' && evt.source == this.editorWindow) - { - this.editorWindow.postMessage(xml, '*'); - } - })); - } - - this.editorWindow = this.graph.openLink(this.getEditBlankUrl(p + - ((p.length > 0) ? '&' : '?') + 'client=1')); - } - else - { - this.editorWindow = this.graph.openLink(this.getEditBlankUrl(p) + - '#R' + encodeURIComponent(xml)); - } - } -}; - -/** - * Sets the XML node for the current diagram. - */ -Editor.prototype.createGraph = function(themes, model) -{ - var graph = new Graph(null, model, null, null, themes); - graph.transparentBackground = false; - - // Opens all links in a new window while editing - if (!this.chromeless) - { - graph.isBlankLink = function(href) - { - return !this.isExternalProtocol(href); - }; - } - - return graph; -}; - -/** - * Sets the XML node for the current diagram. - */ -Editor.prototype.resetGraph = function() -{ - this.graph.gridEnabled = !this.isChromelessView() || urlParams['grid'] == '1'; - this.graph.graphHandler.guidesEnabled = true; - this.graph.setTooltips(true); - this.graph.setConnectable(true); - this.graph.foldingEnabled = true; - this.graph.scrollbars = this.graph.defaultScrollbars; - this.graph.pageVisible = this.graph.defaultPageVisible; - this.graph.pageBreaksVisible = this.graph.pageVisible; - this.graph.preferPageSize = this.graph.pageBreaksVisible; - this.graph.background = this.graph.defaultGraphBackground; - this.graph.pageScale = mxGraph.prototype.pageScale; - this.graph.pageFormat = mxGraph.prototype.pageFormat; - this.graph.currentScale = 1; - this.graph.currentTranslate.x = 0; - this.graph.currentTranslate.y = 0; - this.updateGraphComponents(); - this.graph.view.setScale(1); -}; - -/** - * Sets the XML node for the current diagram. - */ -Editor.prototype.readGraphState = function(node) -{ - this.graph.gridEnabled = node.getAttribute('grid') != '0' && (!this.isChromelessView() || urlParams['grid'] == '1'); - this.graph.gridSize = parseFloat(node.getAttribute('gridSize')) || mxGraph.prototype.gridSize; - this.graph.graphHandler.guidesEnabled = node.getAttribute('guides') != '0'; - this.graph.setTooltips(node.getAttribute('tooltips') != '0'); - this.graph.setConnectable(node.getAttribute('connect') != '0'); - this.graph.connectionArrowsEnabled = node.getAttribute('arrows') != '0'; - this.graph.foldingEnabled = node.getAttribute('fold') != '0'; - - if (this.isChromelessView() && this.graph.foldingEnabled) - { - this.graph.foldingEnabled = urlParams['nav'] == '1'; - this.graph.cellRenderer.forceControlClickHandler = this.graph.foldingEnabled; - } - - var ps = node.getAttribute('pageScale'); - - if (ps != null) - { - this.graph.pageScale = ps; - } - else - { - this.graph.pageScale = mxGraph.prototype.pageScale; - } - - if (!this.graph.isLightboxView()) - { - var pv = node.getAttribute('page'); - - if (pv != null) - { - this.graph.pageVisible = (pv != '0'); - } - else - { - this.graph.pageVisible = this.graph.defaultPageVisible; - } - } - else - { - this.graph.pageVisible = false; - } - - this.graph.pageBreaksVisible = this.graph.pageVisible; - this.graph.preferPageSize = this.graph.pageBreaksVisible; - - var pw = node.getAttribute('pageWidth'); - var ph = node.getAttribute('pageHeight'); - - if (pw != null && ph != null) - { - this.graph.pageFormat = new mxRectangle(0, 0, parseFloat(pw), parseFloat(ph)); - } - - // Loads the persistent state settings - var bg = node.getAttribute('background'); - - if (bg != null && bg.length > 0) - { - this.graph.background = bg; - } - else - { - this.graph.background = this.graph.defaultGraphBackground; - } -}; - -/** - * Sets the XML node for the current diagram. - */ -Editor.prototype.setGraphXml = function(node) -{ - if (node != null) - { - var dec = new mxCodec(node.ownerDocument); - - if (node.nodeName == 'mxGraphModel') - { - this.graph.model.beginUpdate(); - - try - { - this.graph.model.clear(); - this.graph.view.scale = 1; - this.readGraphState(node); - this.updateGraphComponents(); - dec.decode(node, this.graph.getModel()); - } - finally - { - this.graph.model.endUpdate(); - } - - this.fireEvent(new mxEventObject('resetGraphView')); - } - else if (node.nodeName == 'root') - { - this.resetGraph(); - - // Workaround for invalid XML output in Firefox 20 due to bug in mxUtils.getXml - var wrapper = dec.document.createElement('mxGraphModel'); - wrapper.appendChild(node); - - dec.decode(wrapper, this.graph.getModel()); - this.updateGraphComponents(); - this.fireEvent(new mxEventObject('resetGraphView')); - } - else - { - throw { - message: mxResources.get('cannotOpenFile'), - node: node, - toString: function() { return this.message; } - }; - } - } - else - { - this.resetGraph(); - this.graph.model.clear(); - this.fireEvent(new mxEventObject('resetGraphView')); - } -}; - -/** - * Returns the XML node that represents the current diagram. - */ -Editor.prototype.getGraphXml = function(ignoreSelection) -{ - ignoreSelection = (ignoreSelection != null) ? ignoreSelection : true; - var node = null; - - if (ignoreSelection) - { - var enc = new mxCodec(mxUtils.createXmlDocument()); - node = enc.encode(this.graph.getModel()); - } - else - { - node = this.graph.encodeCells(mxUtils.sortCells(this.graph.model.getTopmostCells( - this.graph.getSelectionCells()))); - } - - if (this.graph.view.translate.x != 0 || this.graph.view.translate.y != 0) - { - node.setAttribute('dx', Math.round(this.graph.view.translate.x * 100) / 100); - node.setAttribute('dy', Math.round(this.graph.view.translate.y * 100) / 100); - } - - node.setAttribute('grid', (this.graph.isGridEnabled()) ? '1' : '0'); - node.setAttribute('gridSize', this.graph.gridSize); - node.setAttribute('guides', (this.graph.graphHandler.guidesEnabled) ? '1' : '0'); - node.setAttribute('tooltips', (this.graph.tooltipHandler.isEnabled()) ? '1' : '0'); - node.setAttribute('connect', (this.graph.connectionHandler.isEnabled()) ? '1' : '0'); - node.setAttribute('arrows', (this.graph.connectionArrowsEnabled) ? '1' : '0'); - node.setAttribute('fold', (this.graph.foldingEnabled) ? '1' : '0'); - node.setAttribute('page', (this.graph.pageVisible) ? '1' : '0'); - node.setAttribute('pageScale', this.graph.pageScale); - node.setAttribute('pageWidth', this.graph.pageFormat.width); - node.setAttribute('pageHeight', this.graph.pageFormat.height); - - if (this.graph.background != null) - { - node.setAttribute('background', this.graph.background); - } - - return node; -}; - -/** - * Keeps the graph container in sync with the persistent graph state - */ -Editor.prototype.updateGraphComponents = function() -{ - var graph = this.graph; - - if (graph.container != null) - { - graph.view.validateBackground(); - graph.container.style.overflow = (graph.scrollbars) ? 'auto' : 'hidden'; - - this.fireEvent(new mxEventObject('updateGraphComponents')); - } -}; - -/** - * Sets the modified flag. - */ -Editor.prototype.setModified = function(value) -{ - this.modified = value; -}; - -/** - * Sets the filename. - */ -Editor.prototype.setFilename = function(value) -{ - this.filename = value; -}; - -/** - * Creates and returns a new undo manager. - */ -Editor.prototype.createUndoManager = function() -{ - var graph = this.graph; - var undoMgr = new mxUndoManager(); - - this.undoListener = function(sender, evt) - { - undoMgr.undoableEditHappened(evt.getProperty('edit')); - }; - - // Installs the command history - var listener = mxUtils.bind(this, function(sender, evt) - { - this.undoListener.apply(this, arguments); - }); - - graph.getModel().addListener(mxEvent.UNDO, listener); - graph.getView().addListener(mxEvent.UNDO, listener); - - // Keeps the selection in sync with the history - var undoHandler = function(sender, evt) - { - var cand = graph.getSelectionCellsForChanges(evt.getProperty('edit').changes); - var model = graph.getModel(); - var cells = []; - - for (var i = 0; i < cand.length; i++) - { - if ((model.isVertex(cand[i]) || model.isEdge(cand[i])) && graph.view.getState(cand[i]) != null) - { - cells.push(cand[i]); - } - } - - graph.setSelectionCells(cells); - }; - - undoMgr.addListener(mxEvent.UNDO, undoHandler); - undoMgr.addListener(mxEvent.REDO, undoHandler); - - return undoMgr; -}; - -/** - * Adds basic stencil set (no namespace). - */ -Editor.prototype.initStencilRegistry = function() { }; - -/** - * Creates and returns a new undo manager. - */ -Editor.prototype.destroy = function() -{ - if (this.graph != null) - { - this.graph.destroy(); - this.graph = null; - } -}; - -/** - * Class for asynchronously opening a new window and loading a file at the same - * time. This acts as a bridge between the open dialog and the new editor. - */ -OpenFile = function(done) -{ - this.producer = null; - this.consumer = null; - this.done = done; - this.args = null; -}; - -/** - * Registers the editor from the new window. - */ -OpenFile.prototype.setConsumer = function(value) -{ - this.consumer = value; - this.execute(); -}; - -/** - * Sets the data from the loaded file. - */ -OpenFile.prototype.setData = function() -{ - this.args = arguments; - this.execute(); -}; - -/** - * Displays an error message. - */ -OpenFile.prototype.error = function(msg) -{ - this.cancel(true); - mxUtils.alert(msg); -}; - -/** - * Consumes the data. - */ -OpenFile.prototype.execute = function() -{ - if (this.consumer != null && this.args != null) - { - this.cancel(false); - this.consumer.apply(this, this.args); - } -}; - -/** - * Cancels the operation. - */ -OpenFile.prototype.cancel = function(cancel) -{ - if (this.done != null) - { - this.done((cancel != null) ? cancel : true); - } -}; - -/** - * Basic dialogs that are available in the viewer (print dialog). - */ -function Dialog(editorUi, elt, w, h, modal, closable, onClose, noScroll) -{ - var dx = 0; - - if (mxClient.IS_VML && (document.documentMode == null || document.documentMode < 8)) - { - // Adds padding as a workaround for box model in older IE versions - // This needs to match the total padding of geDialog in CSS - dx = 80; - } - - w += dx; - h += dx; - - var w0 = w; - var h0 = h; - - // clientHeight check is attempted fix for print dialog offset in viewer lightbox - var dh = (document.documentElement.clientHeight > 0) ? document.documentElement.clientHeight : - Math.max(document.body.clientHeight || 0, document.documentElement.clientHeight); - var left = Math.max(1, Math.round((document.body.clientWidth - w - 64) / 2)); - var top = Math.max(1, Math.round((dh - h - editorUi.footerHeight) / 3)); - - // Keeps window size inside available space - if (!mxClient.IS_QUIRKS) - { - elt.style.maxHeight = '100%'; - } - - w = Math.min(w, document.body.scrollWidth - 64); - h = Math.min(h, dh - 64); - - // Increments zIndex to put subdialogs and background over existing dialogs and background - if (editorUi.dialogs.length > 0) - { - this.zIndex += editorUi.dialogs.length * 2; - } - - if (this.bg == null) - { - this.bg = editorUi.createDiv('background'); - this.bg.style.position = 'absolute'; - this.bg.style.background = Dialog.backdropColor; - this.bg.style.height = dh + 'px'; - this.bg.style.right = '0px'; - this.bg.style.zIndex = this.zIndex - 2; - - mxUtils.setOpacity(this.bg, this.bgOpacity); - - if (mxClient.IS_QUIRKS) - { - new mxDivResizer(this.bg); - } - } - - var origin = mxUtils.getDocumentScrollOrigin(document); - this.bg.style.left = origin.x + 'px'; - this.bg.style.top = origin.y + 'px'; - left += origin.x; - top += origin.y; - - if (modal) - { - document.body.appendChild(this.bg); - } - - var div = editorUi.createDiv('geDialog'); - var pos = this.getPosition(left, top, w, h); - left = pos.x; - top = pos.y; - - div.style.width = w + 'px'; - div.style.height = h + 'px'; - div.style.left = left + 'px'; - div.style.top = top + 'px'; - div.style.zIndex = this.zIndex; - - div.appendChild(elt); - document.body.appendChild(div); - - // Adds vertical scrollbars if needed - if (!noScroll && elt.clientHeight > div.clientHeight - 64) - { - elt.style.overflowY = 'auto'; - } - - if (closable) - { - var img = document.createElement('img'); - - img.setAttribute('src', Dialog.prototype.closeImage); - img.setAttribute('title', mxResources.get('close')); - img.className = 'geDialogClose'; - img.style.top = (top + 14) + 'px'; - img.style.left = (left + w + 38 - dx) + 'px'; - img.style.zIndex = this.zIndex; - - mxEvent.addListener(img, 'click', mxUtils.bind(this, function() - { - editorUi.hideDialog(true); - })); - - document.body.appendChild(img); - this.dialogImg = img; - - mxEvent.addGestureListeners(this.bg, null, null, mxUtils.bind(this, function(evt) - { - editorUi.hideDialog(true); - })); - } - - this.resizeListener = mxUtils.bind(this, function() - { - dh = Math.max(document.body.clientHeight, document.documentElement.clientHeight); - this.bg.style.height = dh + 'px'; - - left = Math.max(1, Math.round((document.body.clientWidth - w - 64) / 2)); - top = Math.max(1, Math.round((dh - h - editorUi.footerHeight) / 3)); - w = Math.min(w0, document.body.scrollWidth - 64); - h = Math.min(h0, dh - 64); - - var pos = this.getPosition(left, top, w, h); - left = pos.x; - top = pos.y; - - div.style.left = left + 'px'; - div.style.top = top + 'px'; - div.style.width = w + 'px'; - div.style.height = h + 'px'; - - // Adds vertical scrollbars if needed - if (!noScroll && elt.clientHeight > div.clientHeight - 64) - { - elt.style.overflowY = 'auto'; - } - - if (this.dialogImg != null) - { - this.dialogImg.style.top = (top + 14) + 'px'; - this.dialogImg.style.left = (left + w + 38 - dx) + 'px'; - } - }); - - mxEvent.addListener(window, 'resize', this.resizeListener); - - this.onDialogClose = onClose; - this.container = div; - - editorUi.editor.fireEvent(new mxEventObject('showDialog')); -}; - -/** - * - */ -Dialog.backdropColor = 'white'; - -/** - * - */ -Dialog.prototype.zIndex = mxPopupMenu.prototype.zIndex - 1; - -/** - * - */ -Dialog.prototype.noColorImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/nocolor.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkEzRDlBMUUwODYxMTExRTFCMzA4RDdDMjJBMEMxRDM3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkEzRDlBMUUxODYxMTExRTFCMzA4RDdDMjJBMEMxRDM3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTNEOUExREU4NjExMTFFMUIzMDhEN0MyMkEwQzFEMzciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTNEOUExREY4NjExMTFFMUIzMDhEN0MyMkEwQzFEMzciLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5xh3fmAAAABlBMVEX////MzMw46qqDAAAAGElEQVR42mJggAJGKGAYIIGBth8KAAIMAEUQAIElnLuQAAAAAElFTkSuQmCC'; - -/** - * - */ -Dialog.prototype.closeImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/close.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJAQMAAADaX5RTAAAABlBMVEV7mr3///+wksspAAAAAnRSTlP/AOW3MEoAAAAdSURBVAgdY9jXwCDDwNDRwHCwgeExmASygSL7GgB12QiqNHZZIwAAAABJRU5ErkJggg=='; - -/** - * - */ -Dialog.prototype.clearImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/clear.gif' : 'data:image/gif;base64,R0lGODlhDQAKAIABAMDAwP///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUIzOEM1NzI4NjEyMTFFMUEzMkNDMUE3NjZERDE2QjIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUIzOEM1NzM4NjEyMTFFMUEzMkNDMUE3NjZERDE2QjIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QjM4QzU3MDg2MTIxMUUxQTMyQ0MxQTc2NkREMTZCMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QjM4QzU3MTg2MTIxMUUxQTMyQ0MxQTc2NkREMTZCMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAEALAAAAAANAAoAAAIXTGCJebD9jEOTqRlttXdrB32PJ2ncyRQAOw=='; - -/** - * - */ -Dialog.prototype.lockedImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/locked.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAMAAABhq6zVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzdDMDZCODExNzIxMTFFNUI0RTk5NTg4OTcyMUUyODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzdDMDZCODIxNzIxMTFFNUI0RTk5NTg4OTcyMUUyODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozN0MwNkI3RjE3MjExMUU1QjRFOTk1ODg5NzIxRTI4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozN0MwNkI4MDE3MjExMUU1QjRFOTk1ODg5NzIxRTI4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvqMCFYAAAAVUExURZmZmb+/v7KysqysrMzMzLGxsf///4g8N1cAAAAHdFJOU////////wAaSwNGAAAAPElEQVR42lTMQQ4AIQgEwUa0//9kTQirOweYOgDqAMbZUr10AGlAwx4/BJ2QJ4U0L5brYjovvpv32xZgAHZaATFtMbu4AAAAAElFTkSuQmCC'; - -/** - * - */ -Dialog.prototype.unlockedImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/unlocked.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAMAAABhq6zVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzdDMDZCN0QxNzIxMTFFNUI0RTk5NTg4OTcyMUUyODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzdDMDZCN0UxNzIxMTFFNUI0RTk5NTg4OTcyMUUyODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozN0MwNkI3QjE3MjExMUU1QjRFOTk1ODg5NzIxRTI4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozN0MwNkI3QzE3MjExMUU1QjRFOTk1ODg5NzIxRTI4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkKMpVwAAAAYUExURZmZmbKysr+/v6ysrOXl5czMzLGxsf///zHN5lwAAAAIdFJOU/////////8A3oO9WQAAADxJREFUeNpUzFESACAEBNBVsfe/cZJU+8Mzs8CIABCidtfGOndnYsT40HDSiCcbPdoJo10o9aI677cpwACRoAF3dFNlswAAAABJRU5ErkJggg=='; - -/** - * Removes the dialog from the DOM. - */ -Dialog.prototype.bgOpacity = 80; - -/** - * Removes the dialog from the DOM. - */ -Dialog.prototype.getPosition = function(left, top) -{ - return new mxPoint(left, top); -}; - -/** - * Removes the dialog from the DOM. - */ -Dialog.prototype.close = function(cancel) -{ - if (this.onDialogClose != null) - { - this.onDialogClose(cancel); - this.onDialogClose = null; - } - - if (this.dialogImg != null) - { - this.dialogImg.parentNode.removeChild(this.dialogImg); - this.dialogImg = null; - } - - if (this.bg != null && this.bg.parentNode != null) - { - this.bg.parentNode.removeChild(this.bg); - } - - mxEvent.removeListener(window, 'resize', this.resizeListener); - this.container.parentNode.removeChild(this.container); -}; - -/** - * Constructs a new print dialog. - */ -var PrintDialog = function(editorUi, title) -{ - this.create(editorUi, title); -}; - -/** - * Constructs a new print dialog. - */ -PrintDialog.prototype.create = function(editorUi) -{ - var graph = editorUi.editor.graph; - var row, td; - - var table = document.createElement('table'); - table.style.width = '100%'; - table.style.height = '100%'; - var tbody = document.createElement('tbody'); - - row = document.createElement('tr'); - - var onePageCheckBox = document.createElement('input'); - onePageCheckBox.setAttribute('type', 'checkbox'); - td = document.createElement('td'); - td.setAttribute('colspan', '2'); - td.style.fontSize = '10pt'; - td.appendChild(onePageCheckBox); - - var span = document.createElement('span'); - mxUtils.write(span, ' ' + mxResources.get('fitPage')); - td.appendChild(span); - - mxEvent.addListener(span, 'click', function(evt) - { - onePageCheckBox.checked = !onePageCheckBox.checked; - pageCountCheckBox.checked = !onePageCheckBox.checked; - mxEvent.consume(evt); - }); - - mxEvent.addListener(onePageCheckBox, 'change', function() - { - pageCountCheckBox.checked = !onePageCheckBox.checked; - }); - - row.appendChild(td); - tbody.appendChild(row); - - row = row.cloneNode(false); - - var pageCountCheckBox = document.createElement('input'); - pageCountCheckBox.setAttribute('type', 'checkbox'); - td = document.createElement('td'); - td.style.fontSize = '10pt'; - td.appendChild(pageCountCheckBox); - - var span = document.createElement('span'); - mxUtils.write(span, ' ' + mxResources.get('posterPrint') + ':'); - td.appendChild(span); - - mxEvent.addListener(span, 'click', function(evt) - { - pageCountCheckBox.checked = !pageCountCheckBox.checked; - onePageCheckBox.checked = !pageCountCheckBox.checked; - mxEvent.consume(evt); - }); - - row.appendChild(td); - - var pageCountInput = document.createElement('input'); - pageCountInput.setAttribute('value', '1'); - pageCountInput.setAttribute('type', 'number'); - pageCountInput.setAttribute('min', '1'); - pageCountInput.setAttribute('size', '4'); - pageCountInput.setAttribute('disabled', 'disabled'); - pageCountInput.style.width = '50px'; - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - td.appendChild(pageCountInput); - mxUtils.write(td, ' ' + mxResources.get('pages') + ' (max)'); - row.appendChild(td); - tbody.appendChild(row); - - mxEvent.addListener(pageCountCheckBox, 'change', function() - { - if (pageCountCheckBox.checked) - { - pageCountInput.removeAttribute('disabled'); - } - else - { - pageCountInput.setAttribute('disabled', 'disabled'); - } - - onePageCheckBox.checked = !pageCountCheckBox.checked; - }); - - row = row.cloneNode(false); - - td = document.createElement('td'); - mxUtils.write(td, mxResources.get('pageScale') + ':'); - row.appendChild(td); - - td = document.createElement('td'); - var pageScaleInput = document.createElement('input'); - pageScaleInput.setAttribute('value', '100 %'); - pageScaleInput.setAttribute('size', '5'); - pageScaleInput.style.width = '50px'; - - td.appendChild(pageScaleInput); - row.appendChild(td); - tbody.appendChild(row); - - row = document.createElement('tr'); - td = document.createElement('td'); - td.colSpan = 2; - td.style.paddingTop = '20px'; - td.setAttribute('align', 'right'); - - // Overall scale for print-out to account for print borders in dialogs etc - function preview(print) - { - var autoOrigin = onePageCheckBox.checked || pageCountCheckBox.checked; - var printScale = parseInt(pageScaleInput.value) / 100; - - if (isNaN(printScale)) - { - printScale = 1; - pageScaleInput.value = '100%'; - } - - // Workaround to match available paper size in actual print output - printScale *= 0.75; - - var pf = graph.pageFormat || mxConstants.PAGE_FORMAT_A4_PORTRAIT; - var scale = 1 / graph.pageScale; - - if (autoOrigin) - { - var pageCount = (onePageCheckBox.checked) ? 1 : parseInt(pageCountInput.value); - - if (!isNaN(pageCount)) - { - scale = mxUtils.getScaleForPageCount(pageCount, graph, pf); - } - } - - // Negative coordinates are cropped or shifted if page visible - var gb = graph.getGraphBounds(); - var border = 0; - var x0 = 0; - var y0 = 0; - - // Applies print scale - pf = mxRectangle.fromRectangle(pf); - pf.width = Math.ceil(pf.width * printScale); - pf.height = Math.ceil(pf.height * printScale); - scale *= printScale; - - // Starts at first visible page - if (!autoOrigin && graph.pageVisible) - { - var layout = graph.getPageLayout(); - x0 -= layout.x * pf.width; - y0 -= layout.y * pf.height; - } - else - { - autoOrigin = true; - } - - var preview = PrintDialog.createPrintPreview(graph, scale, pf, border, x0, y0, autoOrigin); - preview.open(); - - if (print) - { - PrintDialog.printPreview(preview); - } - }; - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - editorUi.hideDialog(); - }); - cancelBtn.className = 'geBtn'; - - if (editorUi.editor.cancelFirst) - { - td.appendChild(cancelBtn); - } - - if (PrintDialog.previewEnabled) - { - var previewBtn = mxUtils.button(mxResources.get('preview'), function() - { - editorUi.hideDialog(); - preview(false); - }); - previewBtn.className = 'geBtn'; - td.appendChild(previewBtn); - } - - var printBtn = mxUtils.button(mxResources.get((!PrintDialog.previewEnabled) ? 'ok' : 'print'), function() - { - editorUi.hideDialog(); - preview(true); - }); - printBtn.className = 'geBtn gePrimaryBtn'; - td.appendChild(printBtn); - - if (!editorUi.editor.cancelFirst) - { - td.appendChild(cancelBtn); - } - - row.appendChild(td); - tbody.appendChild(row); - - table.appendChild(tbody); - this.container = table; -}; - -/** - * Constructs a new print dialog. - */ -PrintDialog.printPreview = function(preview) -{ - if (preview.wnd != null) - { - var printFn = function() - { - preview.wnd.focus(); - preview.wnd.print(); - preview.wnd.close(); - }; - - // Workaround for Google Chrome which needs a bit of a - // delay in order to render the SVG contents - // Needs testing in production - if (mxClient.IS_GC) - { - window.setTimeout(printFn, 500); - } - else - { - printFn(); - } - } -}; - -/** - * Constructs a new print dialog. - */ -PrintDialog.createPrintPreview = function(graph, scale, pf, border, x0, y0, autoOrigin) -{ - var preview = new mxPrintPreview(graph, scale, pf, border, x0, y0); - preview.title = mxResources.get('preview'); - preview.printBackgroundImage = true; - preview.autoOrigin = autoOrigin; - var bg = graph.background; - - if (bg == null || bg == '' || bg == mxConstants.NONE) - { - bg = '#ffffff'; - } - - preview.backgroundColor = bg; - - var writeHead = preview.writeHead; - - // Adds a border in the preview - preview.writeHead = function(doc) - { - writeHead.apply(this, arguments); - - doc.writeln(''); - }; - - return preview; -}; - -/** - * Specifies if the preview button should be enabled. Default is true. - */ -PrintDialog.previewEnabled = true; - -/** - * Constructs a new page setup dialog. - */ -var PageSetupDialog = function(editorUi) -{ - var graph = editorUi.editor.graph; - var row, td; - - var table = document.createElement('table'); - table.style.width = '100%'; - table.style.height = '100%'; - var tbody = document.createElement('tbody'); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.verticalAlign = 'top'; - td.style.fontSize = '10pt'; - mxUtils.write(td, mxResources.get('paperSize') + ':'); - - row.appendChild(td); - - td = document.createElement('td'); - td.style.verticalAlign = 'top'; - td.style.fontSize = '10pt'; - - var accessor = PageSetupDialog.addPageFormatPanel(td, 'pagesetupdialog', graph.pageFormat); - - row.appendChild(td); - tbody.appendChild(row); - - row = document.createElement('tr'); - - td = document.createElement('td'); - mxUtils.write(td, mxResources.get('background') + ':'); - - row.appendChild(td); - - td = document.createElement('td'); - td.style.whiteSpace = 'nowrap'; - - var backgroundInput = document.createElement('input'); - backgroundInput.setAttribute('type', 'text'); - var backgroundButton = document.createElement('button'); - - backgroundButton.style.width = '18px'; - backgroundButton.style.height = '18px'; - backgroundButton.style.marginRight = '20px'; - backgroundButton.style.backgroundPosition = 'center center'; - backgroundButton.style.backgroundRepeat = 'no-repeat'; - - var newBackgroundColor = graph.background; - - function updateBackgroundColor() - { - if (newBackgroundColor == null || newBackgroundColor == mxConstants.NONE) - { - backgroundButton.style.backgroundColor = ''; - backgroundButton.style.backgroundImage = 'url(\'' + Dialog.prototype.noColorImage + '\')'; - } - else - { - backgroundButton.style.backgroundColor = newBackgroundColor; - backgroundButton.style.backgroundImage = ''; - } - }; - - updateBackgroundColor(); - - mxEvent.addListener(backgroundButton, 'click', function(evt) - { - editorUi.pickColor(newBackgroundColor || 'none', function(color) - { - newBackgroundColor = color; - updateBackgroundColor(); - }); - mxEvent.consume(evt); - }); - - td.appendChild(backgroundButton); - - mxUtils.write(td, mxResources.get('gridSize') + ':'); - - var gridSizeInput = document.createElement('input'); - gridSizeInput.setAttribute('type', 'number'); - gridSizeInput.setAttribute('min', '0'); - gridSizeInput.style.width = '40px'; - gridSizeInput.style.marginLeft = '6px'; - - gridSizeInput.value = graph.getGridSize(); - td.appendChild(gridSizeInput); - - mxEvent.addListener(gridSizeInput, 'change', function() - { - var value = parseInt(gridSizeInput.value); - gridSizeInput.value = Math.max(1, (isNaN(value)) ? graph.getGridSize() : value); - }); - - row.appendChild(td); - tbody.appendChild(row); - - row = document.createElement('tr'); - td = document.createElement('td'); - - mxUtils.write(td, mxResources.get('image') + ':'); - - row.appendChild(td); - td = document.createElement('td'); - - var changeImageLink = document.createElement('a'); - changeImageLink.style.textDecoration = 'underline'; - changeImageLink.style.cursor = 'pointer'; - changeImageLink.style.color = '#a0a0a0'; - - var newBackgroundImage = graph.backgroundImage; - - function updateBackgroundImage() - { - if (newBackgroundImage == null) - { - changeImageLink.removeAttribute('title'); - changeImageLink.style.fontSize = ''; - changeImageLink.innerHTML = mxResources.get('change') + '...'; - } - else - { - changeImageLink.setAttribute('title', newBackgroundImage.src); - changeImageLink.style.fontSize = '11px'; - changeImageLink.innerHTML = newBackgroundImage.src.substring(0, 42) + '...'; - } - }; - - mxEvent.addListener(changeImageLink, 'click', function(evt) - { - editorUi.showBackgroundImageDialog(function(image) - { - newBackgroundImage = image; - updateBackgroundImage(); - }); - - mxEvent.consume(evt); - }); - - updateBackgroundImage(); - - td.appendChild(changeImageLink); - - row.appendChild(td); - tbody.appendChild(row); - - row = document.createElement('tr'); - td = document.createElement('td'); - td.colSpan = 2; - td.style.paddingTop = '16px'; - td.setAttribute('align', 'right'); - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - editorUi.hideDialog(); - }); - cancelBtn.className = 'geBtn'; - - if (editorUi.editor.cancelFirst) - { - td.appendChild(cancelBtn); - } - - var applyBtn = mxUtils.button(mxResources.get('apply'), function() - { - editorUi.hideDialog(); - - if (graph.gridSize !== gridSizeInput.value) - { - graph.setGridSize(parseInt(gridSizeInput.value)); - } - - var change = new ChangePageSetup(editorUi, newBackgroundColor, - newBackgroundImage, accessor.get()); - change.ignoreColor = graph.background == newBackgroundColor; - - var oldSrc = (graph.backgroundImage != null) ? graph.backgroundImage.src : null; - var newSrc = (newBackgroundImage != null) ? newBackgroundImage.src : null; - - change.ignoreImage = oldSrc === newSrc; - - if (graph.pageFormat.width != change.previousFormat.width || - graph.pageFormat.height != change.previousFormat.height || - !change.ignoreColor || !change.ignoreImage) - { - graph.model.execute(change); - } - }); - applyBtn.className = 'geBtn gePrimaryBtn'; - td.appendChild(applyBtn); - - if (!editorUi.editor.cancelFirst) - { - td.appendChild(cancelBtn); - } - - row.appendChild(td); - tbody.appendChild(row); - - table.appendChild(tbody); - this.container = table; -}; - -/** - * - */ -PageSetupDialog.addPageFormatPanel = function(div, namePostfix, pageFormat, pageFormatListener) -{ - var formatName = 'format-' + namePostfix; - - var portraitCheckBox = document.createElement('input'); - portraitCheckBox.setAttribute('name', formatName); - portraitCheckBox.setAttribute('type', 'radio'); - portraitCheckBox.setAttribute('value', 'portrait'); - - var landscapeCheckBox = document.createElement('input'); - landscapeCheckBox.setAttribute('name', formatName); - landscapeCheckBox.setAttribute('type', 'radio'); - landscapeCheckBox.setAttribute('value', 'landscape'); - - var paperSizeSelect = document.createElement('select'); - paperSizeSelect.style.marginBottom = '8px'; - paperSizeSelect.style.width = '202px'; - - var formatDiv = document.createElement('div'); - formatDiv.style.marginLeft = '4px'; - formatDiv.style.width = '210px'; - formatDiv.style.height = '24px'; - - portraitCheckBox.style.marginRight = '6px'; - formatDiv.appendChild(portraitCheckBox); - - var portraitSpan = document.createElement('span'); - portraitSpan.style.maxWidth = '100px'; - mxUtils.write(portraitSpan, mxResources.get('portrait')); - formatDiv.appendChild(portraitSpan); - - landscapeCheckBox.style.marginLeft = '10px'; - landscapeCheckBox.style.marginRight = '6px'; - formatDiv.appendChild(landscapeCheckBox); - - var landscapeSpan = document.createElement('span'); - landscapeSpan.style.width = '100px'; - mxUtils.write(landscapeSpan, mxResources.get('landscape')); - formatDiv.appendChild(landscapeSpan) - - var customDiv = document.createElement('div'); - customDiv.style.marginLeft = '4px'; - customDiv.style.width = '210px'; - customDiv.style.height = '24px'; - - var widthInput = document.createElement('input'); - widthInput.setAttribute('size', '7'); - widthInput.style.textAlign = 'right'; - customDiv.appendChild(widthInput); - mxUtils.write(customDiv, ' in x '); - - var heightInput = document.createElement('input'); - heightInput.setAttribute('size', '7'); - heightInput.style.textAlign = 'right'; - customDiv.appendChild(heightInput); - mxUtils.write(customDiv, ' in'); - - formatDiv.style.display = 'none'; - customDiv.style.display = 'none'; - - var pf = new Object(); - var formats = PageSetupDialog.getFormats(); - - for (var i = 0; i < formats.length; i++) - { - var f = formats[i]; - pf[f.key] = f; - - var paperSizeOption = document.createElement('option'); - paperSizeOption.setAttribute('value', f.key); - mxUtils.write(paperSizeOption, f.title); - paperSizeSelect.appendChild(paperSizeOption); - } - - var customSize = false; - - function listener(sender, evt, force) - { - if (force || (widthInput != document.activeElement && heightInput != document.activeElement)) - { - var detected = false; - - for (var i = 0; i < formats.length; i++) - { - var f = formats[i]; - - // Special case where custom was chosen - if (customSize) - { - if (f.key == 'custom') - { - paperSizeSelect.value = f.key; - customSize = false; - } - } - else if (f.format != null) - { - // Fixes wrong values for previous A4 and A5 page sizes - if (f.key == 'a4') - { - if (pageFormat.width == 826) - { - pageFormat = mxRectangle.fromRectangle(pageFormat); - pageFormat.width = 827; - } - else if (pageFormat.height == 826) - { - pageFormat = mxRectangle.fromRectangle(pageFormat); - pageFormat.height = 827; - } - } - else if (f.key == 'a5') - { - if (pageFormat.width == 584) - { - pageFormat = mxRectangle.fromRectangle(pageFormat); - pageFormat.width = 583; - } - else if (pageFormat.height == 584) - { - pageFormat = mxRectangle.fromRectangle(pageFormat); - pageFormat.height = 583; - } - } - - if (pageFormat.width == f.format.width && pageFormat.height == f.format.height) - { - paperSizeSelect.value = f.key; - portraitCheckBox.setAttribute('checked', 'checked'); - portraitCheckBox.defaultChecked = true; - portraitCheckBox.checked = true; - landscapeCheckBox.removeAttribute('checked'); - landscapeCheckBox.defaultChecked = false; - landscapeCheckBox.checked = false; - detected = true; - } - else if (pageFormat.width == f.format.height && pageFormat.height == f.format.width) - { - paperSizeSelect.value = f.key; - portraitCheckBox.removeAttribute('checked'); - portraitCheckBox.defaultChecked = false; - portraitCheckBox.checked = false; - landscapeCheckBox.setAttribute('checked', 'checked'); - landscapeCheckBox.defaultChecked = true; - landscapeCheckBox.checked = true; - detected = true; - } - } - } - - // Selects custom format which is last in list - if (!detected) - { - widthInput.value = pageFormat.width / 100; - heightInput.value = pageFormat.height / 100; - portraitCheckBox.setAttribute('checked', 'checked'); - paperSizeSelect.value = 'custom'; - formatDiv.style.display = 'none'; - customDiv.style.display = ''; - } - else - { - formatDiv.style.display = ''; - customDiv.style.display = 'none'; - } - } - }; - - listener(); - - div.appendChild(paperSizeSelect); - mxUtils.br(div); - - div.appendChild(formatDiv); - div.appendChild(customDiv); - - var currentPageFormat = pageFormat; - - var update = function(evt, selectChanged) - { - var f = pf[paperSizeSelect.value]; - - if (f.format != null) - { - widthInput.value = f.format.width / 100; - heightInput.value = f.format.height / 100; - customDiv.style.display = 'none'; - formatDiv.style.display = ''; - } - else - { - formatDiv.style.display = 'none'; - customDiv.style.display = ''; - } - - if (isNaN(parseFloat(widthInput.value))) - { - widthInput.value = pageFormat.width / 100; - } - - if (isNaN(parseFloat(heightInput.value))) - { - heightInput.value = pageFormat.height / 100; - } - - var newPageFormat = new mxRectangle(0, 0, - Math.floor(parseFloat(widthInput.value) * 100), - Math.floor(parseFloat(heightInput.value) * 100)); - - if (paperSizeSelect.value != 'custom' && landscapeCheckBox.checked) - { - newPageFormat = new mxRectangle(0, 0, newPageFormat.height, newPageFormat.width); - } - - // Initial select of custom should not update page format to avoid update of combo - if ((!selectChanged || !customSize) && (newPageFormat.width != currentPageFormat.width || - newPageFormat.height != currentPageFormat.height)) - { - currentPageFormat = newPageFormat; - - // Updates page format and reloads format panel - if (pageFormatListener != null) - { - pageFormatListener(currentPageFormat); - } - } - }; - - mxEvent.addListener(portraitSpan, 'click', function(evt) - { - portraitCheckBox.checked = true; - update(evt); - mxEvent.consume(evt); - }); - - mxEvent.addListener(landscapeSpan, 'click', function(evt) - { - landscapeCheckBox.checked = true; - update(evt); - mxEvent.consume(evt); - }); - - mxEvent.addListener(widthInput, 'blur', update); - mxEvent.addListener(widthInput, 'click', update); - mxEvent.addListener(heightInput, 'blur', update); - mxEvent.addListener(heightInput, 'click', update); - mxEvent.addListener(landscapeCheckBox, 'change', update); - mxEvent.addListener(portraitCheckBox, 'change', update); - mxEvent.addListener(paperSizeSelect, 'change', function(evt) - { - // Handles special case where custom was chosen - customSize = paperSizeSelect.value == 'custom'; - update(evt, true); - }); - - update(); - - return {set: function(value) - { - pageFormat = value; - listener(null, null, true); - },get: function() - { - return currentPageFormat; - }, widthInput: widthInput, - heightInput: heightInput}; -}; - -/** - * - */ -PageSetupDialog.getFormats = function() -{ - return [{key: 'letter', title: 'US-Letter (8,5" x 11")', format: mxConstants.PAGE_FORMAT_LETTER_PORTRAIT}, - {key: 'legal', title: 'US-Legal (8,5" x 14")', format: new mxRectangle(0, 0, 850, 1400)}, - {key: 'tabloid', title: 'US-Tabloid (279 mm x 432 mm)', format: new mxRectangle(0, 0, 1100, 1700)}, - {key: 'a0', title: 'A0 (841 mm x 1189 mm)', format: new mxRectangle(0, 0, 3300, 4681)}, - {key: 'a1', title: 'A1 (594 mm x 841 mm)', format: new mxRectangle(0, 0, 2339, 3300)}, - {key: 'a2', title: 'A2 (420 mm x 594 mm)', format: new mxRectangle(0, 0, 1654, 2336)}, - {key: 'a3', title: 'A3 (297 mm x 420 mm)', format: new mxRectangle(0, 0, 1169, 1654)}, - {key: 'a4', title: 'A4 (210 mm x 297 mm)', format: mxConstants.PAGE_FORMAT_A4_PORTRAIT}, - {key: 'a5', title: 'A5 (148 mm x 210 mm)', format: new mxRectangle(0, 0, 583, 827)}, - {key: 'a6', title: 'A6 (105 mm x 148 mm)', format: new mxRectangle(0, 0, 413, 583)}, - {key: 'a7', title: 'A7 (74 mm x 105 mm)', format: new mxRectangle(0, 0, 291, 413)}, - {key: 'custom', title: mxResources.get('custom'), format: null}]; -}; - -/** - * Static overrides - */ -(function() -{ - // Uses HTML for background pages (to support grid background image) - mxGraphView.prototype.validateBackgroundPage = function() - { - var graph = this.graph; - - if (graph.container != null && !graph.transparentBackground) - { - if (graph.pageVisible) - { - var bounds = this.getBackgroundPageBounds(); - - if (this.backgroundPageShape == null) - { - // Finds first element in graph container - var firstChild = graph.container.firstChild; - - while (firstChild != null && firstChild.nodeType != mxConstants.NODETYPE_ELEMENT) - { - firstChild = firstChild.nextSibling; - } - - if (firstChild != null) - { - this.backgroundPageShape = this.createBackgroundPageShape(bounds); - this.backgroundPageShape.scale = 1; - - // Shadow filter causes problems in outline window in quirks mode. IE8 standards - // also has known rendering issues inside mxWindow but not using shadow is worse. - this.backgroundPageShape.isShadow = !mxClient.IS_QUIRKS; - this.backgroundPageShape.dialect = mxConstants.DIALECT_STRICTHTML; - this.backgroundPageShape.init(graph.container); - - // Required for the browser to render the background page in correct order - firstChild.style.position = 'absolute'; - graph.container.insertBefore(this.backgroundPageShape.node, firstChild); - this.backgroundPageShape.redraw(); - - this.backgroundPageShape.node.className = 'geBackgroundPage'; - - // Adds listener for double click handling on background - mxEvent.addListener(this.backgroundPageShape.node, 'dblclick', - mxUtils.bind(this, function(evt) - { - graph.dblClick(evt); - }) - ); - - // Adds basic listeners for graph event dispatching outside of the - // container and finishing the handling of a single gesture - mxEvent.addGestureListeners(this.backgroundPageShape.node, - mxUtils.bind(this, function(evt) - { - graph.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(evt)); - }), - mxUtils.bind(this, function(evt) - { - // Hides the tooltip if mouse is outside container - if (graph.tooltipHandler != null && graph.tooltipHandler.isHideOnHover()) - { - graph.tooltipHandler.hide(); - } - - if (graph.isMouseDown && !mxEvent.isConsumed(evt)) - { - graph.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(evt)); - } - }), - mxUtils.bind(this, function(evt) - { - graph.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(evt)); - }) - ); - } - } - else - { - this.backgroundPageShape.scale = 1; - this.backgroundPageShape.bounds = bounds; - this.backgroundPageShape.redraw(); - } - } - else if (this.backgroundPageShape != null) - { - this.backgroundPageShape.destroy(); - this.backgroundPageShape = null; - } - - this.validateBackgroundStyles(); - } - }; - - // Updates the CSS of the background to draw the grid - mxGraphView.prototype.validateBackgroundStyles = function() - { - var graph = this.graph; - var color = (graph.background == null || graph.background == mxConstants.NONE) ? graph.defaultPageBackgroundColor : graph.background; - var gridColor = (color != null && this.gridColor != color.toLowerCase()) ? this.gridColor : '#ffffff'; - var image = 'none'; - var position = ''; - - if (graph.isGridEnabled()) - { - var phase = 10; - - if (mxClient.IS_SVG) - { - // Generates the SVG required for drawing the dynamic grid - image = unescape(encodeURIComponent(this.createSvgGrid(gridColor))); - image = (window.btoa) ? btoa(image) : Base64.encode(image, true); - image = 'url(' + 'data:image/svg+xml;base64,' + image + ')' - phase = graph.gridSize * this.scale * this.gridSteps; - } - else - { - // Fallback to grid wallpaper with fixed size - image = 'url(' + this.gridImage + ')'; - } - - var x0 = 0; - var y0 = 0; - - if (graph.view.backgroundPageShape != null) - { - var bds = this.getBackgroundPageBounds(); - - x0 = 1 + bds.x; - y0 = 1 + bds.y; - } - - // Computes the offset to maintain origin for grid - position = -Math.round(phase - mxUtils.mod(this.translate.x * this.scale - x0, phase)) + 'px ' + - -Math.round(phase - mxUtils.mod(this.translate.y * this.scale - y0, phase)) + 'px'; - } - - var canvas = graph.view.canvas; - - if (canvas.ownerSVGElement != null) - { - canvas = canvas.ownerSVGElement; - } - - if (graph.view.backgroundPageShape != null) - { - graph.view.backgroundPageShape.node.style.backgroundPosition = position; - graph.view.backgroundPageShape.node.style.backgroundImage = image; - graph.view.backgroundPageShape.node.style.backgroundColor = color; - graph.container.className = 'geDiagramContainer geDiagramBackdrop'; - canvas.style.backgroundImage = 'none'; - canvas.style.backgroundColor = ''; - } - else - { - graph.container.className = 'geDiagramContainer'; - canvas.style.backgroundPosition = position; - canvas.style.backgroundColor = color; - canvas.style.backgroundImage = image; - } - }; - - // Returns the SVG required for painting the background grid. - mxGraphView.prototype.createSvgGrid = function(color) - { - var tmp = this.graph.gridSize * this.scale; - - while (tmp < this.minGridSize) - { - tmp *= 2; - } - - var tmp2 = this.gridSteps * tmp; - - // Small grid lines - var d = []; - - for (var i = 1; i < this.gridSteps; i++) - { - var tmp3 = i * tmp; - d.push('M 0 ' + tmp3 + ' L ' + tmp2 + ' ' + tmp3 + ' M ' + tmp3 + ' 0 L ' + tmp3 + ' ' + tmp2); - } - - // KNOWN: Rounding errors for certain scales (eg. 144%, 121% in Chrome, FF and Safari). Workaround - // in Chrome is to use 100% for the svg size, but this results in blurred grid for large diagrams. - var size = tmp2; - var svg = '' + - '' + - '' + - '' + - ''; - - return svg; - }; - - // Adds panning for the grid with no page view and disabled scrollbars - var mxGraphPanGraph = mxGraph.prototype.panGraph; - mxGraph.prototype.panGraph = function(dx, dy) - { - mxGraphPanGraph.apply(this, arguments); - - if (this.shiftPreview1 != null) - { - var canvas = this.view.canvas; - - if (canvas.ownerSVGElement != null) - { - canvas = canvas.ownerSVGElement; - } - - var phase = this.gridSize * this.view.scale * this.view.gridSteps; - var position = -Math.round(phase - mxUtils.mod(this.view.translate.x * this.view.scale + dx, phase)) + 'px ' + - -Math.round(phase - mxUtils.mod(this.view.translate.y * this.view.scale + dy, phase)) + 'px'; - canvas.style.backgroundPosition = position; - } - }; - - // Draws page breaks only within the page - mxGraph.prototype.updatePageBreaks = function(visible, width, height) - { - var scale = this.view.scale; - var tr = this.view.translate; - var fmt = this.pageFormat; - var ps = scale * this.pageScale; - - var bounds2 = this.view.getBackgroundPageBounds(); - - width = bounds2.width; - height = bounds2.height; - var bounds = new mxRectangle(scale * tr.x, scale * tr.y, fmt.width * ps, fmt.height * ps); - - // Does not show page breaks if the scale is too small - visible = visible && Math.min(bounds.width, bounds.height) > this.minPageBreakDist; - - var horizontalCount = (visible) ? Math.ceil(height / bounds.height) - 1 : 0; - var verticalCount = (visible) ? Math.ceil(width / bounds.width) - 1 : 0; - var right = bounds2.x + width; - var bottom = bounds2.y + height; - - if (this.horizontalPageBreaks == null && horizontalCount > 0) - { - this.horizontalPageBreaks = []; - } - - if (this.verticalPageBreaks == null && verticalCount > 0) - { - this.verticalPageBreaks = []; - } - - var drawPageBreaks = mxUtils.bind(this, function(breaks) - { - if (breaks != null) - { - var count = (breaks == this.horizontalPageBreaks) ? horizontalCount : verticalCount; - - for (var i = 0; i <= count; i++) - { - var pts = (breaks == this.horizontalPageBreaks) ? - [new mxPoint(Math.round(bounds2.x), Math.round(bounds2.y + (i + 1) * bounds.height)), - new mxPoint(Math.round(right), Math.round(bounds2.y + (i + 1) * bounds.height))] : - [new mxPoint(Math.round(bounds2.x + (i + 1) * bounds.width), Math.round(bounds2.y)), - new mxPoint(Math.round(bounds2.x + (i + 1) * bounds.width), Math.round(bottom))]; - - if (breaks[i] != null) - { - breaks[i].points = pts; - breaks[i].redraw(); - } - else - { - var pageBreak = new mxPolyline(pts, this.pageBreakColor); - pageBreak.dialect = this.dialect; - pageBreak.isDashed = this.pageBreakDashed; - pageBreak.pointerEvents = false; - pageBreak.init(this.view.backgroundPane); - pageBreak.redraw(); - - breaks[i] = pageBreak; - } - } - - for (var i = count; i < breaks.length; i++) - { - breaks[i].destroy(); - } - - breaks.splice(count, breaks.length - count); - } - }); - - drawPageBreaks(this.horizontalPageBreaks); - drawPageBreaks(this.verticalPageBreaks); - }; - - // Disables removing relative children from parents - var mxGraphHandlerShouldRemoveCellsFromParent = mxGraphHandler.prototype.shouldRemoveCellsFromParent; - mxGraphHandler.prototype.shouldRemoveCellsFromParent = function(parent, cells, evt) - { - for (var i = 0; i < cells.length; i++) - { - if (this.graph.getModel().isVertex(cells[i])) - { - var geo = this.graph.getCellGeometry(cells[i]); - - if (geo != null && geo.relative) - { - return false; - } - } - } - - return mxGraphHandlerShouldRemoveCellsFromParent.apply(this, arguments); - }; - - // Overrides to ignore hotspot only for target terminal - var mxConnectionHandlerCreateMarker = mxConnectionHandler.prototype.createMarker; - mxConnectionHandler.prototype.createMarker = function() - { - var marker = mxConnectionHandlerCreateMarker.apply(this, arguments); - - marker.intersects = mxUtils.bind(this, function(state, evt) - { - if (this.isConnecting()) - { - return true; - } - - return mxCellMarker.prototype.intersects.apply(marker, arguments); - }); - - return marker; - }; - - // Creates background page shape - mxGraphView.prototype.createBackgroundPageShape = function(bounds) - { - return new mxRectangleShape(bounds, '#ffffff', this.graph.defaultPageBorderColor); - }; - - // Fits the number of background pages to the graph - mxGraphView.prototype.getBackgroundPageBounds = function() - { - var gb = this.getGraphBounds(); - - // Computes unscaled, untranslated graph bounds - var x = (gb.width > 0) ? gb.x / this.scale - this.translate.x : 0; - var y = (gb.height > 0) ? gb.y / this.scale - this.translate.y : 0; - var w = gb.width / this.scale; - var h = gb.height / this.scale; - - var fmt = this.graph.pageFormat; - var ps = this.graph.pageScale; - - var pw = fmt.width * ps; - var ph = fmt.height * ps; - - var x0 = Math.floor(Math.min(0, x) / pw); - var y0 = Math.floor(Math.min(0, y) / ph); - var xe = Math.ceil(Math.max(1, x + w) / pw); - var ye = Math.ceil(Math.max(1, y + h) / ph); - - var rows = xe - x0; - var cols = ye - y0; - - var bounds = new mxRectangle(this.scale * (this.translate.x + x0 * pw), this.scale * - (this.translate.y + y0 * ph), this.scale * rows * pw, this.scale * cols * ph); - - return bounds; - }; - - // Add panning for background page in VML - var graphPanGraph = mxGraph.prototype.panGraph; - mxGraph.prototype.panGraph = function(dx, dy) - { - graphPanGraph.apply(this, arguments); - - if ((this.dialect != mxConstants.DIALECT_SVG && this.view.backgroundPageShape != null) && - (!this.useScrollbarsForPanning || !mxUtils.hasScrollbars(this.container))) - { - this.view.backgroundPageShape.node.style.marginLeft = dx + 'px'; - this.view.backgroundPageShape.node.style.marginTop = dy + 'px'; - } - }; - - /** - * Consumes click events for disabled menu items. - */ - var mxPopupMenuAddItem = mxPopupMenu.prototype.addItem; - mxPopupMenu.prototype.addItem = function(title, image, funct, parent, iconCls, enabled) - { - var result = mxPopupMenuAddItem.apply(this, arguments); - - if (enabled != null && !enabled) - { - mxEvent.addListener(result, 'mousedown', function(evt) - { - mxEvent.consume(evt); - }); - } - - return result; - }; - - // Selects ancestors before descendants - var graphHandlerGetInitialCellForEvent = mxGraphHandler.prototype.getInitialCellForEvent; - mxGraphHandler.prototype.getInitialCellForEvent = function(me) - { - var model = this.graph.getModel(); - var psel = model.getParent(this.graph.getSelectionCell()); - var cell = graphHandlerGetInitialCellForEvent.apply(this, arguments); - var parent = model.getParent(cell); - - if (psel == null || (psel != cell && psel != parent)) - { - while (!this.graph.isCellSelected(cell) && !this.graph.isCellSelected(parent) && - model.isVertex(parent) && !this.graph.isContainer(parent)) - { - cell = parent; - parent = this.graph.getModel().getParent(cell); - } - } - - return cell; - }; - - // Selection is delayed to mouseup if ancestor is selected - var graphHandlerIsDelayedSelection = mxGraphHandler.prototype.isDelayedSelection; - mxGraphHandler.prototype.isDelayedSelection = function(cell, me) - { - var result = graphHandlerIsDelayedSelection.apply(this, arguments); - - if (!result) - { - var model = this.graph.getModel(); - var parent = model.getParent(cell); - - while (parent != null) - { - // Inconsistency for unselected parent swimlane is intended for easier moving - // of stack layouts where the container title section is too far away - if (this.graph.isCellSelected(parent) && model.isVertex(parent)) - { - result = true; - break; - } - - parent = model.getParent(parent); - } - } - - return result; - }; - - // Delayed selection of parent group - mxGraphHandler.prototype.selectDelayed = function(me) - { - if (!this.graph.popupMenuHandler.isPopupTrigger(me)) - { - var cell = me.getCell(); - - if (cell == null) - { - cell = this.cell; - } - - // Selects folded cell for hit on folding icon - var state = this.graph.view.getState(cell) - - if (state != null && me.isSource(state.control)) - { - this.graph.selectCellForEvent(cell, me.getEvent()); - } - else - { - var model = this.graph.getModel(); - var parent = model.getParent(cell); - - while (!this.graph.isCellSelected(parent) && model.isVertex(parent)) - { - cell = parent; - parent = model.getParent(cell); - } - - this.graph.selectCellForEvent(cell, me.getEvent()); - } - } - }; - - // Returns last selected ancestor - mxPopupMenuHandler.prototype.getCellForPopupEvent = function(me) - { - var cell = me.getCell(); - var model = this.graph.getModel(); - var parent = model.getParent(cell); - - while (model.isVertex(parent) && !this.graph.isContainer(parent)) - { - if (this.graph.isCellSelected(parent)) - { - cell = parent; - } - - parent = model.getParent(parent); - } - - return cell; - }; - -})(); diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/EditorUi.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/EditorUi.js deleted file mode 100644 index aed65272..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/EditorUi.js +++ /dev/null @@ -1,4234 +0,0 @@ -/** - * Copyright (c) 2006-2012, JGraph Ltd - */ -/** - * Constructs a new graph editor - */ -EditorUi = function(editor, container, lightbox) -{ - mxEventSource.call(this); - - this.destroyFunctions = []; - this.editor = editor || new Editor(); - this.container = container || document.body; - - var graph = this.editor.graph; - graph.lightbox = lightbox; - graph.useCssTransforms = - this.editor.isChromelessView() && - graph.isCssTransformsSupported(); - - // Faster scrollwheel zoom is possible with CSS transforms - if (graph.useCssTransforms) - { - this.lazyZoomDelay = 0; - } - - // Pre-fetches submenu image or replaces with embedded image if supported - if (mxClient.IS_SVG) - { - mxPopupMenu.prototype.submenuImage = 'data:image/gif;base64,R0lGODlhCQAJAIAAAP///zMzMyH5BAEAAAAALAAAAAAJAAkAAAIPhI8WebHsHopSOVgb26AAADs='; - } - else - { - new Image().src = mxPopupMenu.prototype.submenuImage; - } - - // Pre-fetches connect image - if (!mxClient.IS_SVG && mxConnectionHandler.prototype.connectImage != null) - { - new Image().src = mxConnectionHandler.prototype.connectImage.src; - } - - // Disables graph and forced panning in chromeless mode - if (this.editor.chromeless && !this.editor.editable) - { - this.footerHeight = 0; - graph.isEnabled = function() { return false; }; - graph.panningHandler.isForcePanningEvent = function(me) - { - return !mxEvent.isPopupTrigger(me.getEvent()); - }; - } - - // Creates the user interface - this.actions = new Actions(this); - this.menus = this.createMenus(); - this.createDivs(); - this.createUi(); - this.refresh(); - - // Disables HTML and text selection - var textEditing = mxUtils.bind(this, function(evt) - { - if (evt == null) - { - evt = window.event; - } - return (this.isSelectionAllowed(evt) || graph.isEditing()); - }); - - //begin add by wsp, 直接返回 true - //作者本意是想禁止用户选择界面文字,但会带来一个问题,当自定义 format 面板中需要动态产生一个 textarea 时, - //因为这个函数将导致生成的 textarea 无法获得焦点。 - var textEditing2 = mxUtils.bind(this, function(evt) - { - if (evt == null) - { - evt = window.event; - } - return true; - }); - //end add by wsp - - // Disables text selection while not editing and no dialog visible - if (this.container == document.body) - { - this.menubarContainer.onselectstart = textEditing; - this.menubarContainer.onmousedown = textEditing; - this.toolbarContainer.onselectstart = textEditing; - this.toolbarContainer.onmousedown = textEditing; - this.diagramContainer.onselectstart = textEditing; - this.diagramContainer.onmousedown = textEditing; - this.sidebarContainer.onselectstart = textEditing; - this.sidebarContainer.onmousedown = textEditing; - //begin modify by wsp,让格式面板中的 textarea 可获得焦点 - this.formatContainer.onselectstart = textEditing2; - this.formatContainer.onmousedown = textEditing2; - //end modify by wsp - this.footerContainer.onselectstart = textEditing; - this.footerContainer.onmousedown = textEditing; - - if (this.tabContainer != null) - { - // Mouse down is needed for drag and drop - this.tabContainer.onselectstart = textEditing; - } - } - - // And uses built-in context menu while editing - if (!this.editor.chromeless || this.editor.editable) - { - // Allows context menu for links in hints - var linkHandler = function(evt) - { - var source = mxEvent.getSource(evt); - - if (source.nodeName == 'A') - { - while (source != null) - { - if (source.className == 'geHint') - { - return true; - } - - source = source.parentNode; - } - } - - return textEditing(evt); - }; - - if (mxClient.IS_IE && (typeof(document.documentMode) === 'undefined' || document.documentMode < 9)) - { - mxEvent.addListener(this.diagramContainer, 'contextmenu', linkHandler); - } - else - { - // Allows browser context menu outside of diagram and sidebar - this.diagramContainer.oncontextmenu = linkHandler; - } - } - else - { - graph.panningHandler.usePopupTrigger = false; - } - - // Contains the main graph instance inside the given panel - graph.init(this.diagramContainer); - - // Improves line wrapping for in-place editor - if (mxClient.IS_SVG && graph.view.getDrawPane() != null) - { - var root = graph.view.getDrawPane().ownerSVGElement; - - if (root != null) - { - root.style.position = 'absolute'; - } - } - - // Creates hover icons - this.hoverIcons = this.createHoverIcons(); - - // Adds tooltip when mouse is over scrollbars to show space-drag panning option - mxEvent.addListener(this.diagramContainer, 'mousemove', mxUtils.bind(this, function(evt) - { - var off = mxUtils.getOffset(this.diagramContainer); - - if (mxEvent.getClientX(evt) - off.x - this.diagramContainer.clientWidth > 0 || - mxEvent.getClientY(evt) - off.y - this.diagramContainer.clientHeight > 0) - { - this.diagramContainer.setAttribute('title', mxResources.get('panTooltip')); - } - else - { - this.diagramContainer.removeAttribute('title'); - } - })); - - // Escape key hides dialogs, adds space+drag panning - var spaceKeyPressed = false; - - // Overrides hovericons to disable while space key is pressed - var hoverIconsIsResetEvent = this.hoverIcons.isResetEvent; - - this.hoverIcons.isResetEvent = function(evt, allowShift) - { - return spaceKeyPressed || hoverIconsIsResetEvent.apply(this, arguments); - }; - - this.keydownHandler = mxUtils.bind(this, function(evt) - { - if (evt.which == 32 /* Space */) - { - spaceKeyPressed = true; - this.hoverIcons.reset(); - graph.container.style.cursor = 'move'; - - // Disables scroll after space keystroke with scrollbars - if (!graph.isEditing() && mxEvent.getSource(evt) == graph.container) - { - mxEvent.consume(evt); - } - } - else if (!mxEvent.isConsumed(evt) && evt.keyCode == 27 /* Escape */) - { - this.hideDialog(); - } - }); - - mxEvent.addListener(document, 'keydown', this.keydownHandler); - - this.keyupHandler = mxUtils.bind(this, function(evt) - { - graph.container.style.cursor = ''; - spaceKeyPressed = false; - }); - - mxEvent.addListener(document, 'keyup', this.keyupHandler); - - // Forces panning for middle and right mouse buttons - var panningHandlerIsForcePanningEvent = graph.panningHandler.isForcePanningEvent; - graph.panningHandler.isForcePanningEvent = function(me) - { - // Ctrl+left button is reported as right button in FF on Mac - return panningHandlerIsForcePanningEvent.apply(this, arguments) || - spaceKeyPressed || (mxEvent.isMouseEvent(me.getEvent()) && - (this.usePopupTrigger || !mxEvent.isPopupTrigger(me.getEvent())) && - ((!mxEvent.isControlDown(me.getEvent()) && - mxEvent.isRightMouseButton(me.getEvent())) || - mxEvent.isMiddleMouseButton(me.getEvent()))); - }; - - // Ctrl/Cmd+Enter applies editing value except in Safari where Ctrl+Enter creates - // a new line (while Enter creates a new paragraph and Shift+Enter stops) - var cellEditorIsStopEditingEvent = graph.cellEditor.isStopEditingEvent; - graph.cellEditor.isStopEditingEvent = function(evt) - { - return cellEditorIsStopEditingEvent.apply(this, arguments) || - (evt.keyCode == 13 && ((!mxClient.IS_SF && mxEvent.isControlDown(evt)) || - (mxClient.IS_MAC && mxEvent.isMetaDown(evt)) || - (mxClient.IS_SF && mxEvent.isShiftDown(evt)))); - }; - - // Switches toolbar for text editing - var textMode = false; - var fontMenu = null; - var sizeMenu = null; - var nodes = null; - - var updateToolbar = mxUtils.bind(this, function() - { - if (this.toolbar != null && textMode != graph.cellEditor.isContentEditing()) - { - var node = this.toolbar.container.firstChild; - var newNodes = []; - - while (node != null) - { - var tmp = node.nextSibling; - - if (mxUtils.indexOf(this.toolbar.staticElements, node) < 0) - { - node.parentNode.removeChild(node); - newNodes.push(node); - } - - node = tmp; - } - - // Saves references to special items - var tmp1 = this.toolbar.fontMenu; - var tmp2 = this.toolbar.sizeMenu; - - if (nodes == null) - { - this.toolbar.createTextToolbar(); - } - else - { - for (var i = 0; i < nodes.length; i++) - { - this.toolbar.container.appendChild(nodes[i]); - } - - // Restores references to special items - this.toolbar.fontMenu = fontMenu; - this.toolbar.sizeMenu = sizeMenu; - } - - textMode = graph.cellEditor.isContentEditing(); - fontMenu = tmp1; - sizeMenu = tmp2; - nodes = newNodes; - } - }); - - var ui = this; - - // Overrides cell editor to update toolbar - var cellEditorStartEditing = graph.cellEditor.startEditing; - graph.cellEditor.startEditing = function() - { - cellEditorStartEditing.apply(this, arguments); - updateToolbar(); - - if (graph.cellEditor.isContentEditing()) - { - var updating = false; - - var updateCssHandler = function() - { - if (!updating) - { - updating = true; - - window.setTimeout(function() - { - var selectedElement = graph.getSelectedElement(); - var node = selectedElement; - - while (node != null && node.nodeType != mxConstants.NODETYPE_ELEMENT) - { - node = node.parentNode; - } - - if (node != null) - { - var css = mxUtils.getCurrentStyle(node); - - if (css != null && ui.toolbar != null) - { - // Strips leading and trailing quotes - var ff = css.fontFamily; - - if (ff.charAt(0) == '\'') - { - ff = ff.substring(1); - } - - if (ff.charAt(ff.length - 1) == '\'') - { - ff = ff.substring(0, ff.length - 1); - } - - ui.toolbar.setFontName(ff); - ui.toolbar.setFontSize(parseInt(css.fontSize)); - } - } - - updating = false; - }, 0); - } - }; - - mxEvent.addListener(graph.cellEditor.textarea, 'input', updateCssHandler) - mxEvent.addListener(graph.cellEditor.textarea, 'touchend', updateCssHandler); - mxEvent.addListener(graph.cellEditor.textarea, 'mouseup', updateCssHandler); - mxEvent.addListener(graph.cellEditor.textarea, 'keyup', updateCssHandler); - updateCssHandler(); - } - }; - - var cellEditorStopEditing = graph.cellEditor.stopEditing; - graph.cellEditor.stopEditing = function(cell, trigger) - { - cellEditorStopEditing.apply(this, arguments); - updateToolbar(); - }; - - // Enables scrollbars and sets cursor style for the container - graph.container.setAttribute('tabindex', '0'); - graph.container.style.cursor = 'default'; - - // Workaround for page scroll if embedded via iframe - if (window.self === window.top && graph.container.parentNode != null) - { - try - { - graph.container.focus(); - } - catch (e) - { - // ignores error in old versions of IE - } - } - - // Keeps graph container focused on mouse down - var graphFireMouseEvent = graph.fireMouseEvent; - graph.fireMouseEvent = function(evtName, me, sender) - { - if (evtName == mxEvent.MOUSE_DOWN) - { - this.container.focus(); - } - - graphFireMouseEvent.apply(this, arguments); - }; - - // Configures automatic expand on mouseover - graph.popupMenuHandler.autoExpand = true; - - // Installs context menu - if (this.menus != null) - { - graph.popupMenuHandler.factoryMethod = mxUtils.bind(this, function(menu, cell, evt) - { - this.menus.createPopupMenu(menu, cell, evt); - }); - } - - // Hides context menu - mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt) - { - graph.popupMenuHandler.hideMenu(); - })); - - // Create handler for key events - this.keyHandler = this.createKeyHandler(editor); - - // Getter for key handler - this.getKeyHandler = function() - { - return keyHandler; - }; - - // Stores the current style and assigns it to new cells - var styles = ['rounded', 'shadow', 'glass', 'dashed', 'dashPattern', 'comic', 'labelBackgroundColor']; - var connectStyles = ['shape', 'edgeStyle', 'curved', 'rounded', 'elbow', 'comic', 'jumpStyle', 'jumpSize']; - - // Note: Everything that is not in styles is ignored (styles is augmented below) - this.setDefaultStyle = function(cell) - { - var state = graph.view.getState(cell); - - if (state != null) - { - // Ignores default styles - var clone = cell.clone(); - clone.style = '' - var defaultStyle = graph.getCellStyle(clone); - var values = []; - var keys = []; - - for (var key in state.style) - { - if (defaultStyle[key] != state.style[key]) - { - values.push(state.style[key]); - keys.push(key); - } - } - - // Handles special case for value "none" - var cellStyle = graph.getModel().getStyle(state.cell); - var tokens = (cellStyle != null) ? cellStyle.split(';') : []; - - for (var i = 0; i < tokens.length; i++) - { - var tmp = tokens[i]; - var pos = tmp.indexOf('='); - - if (pos >= 0) - { - var key = tmp.substring(0, pos); - var value = tmp.substring(pos + 1); - - if (defaultStyle[key] != null && value == 'none') - { - values.push(value); - keys.push(key); - } - } - } - - // Resets current style - if (graph.getModel().isEdge(state.cell)) - { - graph.currentEdgeStyle = {}; - } - else - { - graph.currentVertexStyle = {} - } - - this.fireEvent(new mxEventObject('styleChanged', 'keys', keys, 'values', values, 'cells', [state.cell])); - } - }; - - this.clearDefaultStyle = function() - { - graph.currentEdgeStyle = mxUtils.clone(graph.defaultEdgeStyle); - graph.currentVertexStyle = mxUtils.clone(graph.defaultVertexStyle); - - // Updates UI - this.fireEvent(new mxEventObject('styleChanged', 'keys', [], 'values', [], 'cells', [])); - }; - - // Keys that should be ignored if the cell has a value (known: new default for all cells is html=1 so - // for the html key this effecticely only works for edges inserted via the connection handler) - var valueStyles = ['fontFamily', 'fontSize', 'fontColor']; - - // Keys that always update the current edge style regardless of selection - var alwaysEdgeStyles = ['edgeStyle', 'startArrow', 'startFill', 'startSize', 'endArrow', - 'endFill', 'endSize', 'jettySize', 'orthogonalLoop']; - - // Keys that are ignored together (if one appears all are ignored) - var keyGroups = [['startArrow', 'startFill', 'startSize', 'endArrow', 'endFill', 'endSize', 'jettySize', 'orthogonalLoop'], - ['strokeColor', 'strokeWidth'], - ['fillColor', 'gradientColor'], - valueStyles, - ['opacity'], - ['align'], - ['html']]; - - // Adds all keys used above to the styles array - for (var i = 0; i < keyGroups.length; i++) - { - for (var j = 0; j < keyGroups[i].length; j++) - { - styles.push(keyGroups[i][j]); - } - } - - for (var i = 0; i < connectStyles.length; i++) - { - if (mxUtils.indexOf(styles, connectStyles[i]) < 0) - { - styles.push(connectStyles[i]); - } - } - - // Implements a global current style for edges and vertices that is applied to new cells - var insertHandler = function(cells, asText) - { - var model = graph.getModel(); - - model.beginUpdate(); - try - { - // Applies only basic text styles - if (asText) - { - var edge = model.isEdge(cell); - var current = (edge) ? graph.currentEdgeStyle : graph.currentVertexStyle; - var textStyles = ['fontSize', 'fontFamily', 'fontColor']; - - for (var j = 0; j < textStyles.length; j++) - { - var value = current[textStyles[j]]; - - if (value != null) - { - graph.setCellStyles(textStyles[j], value, cells); - } - } - } - else - { - for (var i = 0; i < cells.length; i++) - { - var cell = cells[i]; - - // Removes styles defined in the cell style from the styles to be applied - var cellStyle = model.getStyle(cell); - var tokens = (cellStyle != null) ? cellStyle.split(';') : []; - var appliedStyles = styles.slice(); - - for (var j = 0; j < tokens.length; j++) - { - var tmp = tokens[j]; - var pos = tmp.indexOf('='); - - if (pos >= 0) - { - var key = tmp.substring(0, pos); - var index = mxUtils.indexOf(appliedStyles, key); - - if (index >= 0) - { - appliedStyles.splice(index, 1); - } - - // Handles special cases where one defined style ignores other styles - for (var k = 0; k < keyGroups.length; k++) - { - var group = keyGroups[k]; - - if (mxUtils.indexOf(group, key) >= 0) - { - for (var l = 0; l < group.length; l++) - { - var index2 = mxUtils.indexOf(appliedStyles, group[l]); - - if (index2 >= 0) - { - appliedStyles.splice(index2, 1); - } - } - } - } - } - } - - // Applies the current style to the cell - var edge = model.isEdge(cell); - var current = (edge) ? graph.currentEdgeStyle : graph.currentVertexStyle; - var newStyle = model.getStyle(cell); - - for (var j = 0; j < appliedStyles.length; j++) - { - var key = appliedStyles[j]; - var styleValue = current[key]; - - if (styleValue != null && (key != 'shape' || edge)) - { - // Special case: Connect styles are not applied here but in the connection handler - if (!edge || mxUtils.indexOf(connectStyles, key) < 0) - { - newStyle = mxUtils.setStyle(newStyle, key, styleValue); - } - } - } - - model.setStyle(cell, newStyle); - } - } - } - finally - { - model.endUpdate(); - } - }; - - graph.addListener('cellsInserted', function(sender, evt) - { - insertHandler(evt.getProperty('cells')); - }); - - graph.addListener('textInserted', function(sender, evt) - { - insertHandler(evt.getProperty('cells'), true); - }); - - graph.connectionHandler.addListener(mxEvent.CONNECT, function(sender, evt) - { - var cells = [evt.getProperty('cell')]; - - if (evt.getProperty('terminalInserted')) - { - cells.push(evt.getProperty('terminal')); - } - - insertHandler(cells); - }); - - this.addListener('styleChanged', mxUtils.bind(this, function(sender, evt) - { - // Checks if edges and/or vertices were modified - var cells = evt.getProperty('cells'); - var vertex = false; - var edge = false; - - if (cells.length > 0) - { - for (var i = 0; i < cells.length; i++) - { - vertex = graph.getModel().isVertex(cells[i]) || vertex; - edge = graph.getModel().isEdge(cells[i]) || edge; - - if (edge && vertex) - { - break; - } - } - } - else - { - vertex = true; - edge = true; - } - - var keys = evt.getProperty('keys'); - var values = evt.getProperty('values'); - - for (var i = 0; i < keys.length; i++) - { - var common = mxUtils.indexOf(valueStyles, keys[i]) >= 0; - - // Ignores transparent stroke colors - if (keys[i] != 'strokeColor' || (values[i] != null && values[i] != 'none')) - { - // Special case: Edge style and shape - if (mxUtils.indexOf(connectStyles, keys[i]) >= 0) - { - if (edge || mxUtils.indexOf(alwaysEdgeStyles, keys[i]) >= 0) - { - if (values[i] == null) - { - delete graph.currentEdgeStyle[keys[i]]; - } - else - { - graph.currentEdgeStyle[keys[i]] = values[i]; - } - } - // Uses style for vertex if defined in styles - else if (vertex && mxUtils.indexOf(styles, keys[i]) >= 0) - { - if (values[i] == null) - { - delete graph.currentVertexStyle[keys[i]]; - } - else - { - graph.currentVertexStyle[keys[i]] = values[i]; - } - } - } - else if (mxUtils.indexOf(styles, keys[i]) >= 0) - { - if (vertex || common) - { - if (values[i] == null) - { - delete graph.currentVertexStyle[keys[i]]; - } - else - { - graph.currentVertexStyle[keys[i]] = values[i]; - } - } - - if (edge || common || mxUtils.indexOf(alwaysEdgeStyles, keys[i]) >= 0) - { - if (values[i] == null) - { - delete graph.currentEdgeStyle[keys[i]]; - } - else - { - graph.currentEdgeStyle[keys[i]] = values[i]; - } - } - } - } - } - - if (this.toolbar != null) - { - this.toolbar.setFontName(graph.currentVertexStyle['fontFamily'] || Menus.prototype.defaultFont); - this.toolbar.setFontSize(graph.currentVertexStyle['fontSize'] || Menus.prototype.defaultFontSize); - - if (this.toolbar.edgeStyleMenu != null) - { - // Updates toolbar icon for edge style - var edgeStyleDiv = this.toolbar.edgeStyleMenu.getElementsByTagName('div')[0]; - - if (graph.currentEdgeStyle['edgeStyle'] == 'orthogonalEdgeStyle' && graph.currentEdgeStyle['curved'] == '1') - { - edgeStyleDiv.className = 'geSprite geSprite-curved'; - } - else if (graph.currentEdgeStyle['edgeStyle'] == 'straight' || graph.currentEdgeStyle['edgeStyle'] == 'none' || - graph.currentEdgeStyle['edgeStyle'] == null) - { - edgeStyleDiv.className = 'geSprite geSprite-straight'; - } - else if (graph.currentEdgeStyle['edgeStyle'] == 'entityRelationEdgeStyle') - { - edgeStyleDiv.className = 'geSprite geSprite-entity'; - } - else if (graph.currentEdgeStyle['edgeStyle'] == 'elbowEdgeStyle') - { - edgeStyleDiv.className = 'geSprite geSprite-' + ((graph.currentEdgeStyle['elbow'] == 'vertical') ? - 'verticalelbow' : 'horizontalelbow'); - } - else if (graph.currentEdgeStyle['edgeStyle'] == 'isometricEdgeStyle') - { - edgeStyleDiv.className = 'geSprite geSprite-' + ((graph.currentEdgeStyle['elbow'] == 'vertical') ? - 'verticalisometric' : 'horizontalisometric'); - } - else - { - edgeStyleDiv.className = 'geSprite geSprite-orthogonal'; - } - } - - if (this.toolbar.edgeShapeMenu != null) - { - // Updates icon for edge shape - var edgeShapeDiv = this.toolbar.edgeShapeMenu.getElementsByTagName('div')[0]; - - if (graph.currentEdgeStyle['shape'] == 'link') - { - edgeShapeDiv.className = 'geSprite geSprite-linkedge'; - } - else if (graph.currentEdgeStyle['shape'] == 'flexArrow') - { - edgeShapeDiv.className = 'geSprite geSprite-arrow'; - } - else if (graph.currentEdgeStyle['shape'] == 'arrow') - { - edgeShapeDiv.className = 'geSprite geSprite-simplearrow'; - } - else - { - edgeShapeDiv.className = 'geSprite geSprite-connection'; - } - } - - // Updates icon for optinal line start shape - if (this.toolbar.lineStartMenu != null) - { - var lineStartDiv = this.toolbar.lineStartMenu.getElementsByTagName('div')[0]; - - lineStartDiv.className = this.getCssClassForMarker('start', - graph.currentEdgeStyle['shape'], graph.currentEdgeStyle[mxConstants.STYLE_STARTARROW], - mxUtils.getValue(graph.currentEdgeStyle, 'startFill', '1')); - } - - // Updates icon for optinal line end shape - if (this.toolbar.lineEndMenu != null) - { - var lineEndDiv = this.toolbar.lineEndMenu.getElementsByTagName('div')[0]; - - lineEndDiv.className = this.getCssClassForMarker('end', - graph.currentEdgeStyle['shape'], graph.currentEdgeStyle[mxConstants.STYLE_ENDARROW], - mxUtils.getValue(graph.currentEdgeStyle, 'endFill', '1')); - } - } - })); - - // Update font size and font family labels - if (this.toolbar != null) - { - var update = mxUtils.bind(this, function() - { - var ff = graph.currentVertexStyle['fontFamily'] || 'Helvetica'; - var fs = String(graph.currentVertexStyle['fontSize'] || '12'); - var state = graph.getView().getState(graph.getSelectionCell()); - - if (state != null) - { - ff = state.style[mxConstants.STYLE_FONTFAMILY] || ff; - fs = state.style[mxConstants.STYLE_FONTSIZE] || fs; - - if (ff.length > 10) - { - ff = ff.substring(0, 8) + '...'; - } - } - - this.toolbar.setFontName(ff); - this.toolbar.setFontSize(fs); - }); - - graph.getSelectionModel().addListener(mxEvent.CHANGE, update); - graph.getModel().addListener(mxEvent.CHANGE, update); - } - - // Makes sure the current layer is visible when cells are added - graph.addListener(mxEvent.CELLS_ADDED, function(sender, evt) - { - var cells = evt.getProperty('cells'); - var parent = evt.getProperty('parent'); - - if (graph.getModel().isLayer(parent) && !graph.isCellVisible(parent) && cells != null && cells.length > 0) - { - graph.getModel().setVisible(parent, true); - } - }); - - // Global handler to hide the current menu - this.gestureHandler = mxUtils.bind(this, function(evt) - { - if (this.currentMenu != null && mxEvent.getSource(evt) != this.currentMenu.div) - { - this.hideCurrentMenu(); - } - }); - - mxEvent.addGestureListeners(document, this.gestureHandler); - - // Updates the editor UI after the window has been resized or the orientation changes - // Timeout is workaround for old IE versions which have a delay for DOM client sizes. - // Should not use delay > 0 to avoid handle multiple repaints during window resize - this.resizeHandler = mxUtils.bind(this, function() - { - window.setTimeout(mxUtils.bind(this, function() - { - if (this.editor.graph != null) - { - this.refresh(); - } - }), 0); - }); - - mxEvent.addListener(window, 'resize', this.resizeHandler); - - this.orientationChangeHandler = mxUtils.bind(this, function() - { - this.refresh(); - }); - - mxEvent.addListener(window, 'orientationchange', this.orientationChangeHandler); - - // Workaround for bug on iOS see - // http://stackoverflow.com/questions/19012135/ios-7-ipad-safari-landscape-innerheight-outerheight-layout-issue - if (mxClient.IS_IOS && !window.navigator.standalone) - { - this.scrollHandler = mxUtils.bind(this, function() - { - window.scrollTo(0, 0); - }); - - mxEvent.addListener(window, 'scroll', this.scrollHandler); - } - - /** - * Sets the initial scrollbar locations after a file was loaded. - */ - this.editor.addListener('resetGraphView', mxUtils.bind(this, function() - { - this.resetScrollbars(); - })); - - /** - * Repaints the grid. - */ - this.addListener('gridEnabledChanged', mxUtils.bind(this, function() - { - graph.view.validateBackground(); - })); - - this.addListener('backgroundColorChanged', mxUtils.bind(this, function() - { - graph.view.validateBackground(); - })); - - /** - * Repaints the grid. - */ - graph.addListener('gridSizeChanged', mxUtils.bind(this, function() - { - if (graph.isGridEnabled()) - { - graph.view.validateBackground(); - } - })); - - // Resets UI, updates action and menu states - this.editor.resetGraph(); - this.init(); - this.open(); -}; - -// Extends mxEventSource -mxUtils.extend(EditorUi, mxEventSource); - -/** - * Global config that specifies if the compact UI elements should be used. - */ -EditorUi.compactUi = true; - -/** - * Specifies the size of the split bar. - */ -EditorUi.prototype.splitSize = (mxClient.IS_TOUCH || mxClient.IS_POINTER) ? 12 : 8; - -/** - * Specifies the height of the menubar. Default is 34. - */ -//begin modify by wsp, 将菜单栏的高度设置为0,即隐藏菜单栏 -EditorUi.prototype.menubarHeight = 30; -//EditorUi.prototype.menubarHeight = 0; - -/** - * Specifies the width of the format panel should be enabled. Default is true. - */ -EditorUi.prototype.formatEnabled = true; - -/** - * Specifies the width of the format panel. Default is 240. - */ -EditorUi.prototype.formatWidth = 240; - -/** - * Specifies the height of the toolbar. Default is 36. - */ -EditorUi.prototype.toolbarHeight = 34; - -/** - * Specifies the height of the footer. Default is 28. - */ -EditorUi.prototype.footerHeight = 28; - -/** - * Specifies the height of the optional sidebarFooterContainer. Default is 34. - */ -EditorUi.prototype.sidebarFooterHeight = 34; - -/** - * Specifies the position of the horizontal split bar. Default is 208 or 118 for - * screen widths <= 640px. - */ -EditorUi.prototype.hsplitPosition = (screen.width <= 640) ? 118 : 208; - -/** - * Specifies if animations are allowed in . Default is true. - */ -EditorUi.prototype.allowAnimation = true; - -/** - * Specifies if animations are allowed in . Default is true. - */ -EditorUi.prototype.lightboxMaxFitScale = 2; - -/** - * Specifies if animations are allowed in . Default is true. - */ -EditorUi.prototype.lightboxVerticalDivider = 4; - -/** - * Specifies if single click on horizontal split should collapse sidebar. Default is false. - */ -EditorUi.prototype.hsplitClickEnabled = false; - -/** - * Installs the listeners to update the action states. - */ -EditorUi.prototype.init = function() -{ - /** - * Keypress starts immediate editing on selection cell - */ - var graph = this.editor.graph; - - mxEvent.addListener(graph.container, 'keydown', mxUtils.bind(this, function(evt) - { - this.onKeyDown(evt); - })); - mxEvent.addListener(graph.container, 'keypress', mxUtils.bind(this, function(evt) - { - this.onKeyPress(evt); - })); - - // Updates action states - this.addUndoListener(); - this.addBeforeUnloadListener(); - - graph.getSelectionModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function() - { - this.updateActionStates(); - })); - - graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function() - { - this.updateActionStates(); - })); - - // Changes action states after change of default parent - var graphSetDefaultParent = graph.setDefaultParent; - var ui = this; - - this.editor.graph.setDefaultParent = function() - { - graphSetDefaultParent.apply(this, arguments); - ui.updateActionStates(); - }; - - // Hack to make editLink available in vertex handler - graph.editLink = ui.actions.get('editLink').funct; - - this.updateActionStates(); - this.initClipboard(); - this.initCanvas(); - - if (this.format != null) - { - this.format.init(); - } -}; - -/** - * Returns true if the given event should start editing. This implementation returns true. - */ -EditorUi.prototype.onKeyDown = function(evt) -{ - var graph = this.editor.graph; - - // Tab selects next cell - if (evt.which == 9 && graph.isEnabled() && !mxEvent.isAltDown(evt)) - { - if (graph.isEditing()) - { - graph.stopEditing(false); - } - else - { - graph.selectCell(!mxEvent.isShiftDown(evt)); - } - - mxEvent.consume(evt); - } -}; - -/** - * Returns true if the given event should start editing. This implementation returns true. - */ -EditorUi.prototype.onKeyPress = function(evt) -{ - var graph = this.editor.graph; - - // KNOWN: Focus does not work if label is empty in quirks mode - if (this.isImmediateEditingEvent(evt) && !graph.isEditing() && !graph.isSelectionEmpty() && evt.which !== 0 && - !mxEvent.isAltDown(evt) && !mxEvent.isControlDown(evt) && !mxEvent.isMetaDown(evt)) - { - graph.escape(); - graph.startEditing(); - - // Workaround for FF where char is lost if cursor is placed before char - if (mxClient.IS_FF) - { - var ce = graph.cellEditor; - ce.textarea.innerHTML = String.fromCharCode(evt.which); - - // Moves cursor to end of textarea - var range = document.createRange(); - range.selectNodeContents(ce.textarea); - range.collapse(false); - var sel = window.getSelection(); - sel.removeAllRanges(); - sel.addRange(range); - } - } -}; - -/** - * Returns true if the given event should start editing. This implementation returns true. - */ -EditorUi.prototype.isImmediateEditingEvent = function(evt) -{ - return true; -}; - -/** - * Private helper method. - */ -EditorUi.prototype.getCssClassForMarker = function(prefix, shape, marker, fill) -{ - var result = ''; - - if (shape == 'flexArrow') - { - result = (marker != null && marker != mxConstants.NONE) ? - 'geSprite geSprite-' + prefix + 'blocktrans' : 'geSprite geSprite-noarrow'; - } - else - { - if (marker == mxConstants.ARROW_CLASSIC) - { - result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'classic' : 'geSprite geSprite-' + prefix + 'classictrans'; - } - else if (marker == mxConstants.ARROW_CLASSIC_THIN) - { - result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'classicthin' : 'geSprite geSprite-' + prefix + 'classicthintrans'; - } - else if (marker == mxConstants.ARROW_OPEN) - { - result = 'geSprite geSprite-' + prefix + 'open'; - } - else if (marker == mxConstants.ARROW_OPEN_THIN) - { - result = 'geSprite geSprite-' + prefix + 'openthin'; - } - else if (marker == mxConstants.ARROW_BLOCK) - { - result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'block' : 'geSprite geSprite-' + prefix + 'blocktrans'; - } - else if (marker == mxConstants.ARROW_BLOCK_THIN) - { - result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'blockthin' : 'geSprite geSprite-' + prefix + 'blockthintrans'; - } - else if (marker == mxConstants.ARROW_OVAL) - { - result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'oval' : 'geSprite geSprite-' + prefix + 'ovaltrans'; - } - else if (marker == mxConstants.ARROW_DIAMOND) - { - result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'diamond' : 'geSprite geSprite-' + prefix + 'diamondtrans'; - } - else if (marker == mxConstants.ARROW_DIAMOND_THIN) - { - result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'thindiamond' : 'geSprite geSprite-' + prefix + 'thindiamondtrans'; - } - else if (marker == 'openAsync') - { - result = 'geSprite geSprite-' + prefix + 'openasync'; - } - else if (marker == 'dash') - { - result = 'geSprite geSprite-' + prefix + 'dash'; - } - else if (marker == 'cross') - { - result = 'geSprite geSprite-' + prefix + 'cross'; - } - else if (marker == 'async') - { - result = (fill == '1') ? 'geSprite geSprite-' + prefix + 'async' : 'geSprite geSprite-' + prefix + 'asynctrans'; - } - else if (marker == 'circle' || marker == 'circlePlus') - { - result = (fill == '1' || marker == 'circle') ? 'geSprite geSprite-' + prefix + 'circle' : 'geSprite geSprite-' + prefix + 'circleplus'; - } - else if (marker == 'ERone') - { - result = 'geSprite geSprite-' + prefix + 'erone'; - } - else if (marker == 'ERmandOne') - { - result = 'geSprite geSprite-' + prefix + 'eronetoone'; - } - else if (marker == 'ERmany') - { - result = 'geSprite geSprite-' + prefix + 'ermany'; - } - else if (marker == 'ERoneToMany') - { - result = 'geSprite geSprite-' + prefix + 'eronetomany'; - } - else if (marker == 'ERzeroToOne') - { - result = 'geSprite geSprite-' + prefix + 'eroneopt'; - } - else if (marker == 'ERzeroToMany') - { - result = 'geSprite geSprite-' + prefix + 'ermanyopt'; - } - else - { - result = 'geSprite geSprite-noarrow'; - } - } - - return result; -}; - -/** - * Overridden in Menus.js - */ -EditorUi.prototype.createMenus = function() -{ - return null; -}; - -/** - * Hook for allowing selection and context menu for certain events. - */ -EditorUi.prototype.updatePasteActionStates = function() -{ - var graph = this.editor.graph; - var paste = this.actions.get('paste'); - var pasteHere = this.actions.get('pasteHere'); - - paste.setEnabled(this.editor.graph.cellEditor.isContentEditing() || (!mxClipboard.isEmpty() && - graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent()))); - pasteHere.setEnabled(paste.isEnabled()); -}; - -/** - * Hook for allowing selection and context menu for certain events. - */ -EditorUi.prototype.initClipboard = function() -{ - var ui = this; - - var mxClipboardCut = mxClipboard.cut; - mxClipboard.cut = function(graph) - { - if (graph.cellEditor.isContentEditing()) - { - document.execCommand('cut', false, null); - } - else - { - mxClipboardCut.apply(this, arguments); - } - - ui.updatePasteActionStates(); - }; - - var mxClipboardCopy = mxClipboard.copy; - mxClipboard.copy = function(graph) - { - if (graph.cellEditor.isContentEditing()) - { - document.execCommand('copy', false, null); - } - else - { - mxClipboardCopy.apply(this, arguments); - } - - ui.updatePasteActionStates(); - }; - - var mxClipboardPaste = mxClipboard.paste; - mxClipboard.paste = function(graph) - { - var result = null; - - if (graph.cellEditor.isContentEditing()) - { - document.execCommand('paste', false, null); - } - else - { - result = mxClipboardPaste.apply(this, arguments); - } - - ui.updatePasteActionStates(); - - return result; - }; - - // Overrides cell editor to update paste action state - var cellEditorStartEditing = this.editor.graph.cellEditor.startEditing; - - this.editor.graph.cellEditor.startEditing = function() - { - cellEditorStartEditing.apply(this, arguments); - ui.updatePasteActionStates(); - }; - - var cellEditorStopEditing = this.editor.graph.cellEditor.stopEditing; - - this.editor.graph.cellEditor.stopEditing = function(cell, trigger) - { - cellEditorStopEditing.apply(this, arguments); - ui.updatePasteActionStates(); - }; - - this.updatePasteActionStates(); -}; - -/** - * Initializes the infinite canvas. - */ -EditorUi.prototype.lazyZoomDelay = 20; - -/** - * Initializes the infinite canvas. - */ -EditorUi.prototype.initCanvas = function() -{ - // Initial page layout view, scrollBuffer and timer-based scrolling - var graph = this.editor.graph; - graph.timerAutoScroll = true; - - /** - * Returns the padding for pages in page view with scrollbars. - */ - graph.getPagePadding = function() - { - return new mxPoint(Math.max(0, Math.round((graph.container.offsetWidth - 34) / graph.view.scale)), - Math.max(0, Math.round((graph.container.offsetHeight - 34) / graph.view.scale))); - }; - - // Fits the number of background pages to the graph - graph.view.getBackgroundPageBounds = function() - { - var layout = this.graph.getPageLayout(); - var page = this.graph.getPageSize(); - - return new mxRectangle(this.scale * (this.translate.x + layout.x * page.width), - this.scale * (this.translate.y + layout.y * page.height), - this.scale * layout.width * page.width, - this.scale * layout.height * page.height); - }; - - graph.getPreferredPageSize = function(bounds, width, height) - { - var pages = this.getPageLayout(); - var size = this.getPageSize(); - - return new mxRectangle(0, 0, pages.width * size.width, pages.height * size.height); - }; - - // Scales pages/graph to fit available size - var resize = null; - var ui = this; - - if (this.editor.isChromelessView()) - { - resize = mxUtils.bind(this, function(autoscale, maxScale, cx, cy) - { - if (graph.container != null) - { - cx = (cx != null) ? cx : 0; - cy = (cy != null) ? cy : 0; - - var bds = (graph.pageVisible) ? graph.view.getBackgroundPageBounds() : graph.getGraphBounds(); - var scroll = mxUtils.hasScrollbars(graph.container); - var tr = graph.view.translate; - var s = graph.view.scale; - - // Normalizes the bounds - var b = mxRectangle.fromRectangle(bds); - b.x = b.x / s - tr.x; - b.y = b.y / s - tr.y; - b.width /= s; - b.height /= s; - - var st = graph.container.scrollTop; - var sl = graph.container.scrollLeft; - var sb = (mxClient.IS_QUIRKS || document.documentMode >= 8) ? 20 : 14; - - if (document.documentMode == 8 || document.documentMode == 9) - { - sb += 3; - } - - var cw = graph.container.offsetWidth - sb; - var ch = graph.container.offsetHeight - sb; - - var ns = (autoscale) ? Math.max(0.3, Math.min(maxScale || 1, cw / b.width)) : s; - var dx = ((cw - ns * b.width) / 2) / ns; - var dy = (this.lightboxVerticalDivider == 0) ? 0 : ((ch - ns * b.height) / this.lightboxVerticalDivider) / ns; - - if (scroll) - { - dx = Math.max(dx, 0); - dy = Math.max(dy, 0); - } - - if (scroll || bds.width < cw || bds.height < ch) - { - graph.view.scaleAndTranslate(ns, Math.floor(dx - b.x), Math.floor(dy - b.y)); - graph.container.scrollTop = st * ns / s; - graph.container.scrollLeft = sl * ns / s; - } - else if (cx != 0 || cy != 0) - { - var t = graph.view.translate; - graph.view.setTranslate(Math.floor(t.x + cx / s), Math.floor(t.y + cy / s)); - } - } - }); - - // Hack to make function available to subclassers - this.chromelessResize = resize; - - // Hook for subclassers for override - this.chromelessWindowResize = mxUtils.bind(this, function() - { - this.chromelessResize(false); - }); - - // Removable resize listener - var autoscaleResize = mxUtils.bind(this, function() - { - this.chromelessWindowResize(false); - }); - - mxEvent.addListener(window, 'resize', autoscaleResize); - - this.destroyFunctions.push(function() - { - mxEvent.removeListener(window, 'resize', autoscaleResize); - }); - - this.editor.addListener('resetGraphView', mxUtils.bind(this, function() - { - this.chromelessResize(true); - })); - - this.actions.get('zoomIn').funct = mxUtils.bind(this, function(evt) - { - graph.zoomIn(); - this.chromelessResize(false); - }); - this.actions.get('zoomOut').funct = mxUtils.bind(this, function(evt) - { - graph.zoomOut(); - this.chromelessResize(false); - }); - - // Creates toolbar for viewer - do not use CSS here - // as this may be used in a viewer that has no CSS - if (urlParams['toolbar'] != '0') - { - this.chromelessToolbar = document.createElement('div'); - this.chromelessToolbar.style.position = 'fixed'; - this.chromelessToolbar.style.overflow = 'hidden'; - this.chromelessToolbar.style.boxSizing = 'border-box'; - this.chromelessToolbar.style.whiteSpace = 'nowrap'; - this.chromelessToolbar.style.backgroundColor = '#000000'; - this.chromelessToolbar.style.padding = '10px 10px 8px 10px'; - this.chromelessToolbar.style.left = '50%'; - - if (!mxClient.IS_VML) - { - mxUtils.setPrefixedStyle(this.chromelessToolbar.style, 'borderRadius', '20px'); - mxUtils.setPrefixedStyle(this.chromelessToolbar.style, 'transition', 'opacity 600ms ease-in-out'); - } - - var updateChromelessToolbarPosition = mxUtils.bind(this, function() - { - var css = mxUtils.getCurrentStyle(graph.container); - this.chromelessToolbar.style.bottom = ((css != null) ? parseInt(css['margin-bottom'] || 0) : 0) + - ((this.tabContainer != null) ? (20 + parseInt(this.tabContainer.style.height)) : 20) + 'px'; - }); - - this.editor.addListener('resetGraphView', updateChromelessToolbarPosition); - updateChromelessToolbarPosition(); - - var btnCount = 0; - - var addButton = mxUtils.bind(this, function(fn, imgSrc, tip) - { - btnCount++; - - var a = document.createElement('span'); - a.style.paddingLeft = '8px'; - a.style.paddingRight = '8px'; - a.style.cursor = 'pointer'; - mxEvent.addListener(a, 'click', fn); - - if (tip != null) - { - a.setAttribute('title', tip); - } - - var img = document.createElement('img'); - img.setAttribute('border', '0'); - img.setAttribute('src', imgSrc); - - a.appendChild(img); - this.chromelessToolbar.appendChild(a); - - return a; - }); - - var prevButton = addButton(mxUtils.bind(this, function(evt) - { - this.actions.get('previousPage').funct(); - mxEvent.consume(evt); - }), Editor.previousLargeImage, mxResources.get('previousPage')); - - var pageInfo = document.createElement('div'); - pageInfo.style.display = 'inline-block'; - pageInfo.style.verticalAlign = 'top'; - pageInfo.style.fontFamily = 'Helvetica,Arial'; - pageInfo.style.marginTop = '8px'; - pageInfo.style.color = '#ffffff'; - this.chromelessToolbar.appendChild(pageInfo); - - var nextButton = addButton(mxUtils.bind(this, function(evt) - { - this.actions.get('nextPage').funct(); - mxEvent.consume(evt); - }), Editor.nextLargeImage, mxResources.get('nextPage')); - - var updatePageInfo = mxUtils.bind(this, function() - { - if (this.pages != null && this.pages.length > 1 && this.currentPage != null) - { - pageInfo.innerHTML = ''; - mxUtils.write(pageInfo, (mxUtils.indexOf(this.pages, this.currentPage) + 1) + ' / ' + this.pages.length); - } - }); - - prevButton.style.paddingLeft = '0px'; - prevButton.style.paddingRight = '4px'; - nextButton.style.paddingLeft = '4px'; - nextButton.style.paddingRight = '0px'; - - var updatePageButtons = mxUtils.bind(this, function() - { - if (this.pages != null && this.pages.length > 1 && this.currentPage != null) - { - nextButton.style.display = ''; - prevButton.style.display = ''; - pageInfo.style.display = 'inline-block'; - } - else - { - nextButton.style.display = 'none'; - prevButton.style.display = 'none'; - pageInfo.style.display = 'none'; - } - - updatePageInfo(); - }); - - this.editor.addListener('resetGraphView', updatePageButtons); - this.editor.addListener('pageSelected', updatePageInfo); - - addButton(mxUtils.bind(this, function(evt) - { - this.actions.get('zoomOut').funct(); - mxEvent.consume(evt); - }), Editor.zoomOutLargeImage, mxResources.get('zoomOut') + ' (Alt+Mousewheel)'); - - addButton(mxUtils.bind(this, function(evt) - { - this.actions.get('zoomIn').funct(); - mxEvent.consume(evt); - }), Editor.zoomInLargeImage, mxResources.get('zoomIn') + ' (Alt+Mousewheel)'); - - addButton(mxUtils.bind(this, function(evt) - { - if (graph.isLightboxView()) - { - if (graph.view.scale == 1) - { - this.lightboxFit(); - } - else - { - graph.zoomTo(1); - } - - this.chromelessResize(false); - } - else - { - this.chromelessResize(true); - } - - mxEvent.consume(evt); - }), Editor.actualSizeLargeImage, mxResources.get('fit')); - - // Changes toolbar opacity on hover - var fadeThread = null; - var fadeThread2 = null; - - var fadeOut = mxUtils.bind(this, function(delay) - { - if (fadeThread != null) - { - window.clearTimeout(fadeThread); - fadeThead = null; - } - - if (fadeThread2 != null) - { - window.clearTimeout(fadeThread2); - fadeThead2 = null; - } - - fadeThread = window.setTimeout(mxUtils.bind(this, function() - { - mxUtils.setOpacity(this.chromelessToolbar, 0); - fadeThread = null; - - fadeThread2 = window.setTimeout(mxUtils.bind(this, function() - { - this.chromelessToolbar.style.display = 'none'; - fadeThread2 = null; - }), 600); - }), delay || 200); - }); - - var fadeIn = mxUtils.bind(this, function(opacity) - { - if (fadeThread != null) - { - window.clearTimeout(fadeThread); - fadeThead = null; - } - - if (fadeThread2 != null) - { - window.clearTimeout(fadeThread2); - fadeThead2 = null; - } - - this.chromelessToolbar.style.display = ''; - mxUtils.setOpacity(this.chromelessToolbar, opacity || 30); - }); - - if (urlParams['layers'] == '1') - { - this.layersDialog = null; - - var layersButton = addButton(mxUtils.bind(this, function(evt) - { - if (this.layersDialog != null) - { - this.layersDialog.parentNode.removeChild(this.layersDialog); - this.layersDialog = null; - } - else - { - this.layersDialog = graph.createLayersDialog(); - - mxEvent.addListener(this.layersDialog, 'mouseleave', mxUtils.bind(this, function() - { - this.layersDialog.parentNode.removeChild(this.layersDialog); - this.layersDialog = null; - })); - - var r = layersButton.getBoundingClientRect(); - - mxUtils.setPrefixedStyle(this.layersDialog.style, 'borderRadius', '5px'); - this.layersDialog.style.position = 'fixed'; - this.layersDialog.style.fontFamily = 'Helvetica,Arial'; - this.layersDialog.style.backgroundColor = '#000000'; - this.layersDialog.style.width = '160px'; - this.layersDialog.style.padding = '4px 2px 4px 2px'; - this.layersDialog.style.color = '#ffffff'; - mxUtils.setOpacity(this.layersDialog, 70); - this.layersDialog.style.left = r.left + 'px'; - this.layersDialog.style.bottom = parseInt(this.chromelessToolbar.style.bottom) + - this.chromelessToolbar.offsetHeight + 4 + 'px'; - - // Puts the dialog on top of the container z-index - var style = mxUtils.getCurrentStyle(this.editor.graph.container); - this.layersDialog.style.zIndex = style.zIndex; - - document.body.appendChild(this.layersDialog); - } - - mxEvent.consume(evt); - }), Editor.layersLargeImage, mxResources.get('layers')); - - // Shows/hides layers button depending on content - var model = graph.getModel(); - - model.addListener(mxEvent.CHANGE, function() - { - layersButton.style.display = (model.getChildCount(model.root) > 1) ? '' : 'none'; - }); - } - - this.addChromelessToolbarItems(addButton); - - if (this.editor.editButtonLink != null || this.editor.editButtonFunc != null) - { - addButton(mxUtils.bind(this, function(evt) - { - if (this.editor.editButtonFunc != null) - { - this.editor.editButtonFunc(); - } - else if (this.editor.editButtonLink == '_blank') - { - this.editor.editAsNew(this.getEditBlankXml()); - } - else - { - graph.openLink(this.editor.editButtonLink, 'editWindow'); - } - - mxEvent.consume(evt); - }), Editor.editLargeImage, mxResources.get('edit')); - } - - if (graph.lightbox && (urlParams['close'] == '1' || this.container != document.body)) - { - addButton(mxUtils.bind(this, function(evt) - { - if (urlParams['close'] == '1') - { - window.close(); - } - else - { - this.destroy(); - mxEvent.consume(evt); - } - }), Editor.closeLargeImage, mxResources.get('close') + ' (Escape)'); - } - - // Initial state invisible - this.chromelessToolbar.style.display = 'none'; - mxUtils.setPrefixedStyle(this.chromelessToolbar.style, 'transform', 'translate(-50%,0)'); - graph.container.appendChild(this.chromelessToolbar); - - mxEvent.addListener(graph.container, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', mxUtils.bind(this, function(evt) - { - if (!mxEvent.isTouchEvent(evt)) - { - if (!mxEvent.isShiftDown(evt)) - { - fadeIn(30); - } - - fadeOut(); - } - })); - - mxEvent.addListener(this.chromelessToolbar, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', function(evt) - { - mxEvent.consume(evt); - }); - - mxEvent.addListener(this.chromelessToolbar, 'mouseenter', mxUtils.bind(this, function(evt) - { - if (!mxEvent.isShiftDown(evt)) - { - fadeIn(100); - } - else - { - fadeOut(); - } - })); - - mxEvent.addListener(this.chromelessToolbar, 'mousemove', mxUtils.bind(this, function(evt) - { - if (!mxEvent.isShiftDown(evt)) - { - fadeIn(100); - } - else - { - fadeOut(); - } - - mxEvent.consume(evt); - })); - - mxEvent.addListener(this.chromelessToolbar, 'mouseleave', mxUtils.bind(this, function(evt) - { - if (!mxEvent.isTouchEvent(evt)) - { - fadeIn(30); - } - })); - - // Shows/hides toolbar for touch devices - var tol = graph.getTolerance(); - - graph.addMouseListener( - { - startX: 0, - startY: 0, - scrollLeft: 0, - scrollTop: 0, - mouseDown: function(sender, me) - { - this.startX = me.getGraphX(); - this.startY = me.getGraphY(); - this.scrollLeft = graph.container.scrollLeft; - this.scrollTop = graph.container.scrollTop; - }, - mouseMove: function(sender, me) {}, - mouseUp: function(sender, me) - { - if (mxEvent.isTouchEvent(me.getEvent())) - { - if ((Math.abs(this.scrollLeft - graph.container.scrollLeft) < tol && - Math.abs(this.scrollTop - graph.container.scrollTop) < tol) && - (Math.abs(this.startX - me.getGraphX()) < tol && - Math.abs(this.startY - me.getGraphY()) < tol)) - { - if (parseFloat(ui.chromelessToolbar.style.opacity || 0) > 0) - { - fadeOut(); - } - else - { - fadeIn(30); - } - } - } - } - }); - } // end if toolbar - - // Installs handling of highlight and handling links to relative links and anchors - if (!this.editor.editable) - { - this.addChromelessClickHandler(); - } - } - else if (this.editor.extendCanvas) - { - /** - * Guesses autoTranslate to avoid another repaint (see below). - * Works if only the scale of the graph changes or if pages - * are visible and the visible pages do not change. - */ - var graphViewValidate = graph.view.validate; - graph.view.validate = function() - { - if (this.graph.container != null && mxUtils.hasScrollbars(this.graph.container)) - { - var pad = this.graph.getPagePadding(); - var size = this.graph.getPageSize(); - - // Updating scrollbars here causes flickering in quirks and is not needed - // if zoom method is always used to set the current scale on the graph. - var tx = this.translate.x; - var ty = this.translate.y; - this.translate.x = pad.x - (this.x0 || 0) * size.width; - this.translate.y = pad.y - (this.y0 || 0) * size.height; - } - - graphViewValidate.apply(this, arguments); - }; - - var graphSizeDidChange = graph.sizeDidChange; - graph.sizeDidChange = function() - { - if (this.container != null && mxUtils.hasScrollbars(this.container)) - { - var pages = this.getPageLayout(); - var pad = this.getPagePadding(); - var size = this.getPageSize(); - - // Updates the minimum graph size - var minw = Math.ceil(2 * pad.x + pages.width * size.width); - var minh = Math.ceil(2 * pad.y + pages.height * size.height); - - var min = graph.minimumGraphSize; - - // LATER: Fix flicker of scrollbar size in IE quirks mode - // after delayed call in window.resize event handler - if (min == null || min.width != minw || min.height != minh) - { - graph.minimumGraphSize = new mxRectangle(0, 0, minw, minh); - } - - // Updates auto-translate to include padding and graph size - var dx = pad.x - pages.x * size.width; - var dy = pad.y - pages.y * size.height; - - if (!this.autoTranslate && (this.view.translate.x != dx || this.view.translate.y != dy)) - { - this.autoTranslate = true; - this.view.x0 = pages.x; - this.view.y0 = pages.y; - - // NOTE: THIS INVOKES THIS METHOD AGAIN. UNFORTUNATELY THERE IS NO WAY AROUND THIS SINCE THE - // BOUNDS ARE KNOWN AFTER THE VALIDATION AND SETTING THE TRANSLATE TRIGGERS A REVALIDATION. - // SHOULD MOVE TRANSLATE/SCALE TO VIEW. - var tx = graph.view.translate.x; - var ty = graph.view.translate.y; - graph.view.setTranslate(dx, dy); - - // LATER: Fix rounding errors for small zoom - graph.container.scrollLeft += Math.round((dx - tx) * graph.view.scale); - graph.container.scrollTop += Math.round((dy - ty) * graph.view.scale); - - this.autoTranslate = false; - - return; - } - - graphSizeDidChange.apply(this, arguments); - } - }; - } - - // Accumulates the zoom factor while the rendering is taking place - // so that not the complete sequence of zoom steps must be painted - graph.updateZoomTimeout = null; - graph.cumulativeZoomFactor = 1; - - var cursorPosition = null; - - graph.lazyZoom = function(zoomIn) - { - if (this.updateZoomTimeout != null) - { - window.clearTimeout(this.updateZoomTimeout); - } - - // Switches to 1% zoom steps below 15% - // Lower bound depdends on rounding below - if (zoomIn) - { - if (this.view.scale * this.cumulativeZoomFactor < 0.15) - { - this.cumulativeZoomFactor = (this.view.scale + 0.01) / this.view.scale; - } - else - { - // Uses to 5% zoom steps for better grid rendering in webkit - // and to avoid rounding errors for zoom steps - this.cumulativeZoomFactor *= this.zoomFactor; - this.cumulativeZoomFactor = Math.round(this.view.scale * this.cumulativeZoomFactor * 20) / 20 / this.view.scale; - } - } - else - { - if (this.view.scale * this.cumulativeZoomFactor <= 0.15) - { - this.cumulativeZoomFactor = (this.view.scale - 0.01) / this.view.scale; - } - else - { - // Uses to 5% zoom steps for better grid rendering in webkit - // and to avoid rounding errors for zoom steps - this.cumulativeZoomFactor /= this.zoomFactor; - this.cumulativeZoomFactor = Math.round(this.view.scale * this.cumulativeZoomFactor * 20) / 20 / this.view.scale; - } - } - - this.cumulativeZoomFactor = Math.max(0.01, Math.min(this.view.scale * this.cumulativeZoomFactor, 160) / this.view.scale); - - this.updateZoomTimeout = window.setTimeout(mxUtils.bind(this, function() - { - var offset = mxUtils.getOffset(graph.container); - var dx = 0; - var dy = 0; - - if (cursorPosition != null) - { - dx = graph.container.offsetWidth / 2 - cursorPosition.x + offset.x; - dy = graph.container.offsetHeight / 2 - cursorPosition.y + offset.y; - } - - var prev = this.view.scale; - this.zoom(this.cumulativeZoomFactor); - var s = this.view.scale; - - if (s != prev) - { - if (resize != null) - { - ui.chromelessResize(false, null, dx * (this.cumulativeZoomFactor - 1), - dy * (this.cumulativeZoomFactor - 1)); - } - - if (mxUtils.hasScrollbars(graph.container) && (dx != 0 || dy != 0)) - { - graph.container.scrollLeft -= dx * (this.cumulativeZoomFactor - 1); - graph.container.scrollTop -= dy * (this.cumulativeZoomFactor - 1); - } - } - - this.cumulativeZoomFactor = 1; - this.updateZoomTimeout = null; - }), this.lazyZoomDelay); - }; - - mxEvent.addMouseWheelListener(mxUtils.bind(this, function(evt, up) - { - // Ctrl+wheel (or pinch on touchpad) is a native browser zoom event is OS X - // LATER: Add support for zoom via pinch on trackpad for Chrome in OS X - if ((this.dialogs == null || this.dialogs.length == 0) && graph.isZoomWheelEvent(evt)) - { - var source = mxEvent.getSource(evt); - - while (source != null) - { - if (source == graph.container) - { - cursorPosition = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt)); - graph.lazyZoom(up); - mxEvent.consume(evt); - - return; - } - - source = source.parentNode; - } - } - })); -}; - -/** - * Creates a temporary graph instance for rendering off-screen content. - */ -EditorUi.prototype.addChromelessToolbarItems = function(addButton) -{ - addButton(mxUtils.bind(this, function(evt) - { - this.actions.get('print').funct(); - mxEvent.consume(evt); - }), Editor.printLargeImage, mxResources.get('print')); -}; - -/** - * Creates a temporary graph instance for rendering off-screen content. - */ -EditorUi.prototype.createTemporaryGraph = function(stylesheet) -{ - var graph = new Graph(document.createElement('div'), null, null, stylesheet); - graph.resetViewOnRootChange = false; - graph.setConnectable(false); - graph.gridEnabled = false; - graph.autoScroll = false; - graph.setTooltips(false); - graph.setEnabled(false); - - // Container must be in the DOM for correct HTML rendering - graph.container.style.visibility = 'hidden'; - graph.container.style.position = 'absolute'; - graph.container.style.overflow = 'hidden'; - graph.container.style.height = '1px'; - graph.container.style.width = '1px'; - - return graph; -}; - -/** - * - */ -EditorUi.prototype.addChromelessClickHandler = function() -{ - var hl = urlParams['highlight']; - - // Adds leading # for highlight color code - if (hl != null && hl.length > 0) - { - hl = '#' + hl; - } - - this.editor.graph.addClickHandler(hl); -}; - -/** - * - */ -EditorUi.prototype.toggleFormatPanel = function(forceHide) -{ - this.formatWidth = (forceHide || this.formatWidth > 0) ? 0 : 240; - this.formatContainer.style.display = (forceHide || this.formatWidth > 0) ? '' : 'none'; - this.refresh(); - this.format.refresh(); - this.fireEvent(new mxEventObject('formatWidthChanged')); -}; - -/** - * Adds support for placeholders in labels. - */ -EditorUi.prototype.lightboxFit = function(maxHeight) -{ - if (this.isDiagramEmpty()) - { - this.editor.graph.view.setScale(1); - } - else - { - var p = urlParams['border']; - var border = 60; - - if (p != null) - { - border = parseInt(p); - } - - // LATER: Use initial graph bounds to avoid rounding errors - this.editor.graph.maxFitScale = this.lightboxMaxFitScale; - this.editor.graph.fit(border, null, null, null, null, null, maxHeight); - this.editor.graph.maxFitScale = null; - } -}; - -/** - * Translates this point by the given vector. - * - * @param {number} dx X-coordinate of the translation. - * @param {number} dy Y-coordinate of the translation. - */ -EditorUi.prototype.isDiagramEmpty = function() -{ - var model = this.editor.graph.getModel(); - - return model.getChildCount(model.root) == 1 && model.getChildCount(model.getChildAt(model.root, 0)) == 0; -}; - -/** - * Hook for allowing selection and context menu for certain events. - */ -EditorUi.prototype.isSelectionAllowed = function(evt) -{ - return mxEvent.getSource(evt).nodeName == 'SELECT' || (mxEvent.getSource(evt).nodeName == 'INPUT' && - mxUtils.isAncestorNode(this.formatContainer, mxEvent.getSource(evt))); -}; - -/** - * Installs dialog if browser window is closed without saving - * This must be disabled during save and image export. - */ -EditorUi.prototype.addBeforeUnloadListener = function() -{ - // Installs dialog if browser window is closed without saving - // This must be disabled during save and image export - window.onbeforeunload = mxUtils.bind(this, function() - { - if (!this.editor.isChromelessView()) - { - return this.onBeforeUnload(); - } - }); -}; - -/** - * Sets the onbeforeunload for the application - */ -EditorUi.prototype.onBeforeUnload = function() -{ - if (this.editor.modified) - { - return mxResources.get('allChangesLost'); - } -}; - -/** - * Opens the current diagram via the window.opener if one exists. - */ -EditorUi.prototype.open = function() -{ - // Cross-domain window access is not allowed in FF, so if we - // were opened from another domain then this will fail. - try - { - if (window.opener != null && window.opener.openFile != null) - { - window.opener.openFile.setConsumer(mxUtils.bind(this, function(xml, filename) - { - try - { - var doc = mxUtils.parseXml(xml); - this.editor.setGraphXml(doc.documentElement); - this.editor.setModified(false); - this.editor.undoManager.clear(); - - if (filename != null) - { - this.editor.setFilename(filename); - this.updateDocumentTitle(); - } - - return; - } - catch (e) - { - mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message); - } - })); - } - } - catch(e) - { - // ignore - } - - // Fires as the last step if no file was loaded - this.editor.graph.view.validate(); - - // Required only in special cases where an initial file is opened - // and the minimumGraphSize changes and CSS must be updated. - this.editor.graph.sizeDidChange(); - this.editor.fireEvent(new mxEventObject('resetGraphView')); -}; - -/** - * Sets the current menu and element. - */ -EditorUi.prototype.setCurrentMenu = function(menu, elt) -{ - this.currentMenuElt = elt; - this.currentMenu = menu; -}; - -/** - * Resets the current menu and element. - */ -EditorUi.prototype.resetCurrentMenu = function() -{ - this.currentMenuElt = null; - this.currentMenu = null; -}; - -/** - * Hides and destroys the current menu. - */ -EditorUi.prototype.hideCurrentMenu = function() -{ - if (this.currentMenu != null) - { - this.currentMenu.hideMenu(); - this.resetCurrentMenu(); - } -}; - -/** - * Updates the document title. - */ -EditorUi.prototype.updateDocumentTitle = function() -{ - var title = this.editor.getOrCreateFilename(); - - if (this.editor.appName != null) - { - title += ' - ' + this.editor.appName; - } - - document.title = title; -}; - -/** - * Updates the document title. - */ -EditorUi.prototype.createHoverIcons = function() -{ - return new HoverIcons(this.editor.graph); -}; - -/** - * Returns the URL for a copy of this editor with no state. - */ -EditorUi.prototype.redo = function() -{ - try - { - var graph = this.editor.graph; - - if (graph.isEditing()) - { - document.execCommand('redo', false, null); - } - else - { - this.editor.undoManager.redo(); - } - } - catch (e) - { - // ignore all errors - } -}; - -/** - * Returns the URL for a copy of this editor with no state. - */ -EditorUi.prototype.undo = function() -{ - try - { - var graph = this.editor.graph; - - if (graph.isEditing()) - { - // Stops editing and executes undo on graph if native undo - // does not affect current editing value - var value = graph.cellEditor.textarea.innerHTML; - document.execCommand('undo', false, null); - - if (value == graph.cellEditor.textarea.innerHTML) - { - graph.stopEditing(true); - this.editor.undoManager.undo(); - } - } - else - { - this.editor.undoManager.undo(); - } - } - catch (e) - { - // ignore all errors - } -}; - -/** - * Returns the URL for a copy of this editor with no state. - */ -EditorUi.prototype.canRedo = function() -{ - return this.editor.graph.isEditing() || this.editor.undoManager.canRedo(); -}; - -/** - * Returns the URL for a copy of this editor with no state. - */ -EditorUi.prototype.canUndo = function() -{ - return this.editor.graph.isEditing() || this.editor.undoManager.canUndo(); -}; - -/** - * - */ -EditorUi.prototype.getEditBlankXml = function() -{ - return mxUtils.getXml(this.editor.getGraphXml()); -}; - -/** - * Returns the URL for a copy of this editor with no state. - */ -EditorUi.prototype.getUrl = function(pathname) -{ - var href = (pathname != null) ? pathname : window.location.pathname; - var parms = (href.indexOf('?') > 0) ? 1 : 0; - - // Removes template URL parameter for new blank diagram - for (var key in urlParams) - { - if (parms == 0) - { - href += '?'; - } - else - { - href += '&'; - } - - href += key + '=' + urlParams[key]; - parms++; - } - - return href; -}; - -/** - * Specifies if the graph has scrollbars. - */ -EditorUi.prototype.setScrollbars = function(value) -{ - var graph = this.editor.graph; - var prev = graph.container.style.overflow; - graph.scrollbars = value; - this.editor.updateGraphComponents(); - - if (prev != graph.container.style.overflow) - { - if (graph.container.style.overflow == 'hidden') - { - var t = graph.view.translate; - graph.view.setTranslate(t.x - graph.container.scrollLeft / graph.view.scale, t.y - graph.container.scrollTop / graph.view.scale); - graph.container.scrollLeft = 0; - graph.container.scrollTop = 0; - graph.minimumGraphSize = null; - graph.sizeDidChange(); - } - else - { - var dx = graph.view.translate.x; - var dy = graph.view.translate.y; - - graph.view.translate.x = 0; - graph.view.translate.y = 0; - graph.sizeDidChange(); - graph.container.scrollLeft -= Math.round(dx * graph.view.scale); - graph.container.scrollTop -= Math.round(dy * graph.view.scale); - } - } - - this.fireEvent(new mxEventObject('scrollbarsChanged')); -}; - -/** - * Returns true if the graph has scrollbars. - */ -EditorUi.prototype.hasScrollbars = function() -{ - return this.editor.graph.scrollbars; -}; - -/** - * Resets the state of the scrollbars. - */ -EditorUi.prototype.resetScrollbars = function() -{ - var graph = this.editor.graph; - - if (!this.editor.extendCanvas) - { - graph.container.scrollTop = 0; - graph.container.scrollLeft = 0; - - if (!mxUtils.hasScrollbars(graph.container)) - { - graph.view.setTranslate(0, 0); - } - } - else if (!this.editor.isChromelessView()) - { - if (mxUtils.hasScrollbars(graph.container)) - { - if (graph.pageVisible) - { - var pad = graph.getPagePadding(); - graph.container.scrollTop = Math.floor(pad.y - this.editor.initialTopSpacing) - 1; - graph.container.scrollLeft = Math.floor(Math.min(pad.x, - (graph.container.scrollWidth - graph.container.clientWidth) / 2)) - 1; - - // Scrolls graph to visible area - var bounds = graph.getGraphBounds(); - - if (bounds.width > 0 && bounds.height > 0) - { - if (bounds.x > graph.container.scrollLeft + graph.container.clientWidth * 0.9) - { - graph.container.scrollLeft = Math.min(bounds.x + bounds.width - graph.container.clientWidth, bounds.x - 10); - } - - if (bounds.y > graph.container.scrollTop + graph.container.clientHeight * 0.9) - { - graph.container.scrollTop = Math.min(bounds.y + bounds.height - graph.container.clientHeight, bounds.y - 10); - } - } - } - else - { - var bounds = graph.getGraphBounds(); - var width = Math.max(bounds.width, graph.scrollTileSize.width * graph.view.scale); - var height = Math.max(bounds.height, graph.scrollTileSize.height * graph.view.scale); - graph.container.scrollTop = Math.floor(Math.max(0, bounds.y - Math.max(20, (graph.container.clientHeight - height) / 4))); - graph.container.scrollLeft = Math.floor(Math.max(0, bounds.x - Math.max(0, (graph.container.clientWidth - width) / 2))); - } - } - else - { - // This code is not actively used since the default for scrollbars is always true - if (graph.pageVisible) - { - var b = graph.view.getBackgroundPageBounds(); - graph.view.setTranslate(Math.floor(Math.max(0, (graph.container.clientWidth - b.width) / 2) - b.x), - Math.floor(Math.max(0, (graph.container.clientHeight - b.height) / 2) - b.y)); - } - else - { - var bounds = graph.getGraphBounds(); - graph.view.setTranslate(Math.floor(Math.max(0, Math.max(0, (graph.container.clientWidth - bounds.width) / 2) - bounds.x)), - Math.floor(Math.max(0, Math.max(20, (graph.container.clientHeight - bounds.height) / 4)) - bounds.y)); - } - } - } -}; - -/** - * Loads the stylesheet for this graph. - */ -EditorUi.prototype.setPageVisible = function(value) -{ - var graph = this.editor.graph; - var hasScrollbars = mxUtils.hasScrollbars(graph.container); - var tx = 0; - var ty = 0; - - if (hasScrollbars) - { - tx = graph.view.translate.x * graph.view.scale - graph.container.scrollLeft; - ty = graph.view.translate.y * graph.view.scale - graph.container.scrollTop; - } - - graph.pageVisible = value; - graph.pageBreaksVisible = value; - graph.preferPageSize = value; - graph.view.validateBackground(); - - // Workaround for possible handle offset - if (hasScrollbars) - { - var cells = graph.getSelectionCells(); - graph.clearSelection(); - graph.setSelectionCells(cells); - } - - // Calls updatePageBreaks - graph.sizeDidChange(); - - if (hasScrollbars) - { - graph.container.scrollLeft = graph.view.translate.x * graph.view.scale - tx; - graph.container.scrollTop = graph.view.translate.y * graph.view.scale - ty; - } - - this.fireEvent(new mxEventObject('pageViewChanged')); -}; - -/** - * Change types - */ -function ChangePageSetup(ui, color, image, format) -{ - this.ui = ui; - this.color = color; - this.previousColor = color; - this.image = image; - this.previousImage = image; - this.format = format; - this.previousFormat = format; - - // Needed since null are valid values for color and image - this.ignoreColor = false; - this.ignoreImage = false; -} - -/** - * Implementation of the undoable page rename. - */ -ChangePageSetup.prototype.execute = function() -{ - var graph = this.ui.editor.graph; - - if (!this.ignoreColor) - { - this.color = this.previousColor; - var tmp = graph.background; - this.ui.setBackgroundColor(this.previousColor); - this.previousColor = tmp; - } - - if (!this.ignoreImage) - { - this.image = this.previousImage; - var tmp = graph.backgroundImage; - this.ui.setBackgroundImage(this.previousImage); - this.previousImage = tmp; - } - - if (this.previousFormat != null) - { - this.format = this.previousFormat; - var tmp = graph.pageFormat; - - if (this.previousFormat.width != tmp.width || - this.previousFormat.height != tmp.height) - { - this.ui.setPageFormat(this.previousFormat); - this.previousFormat = tmp; - } - } - - if (this.foldingEnabled != null && this.foldingEnabled != this.ui.editor.graph.foldingEnabled) - { - this.ui.setFoldingEnabled(this.foldingEnabled); - this.foldingEnabled = !this.foldingEnabled; - } -}; - -// Registers codec for ChangePageSetup -(function() -{ - var codec = new mxObjectCodec(new ChangePageSetup(), ['ui', 'previousColor', 'previousImage', 'previousFormat']); - - codec.afterDecode = function(dec, node, obj) - { - obj.previousColor = obj.color; - obj.previousImage = obj.image; - obj.previousFormat = obj.format; - - if (obj.foldingEnabled != null) - { - obj.foldingEnabled = !obj.foldingEnabled; - } - - return obj; - }; - - mxCodecRegistry.register(codec); -})(); - -/** - * Loads the stylesheet for this graph. - */ -EditorUi.prototype.setBackgroundColor = function(value) -{ - this.editor.graph.background = value; - this.editor.graph.view.validateBackground(); - - this.fireEvent(new mxEventObject('backgroundColorChanged')); -}; - -/** - * Loads the stylesheet for this graph. - */ -EditorUi.prototype.setFoldingEnabled = function(value) -{ - this.editor.graph.foldingEnabled = value; - this.editor.graph.view.revalidate(); - - this.fireEvent(new mxEventObject('foldingEnabledChanged')); -}; - -/** - * Loads the stylesheet for this graph. - */ -EditorUi.prototype.setPageFormat = function(value) -{ - this.editor.graph.pageFormat = value; - - if (!this.editor.graph.pageVisible) - { - this.actions.get('pageView').funct(); - } - else - { - this.editor.graph.view.validateBackground(); - this.editor.graph.sizeDidChange(); - } - - this.fireEvent(new mxEventObject('pageFormatChanged')); -}; - -/** - * Loads the stylesheet for this graph. - */ -EditorUi.prototype.setPageScale = function(value) -{ - this.editor.graph.pageScale = value; - - if (!this.editor.graph.pageVisible) - { - this.actions.get('pageView').funct(); - } - else - { - this.editor.graph.view.validateBackground(); - this.editor.graph.sizeDidChange(); - } - - this.fireEvent(new mxEventObject('pageScaleChanged')); -}; - -/** - * Loads the stylesheet for this graph. - */ -EditorUi.prototype.setGridColor = function(value) -{ - this.editor.graph.view.gridColor = value; - this.editor.graph.view.validateBackground(); - this.fireEvent(new mxEventObject('gridColorChanged')); -}; - -/** - * Updates the states of the given undo/redo items. - */ -EditorUi.prototype.addUndoListener = function() -{ - var undo = this.actions.get('undo'); - var redo = this.actions.get('redo'); - - var undoMgr = this.editor.undoManager; - - var undoListener = mxUtils.bind(this, function() - { - undo.setEnabled(this.canUndo()); - redo.setEnabled(this.canRedo()); - }); - - undoMgr.addListener(mxEvent.ADD, undoListener); - undoMgr.addListener(mxEvent.UNDO, undoListener); - undoMgr.addListener(mxEvent.REDO, undoListener); - undoMgr.addListener(mxEvent.CLEAR, undoListener); - - // Overrides cell editor to update action states - var cellEditorStartEditing = this.editor.graph.cellEditor.startEditing; - - this.editor.graph.cellEditor.startEditing = function() - { - cellEditorStartEditing.apply(this, arguments); - undoListener(); - }; - - var cellEditorStopEditing = this.editor.graph.cellEditor.stopEditing; - - this.editor.graph.cellEditor.stopEditing = function(cell, trigger) - { - cellEditorStopEditing.apply(this, arguments); - undoListener(); - }; - - // Updates the button states once - undoListener(); -}; - -/** -* Updates the states of the given toolbar items based on the selection. -*/ -EditorUi.prototype.updateActionStates = function() -{ - var graph = this.editor.graph; - var selected = !graph.isSelectionEmpty(); - var vertexSelected = false; - var edgeSelected = false; - - var cells = graph.getSelectionCells(); - - if (cells != null) - { - for (var i = 0; i < cells.length; i++) - { - var cell = cells[i]; - - if (graph.getModel().isEdge(cell)) - { - edgeSelected = true; - } - - if (graph.getModel().isVertex(cell)) - { - vertexSelected = true; - } - - if (edgeSelected && vertexSelected) - { - break; - } - } - } - - // Updates action states - var actions = ['cut', 'copy', 'bold', 'italic', 'underline', 'delete', 'duplicate', - 'editStyle', 'editTooltip', 'editLink', 'backgroundColor', 'borderColor', - 'edit', 'toFront', 'toBack', 'lockUnlock', 'solid', 'dashed', 'pasteSize', - 'dotted', 'fillColor', 'gradientColor', 'shadow', 'fontColor', - 'formattedText', 'rounded', 'toggleRounded', 'sharp', 'strokeColor']; - - for (var i = 0; i < actions.length; i++) - { - this.actions.get(actions[i]).setEnabled(selected); - } - - this.actions.get('setAsDefaultStyle').setEnabled(graph.getSelectionCount() == 1); - this.actions.get('clearWaypoints').setEnabled(!graph.isSelectionEmpty()); - this.actions.get('copySize').setEnabled(graph.getSelectionCount() == 1); - this.actions.get('turn').setEnabled(!graph.isSelectionEmpty()); - this.actions.get('curved').setEnabled(edgeSelected); - this.actions.get('rotation').setEnabled(vertexSelected); - this.actions.get('wordWrap').setEnabled(vertexSelected); - this.actions.get('autosize').setEnabled(vertexSelected); - var oneVertexSelected = vertexSelected && graph.getSelectionCount() == 1; - this.actions.get('group').setEnabled(graph.getSelectionCount() > 1 || - (oneVertexSelected && !graph.isContainer(graph.getSelectionCell()))); - this.actions.get('ungroup').setEnabled(graph.getSelectionCount() == 1 && - (graph.getModel().getChildCount(graph.getSelectionCell()) > 0 || - (oneVertexSelected && graph.isContainer(graph.getSelectionCell())))); - this.actions.get('removeFromGroup').setEnabled(oneVertexSelected && - graph.getModel().isVertex(graph.getModel().getParent(graph.getSelectionCell()))); - - // Updates menu states - var state = graph.view.getState(graph.getSelectionCell()); - this.menus.get('navigation').setEnabled(selected || graph.view.currentRoot != null); - this.actions.get('collapsible').setEnabled(vertexSelected && - (graph.isContainer(graph.getSelectionCell()) || graph.model.getChildCount(graph.getSelectionCell()) > 0)); - this.actions.get('home').setEnabled(graph.view.currentRoot != null); - this.actions.get('exitGroup').setEnabled(graph.view.currentRoot != null); - this.actions.get('enterGroup').setEnabled(graph.getSelectionCount() == 1 && graph.isValidRoot(graph.getSelectionCell())); - var foldable = graph.getSelectionCount() == 1 && graph.isCellFoldable(graph.getSelectionCell()); - this.actions.get('expand').setEnabled(foldable); - this.actions.get('collapse').setEnabled(foldable); - this.actions.get('editLink').setEnabled(graph.getSelectionCount() == 1); - this.actions.get('openLink').setEnabled(graph.getSelectionCount() == 1 && - graph.getLinkForCell(graph.getSelectionCell()) != null); - this.actions.get('guides').setEnabled(graph.isEnabled()); - this.actions.get('grid').setEnabled(!this.editor.chromeless || this.editor.editable); - - var unlocked = graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent()); - this.menus.get('layout').setEnabled(unlocked); - this.menus.get('insert').setEnabled(unlocked); - this.menus.get('direction').setEnabled(unlocked && vertexSelected); - this.menus.get('align').setEnabled(unlocked && vertexSelected && graph.getSelectionCount() > 1); - this.menus.get('distribute').setEnabled(unlocked && vertexSelected && graph.getSelectionCount() > 1); - this.actions.get('selectVertices').setEnabled(unlocked); - this.actions.get('selectEdges').setEnabled(unlocked); - this.actions.get('selectAll').setEnabled(unlocked); - this.actions.get('selectNone').setEnabled(unlocked); - - this.updatePasteActionStates(); -}; - -/** - * Refreshes the viewport. - */ -EditorUi.prototype.refresh = function(sizeDidChange) -{ - sizeDidChange = (sizeDidChange != null) ? sizeDidChange : true; - - var quirks = mxClient.IS_IE && (document.documentMode == null || document.documentMode == 5); - var w = this.container.clientWidth; - var h = this.container.clientHeight; - - if (this.container == document.body) - { - w = document.body.clientWidth || document.documentElement.clientWidth; - h = (quirks) ? document.body.clientHeight || document.documentElement.clientHeight : document.documentElement.clientHeight; - } - - // Workaround for bug on iOS see - // http://stackoverflow.com/questions/19012135/ios-7-ipad-safari-landscape-innerheight-outerheight-layout-issue - // FIXME: Fix if footer visible - var off = 0; - - if (mxClient.IS_IOS && !window.navigator.standalone) - { - if (window.innerHeight != document.documentElement.clientHeight) - { - off = document.documentElement.clientHeight - window.innerHeight; - window.scrollTo(0, 0); - } - } - - var effHsplitPosition = Math.max(0, Math.min(this.hsplitPosition, w - this.splitSize - 20)); - - var tmp = 0; - - if (this.menubar != null) - { - this.menubarContainer.style.height = this.menubarHeight + 'px'; - tmp += this.menubarHeight; - } - - if (this.toolbar != null) - { - this.toolbarContainer.style.top = this.menubarHeight + 'px'; - this.toolbarContainer.style.height = this.toolbarHeight + 'px'; - tmp += this.toolbarHeight; - } - - if (tmp > 0 && !mxClient.IS_QUIRKS) - { - tmp += 1; - } - - var sidebarFooterHeight = 0; - - if (this.sidebarFooterContainer != null) - { - var bottom = this.footerHeight + off; - sidebarFooterHeight = Math.max(0, Math.min(h - tmp - bottom, this.sidebarFooterHeight)); - this.sidebarFooterContainer.style.width = effHsplitPosition + 'px'; - this.sidebarFooterContainer.style.height = sidebarFooterHeight + 'px'; - this.sidebarFooterContainer.style.bottom = bottom + 'px'; - } - - var fw = (this.format != null) ? this.formatWidth : 0; - this.sidebarContainer.style.top = tmp + 'px'; - this.sidebarContainer.style.width = effHsplitPosition + 'px'; - this.formatContainer.style.top = tmp + 'px'; - this.formatContainer.style.width = fw + 'px'; - this.formatContainer.style.display = (this.format != null) ? '' : 'none'; - - this.diagramContainer.style.left = (this.hsplit.parentNode != null) ? (effHsplitPosition + this.splitSize) + 'px' : '0px'; - this.diagramContainer.style.top = this.sidebarContainer.style.top; - this.footerContainer.style.height = this.footerHeight + 'px'; - this.hsplit.style.top = this.sidebarContainer.style.top; - this.hsplit.style.bottom = (this.footerHeight + off) + 'px'; - this.hsplit.style.left = effHsplitPosition + 'px'; - - if (this.tabContainer != null) - { - this.tabContainer.style.left = this.diagramContainer.style.left; - } - - if (quirks) - { - this.menubarContainer.style.width = w + 'px'; - this.toolbarContainer.style.width = this.menubarContainer.style.width; - var sidebarHeight = Math.max(0, h - this.footerHeight - this.menubarHeight - this.toolbarHeight); - this.sidebarContainer.style.height = (sidebarHeight - sidebarFooterHeight) + 'px'; - this.formatContainer.style.height = sidebarHeight + 'px'; - this.diagramContainer.style.width = (this.hsplit.parentNode != null) ? Math.max(0, w - effHsplitPosition - this.splitSize - fw) + 'px' : w + 'px'; - this.footerContainer.style.width = this.menubarContainer.style.width; - var diagramHeight = Math.max(0, h - this.footerHeight - this.menubarHeight - this.toolbarHeight); - - if (this.tabContainer != null) - { - this.tabContainer.style.width = this.diagramContainer.style.width; - this.tabContainer.style.bottom = (this.footerHeight + off) + 'px'; - diagramHeight -= this.tabContainer.clientHeight; - } - - this.diagramContainer.style.height = diagramHeight + 'px'; - this.hsplit.style.height = diagramHeight + 'px'; - } - else - { - if (this.footerHeight > 0) - { - this.footerContainer.style.bottom = off + 'px'; - } - - this.diagramContainer.style.right = fw + 'px'; - var th = 0; - - if (this.tabContainer != null) - { - this.tabContainer.style.bottom = (this.footerHeight + off) + 'px'; - this.tabContainer.style.right = this.diagramContainer.style.right; - th = this.tabContainer.clientHeight; - } - - this.sidebarContainer.style.bottom = (this.footerHeight + sidebarFooterHeight + off) + 'px'; - this.formatContainer.style.bottom = (this.footerHeight + off) + 'px'; - this.diagramContainer.style.bottom = (this.footerHeight + off + th) + 'px'; - } - - if (sizeDidChange) - { - this.editor.graph.sizeDidChange(); - } -}; - -/** - * Creates the required containers. - */ -EditorUi.prototype.createTabContainer = function() -{ - return null; -}; - -/** - * Creates the required containers. - */ -EditorUi.prototype.createDivs = function() -{ - this.menubarContainer = this.createDiv('geMenubarContainer'); - this.toolbarContainer = this.createDiv('geToolbarContainer'); - this.sidebarContainer = this.createDiv('geSidebarContainer'); - this.formatContainer = this.createDiv('geSidebarContainer geFormatContainer'); - this.diagramContainer = this.createDiv('geDiagramContainer'); - this.footerContainer = this.createDiv('geFooterContainer'); - this.hsplit = this.createDiv('geHsplit'); - this.hsplit.setAttribute('title', mxResources.get('collapseExpand')); - - // Sets static style for containers - this.menubarContainer.style.top = '0px'; - this.menubarContainer.style.left = '0px'; - this.menubarContainer.style.right = '0px'; - this.toolbarContainer.style.left = '0px'; - this.toolbarContainer.style.right = '0px'; - this.sidebarContainer.style.left = '0px'; - this.formatContainer.style.right = '0px'; - this.formatContainer.style.zIndex = '1'; - this.diagramContainer.style.right = ((this.format != null) ? this.formatWidth : 0) + 'px'; - this.footerContainer.style.left = '0px'; - this.footerContainer.style.right = '0px'; - this.footerContainer.style.bottom = '0px'; - this.footerContainer.style.zIndex = mxPopupMenu.prototype.zIndex - 2; - this.hsplit.style.width = this.splitSize + 'px'; - this.sidebarFooterContainer = this.createSidebarFooterContainer(); - - if (this.sidebarFooterContainer) - { - this.sidebarFooterContainer.style.left = '0px'; - } - - if (!this.editor.chromeless) - { - this.tabContainer = this.createTabContainer(); - } - else - { - this.diagramContainer.style.border = 'none'; - } -}; - -/** - * Hook for sidebar footer container. This implementation returns null. - */ -EditorUi.prototype.createSidebarFooterContainer = function() -{ - return null; -}; - -/** - * Creates the required containers. - */ -EditorUi.prototype.createUi = function() -{ - // Creates menubar - this.menubar = (this.editor.chromeless) ? null : this.menus.createMenubar(this.createDiv('geMenubar')); - - if (this.menubar != null) - { - this.menubarContainer.appendChild(this.menubar.container); - } - - // Adds status bar in menubar - if (this.menubar != null) - { - this.statusContainer = this.createStatusContainer(); - - // Connects the status bar to the editor status - this.editor.addListener('statusChanged', mxUtils.bind(this, function() - { - this.setStatusText(this.editor.getStatus()); - })); - - this.setStatusText(this.editor.getStatus()); - this.menubar.container.appendChild(this.statusContainer); - - // Inserts into DOM - this.container.appendChild(this.menubarContainer); - } - - // Creates the sidebar - this.sidebar = (this.editor.chromeless) ? null : this.createSidebar(this.sidebarContainer); - - if (this.sidebar != null) - { - this.container.appendChild(this.sidebarContainer); - } - - // Creates the format sidebar - this.format = (this.editor.chromeless || !this.formatEnabled) ? null : this.createFormat(this.formatContainer); - - if (this.format != null) - { - this.container.appendChild(this.formatContainer); - } - - // Creates the footer - var footer = (this.editor.chromeless) ? null : this.createFooter(); - - if (footer != null) - { - this.footerContainer.appendChild(footer); - this.container.appendChild(this.footerContainer); - } - - if (this.sidebar != null && this.sidebarFooterContainer) - { - this.container.appendChild(this.sidebarFooterContainer); - } - - this.container.appendChild(this.diagramContainer); - - if (this.container != null && this.tabContainer != null) - { - this.container.appendChild(this.tabContainer); - } - - // Creates toolbar - this.toolbar = (this.editor.chromeless) ? null : this.createToolbar(this.createDiv('geToolbar')); - - if (this.toolbar != null) - { - this.toolbarContainer.appendChild(this.toolbar.container); - this.container.appendChild(this.toolbarContainer); - } - - // HSplit - if (this.sidebar != null) - { - this.container.appendChild(this.hsplit); - - this.addSplitHandler(this.hsplit, true, 0, mxUtils.bind(this, function(value) - { - this.hsplitPosition = value; - this.refresh(); - })); - } -}; - -/** - * Creates a new toolbar for the given container. - */ -EditorUi.prototype.createStatusContainer = function() -{ - var container = document.createElement('a'); - container.className = 'geItem geStatus'; - - if (screen.width < 420) - { - container.style.maxWidth = Math.max(20, screen.width - 320) + 'px'; - container.style.overflow = 'hidden'; - } - - return container; -}; - -/** - * Creates a new toolbar for the given container. - */ -EditorUi.prototype.setStatusText = function(value) -{ - this.statusContainer.innerHTML = value; -}; - -/** - * Creates a new toolbar for the given container. - */ -EditorUi.prototype.createToolbar = function(container) -{ - return new Toolbar(this, container); -}; - -/** - * Creates a new sidebar for the given container. - */ -EditorUi.prototype.createSidebar = function(container) -{ - return new Sidebar(this, container); -}; - -/** - * Creates a new sidebar for the given container. - */ -EditorUi.prototype.createFormat = function(container) -{ - return new Format(this, container); -}; - -/** - * Creates and returns a new footer. - */ -EditorUi.prototype.createFooter = function() -{ - return this.createDiv('geFooter'); -}; - -/** - * Creates the actual toolbar for the toolbar container. - */ -EditorUi.prototype.createDiv = function(classname) -{ - var elt = document.createElement('div'); - elt.className = classname; - - return elt; -}; - -/** - * Updates the states of the given undo/redo items. - */ -EditorUi.prototype.addSplitHandler = function(elt, horizontal, dx, onChange) -{ - var start = null; - var initial = null; - var ignoreClick = true; - var last = null; - - // Disables built-in pan and zoom in IE10 and later - if (mxClient.IS_POINTER) - { - elt.style.touchAction = 'none'; - } - - var getValue = mxUtils.bind(this, function() - { - var result = parseInt(((horizontal) ? elt.style.left : elt.style.bottom)); - - // Takes into account hidden footer - if (!horizontal) - { - result = result + dx - this.footerHeight; - } - - return result; - }); - - function moveHandler(evt) - { - if (start != null) - { - var pt = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt)); - onChange(Math.max(0, initial + ((horizontal) ? (pt.x - start.x) : (start.y - pt.y)) - dx)); - mxEvent.consume(evt); - - if (initial != getValue()) - { - ignoreClick = true; - last = null; - } - } - }; - - function dropHandler(evt) - { - moveHandler(evt); - initial = null; - start = null; - }; - - mxEvent.addGestureListeners(elt, function(evt) - { - start = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt)); - initial = getValue(); - ignoreClick = false; - mxEvent.consume(evt); - }); - - mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt) - { - if (!ignoreClick && this.hsplitClickEnabled) - { - var next = (last != null) ? last - dx : 0; - last = getValue(); - onChange(next); - mxEvent.consume(evt); - } - })); - - mxEvent.addGestureListeners(document, null, moveHandler, dropHandler); - - this.destroyFunctions.push(function() - { - mxEvent.removeGestureListeners(document, null, moveHandler, dropHandler); - }); -}; - -/** - * Displays a print dialog. - */ -EditorUi.prototype.showDialog = function(elt, w, h, modal, closable, onClose, noScroll) -{ - this.editor.graph.tooltipHandler.hideTooltip(); - - if (this.dialogs == null) - { - this.dialogs = []; - } - - this.dialog = new Dialog(this, elt, w, h, modal, closable, onClose, noScroll); - this.dialogs.push(this.dialog); -}; - -/** - * Displays a print dialog. - */ -EditorUi.prototype.hideDialog = function(cancel) -{ - if (this.dialogs != null && this.dialogs.length > 0) - { - var dlg = this.dialogs.pop(); - dlg.close(cancel); - - this.dialog = (this.dialogs.length > 0) ? this.dialogs[this.dialogs.length - 1] : null; - - if (this.dialog == null && this.editor.graph.container.style.visibility != 'hidden') - { - this.editor.graph.container.focus(); - } - - mxUtils.clearSelection(); - this.editor.fireEvent(new mxEventObject('hideDialog')); - } -}; - -/** - * Display a color dialog. - */ -EditorUi.prototype.pickColor = function(color, apply) -{ - var graph = this.editor.graph; - var selState = graph.cellEditor.saveSelection(); - - var dlg = new ColorDialog(this, color || 'none', function(color) - { - graph.cellEditor.restoreSelection(selState); - apply(color); - }, function() - { - graph.cellEditor.restoreSelection(selState); - }); - this.showDialog(dlg.container, 230, 430, true, false); - dlg.init(); -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -EditorUi.prototype.openFile = function() -{ - // Closes dialog after open - window.openFile = new OpenFile(mxUtils.bind(this, function(cancel) - { - this.hideDialog(cancel); - })); - - // Removes openFile if dialog is closed - this.showDialog(new OpenDialog(this).container, (Editor.useLocalStorage) ? 640 : 320, - (Editor.useLocalStorage) ? 480 : 220, true, true, function() - { - window.openFile = null; - }); -}; - -/** - * Extracs the graph model from the given HTML data from a data transfer event. - */ -EditorUi.prototype.extractGraphModelFromHtml = function(data) -{ - var result = null; - - try - { - var idx = data.indexOf('<mxGraphModel '); - - if (idx >= 0) - { - var idx2 = data.lastIndexOf('</mxGraphModel>'); - - if (idx2 > idx) - { - result = data.substring(idx, idx2 + 21).replace(/>/g, '>'). - replace(/</g, '<').replace(/\\"/g, '"').replace(/\n/g, ''); - } - } - } - catch (e) - { - // ignore - } - - return result; -}; - -/** - * Opens the given files in the editor. - */ -EditorUi.prototype.extractGraphModelFromEvent = function(evt) -{ - var result = null; - var data = null; - - if (evt != null) - { - var provider = (evt.dataTransfer != null) ? evt.dataTransfer : evt.clipboardData; - - if (provider != null) - { - if (document.documentMode == 10 || document.documentMode == 11) - { - data = provider.getData('Text'); - } - else - { - data = (mxUtils.indexOf(provider.types, 'text/html') >= 0) ? provider.getData('text/html') : null; - - if (mxUtils.indexOf(provider.types, 'text/plain' && (data == null || data.length == 0))) - { - data = provider.getData('text/plain'); - } - } - - if (data != null) - { - data = this.editor.graph.zapGremlins(mxUtils.trim(data)); - - // Tries parsing as HTML document with embedded XML - var xml = this.extractGraphModelFromHtml(data); - - if (xml != null) - { - data = xml; - } - } - } - } - - if (data != null && this.isCompatibleString(data)) - { - result = data; - } - - return result; -}; - -/** - * Hook for subclassers to return true if event data is a supported format. - * This implementation always returns false. - */ -EditorUi.prototype.isCompatibleString = function(data) -{ - return false; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -EditorUi.prototype.saveFile = function(forceDialog) -{ - if (!forceDialog && this.editor.filename != null) - { - this.save(this.editor.getOrCreateFilename()); - } - else - { - var dlg = new FilenameDialog(this, this.editor.getOrCreateFilename(), mxResources.get('save'), mxUtils.bind(this, function(name) - { - this.save(name); - }), null, mxUtils.bind(this, function(name) - { - if (name != null && name.length > 0) - { - return true; - } - - mxUtils.confirm(mxResources.get('invalidName')); - - return false; - })); - this.showDialog(dlg.container, 300, 100, true, true); - dlg.init(); - } -}; - -/** - * Saves the current graph under the given filename. - */ -EditorUi.prototype.save = function(name) -{ - if (name != null) - { - if (this.editor.graph.isEditing()) - { - this.editor.graph.stopEditing(); - } - - var xml = mxUtils.getXml(this.editor.getGraphXml()); - - try - { - if (Editor.useLocalStorage) - { - if (localStorage.getItem(name) != null && - !mxUtils.confirm(mxResources.get('replaceIt', [name]))) - { - return; - } - - localStorage.setItem(name, xml); - this.editor.setStatus(mxUtils.htmlEntities(mxResources.get('saved')) + ' ' + new Date()); - } - else - { - if (xml.length < MAX_REQUEST_SIZE) - { - new mxXmlRequest(SAVE_URL, 'filename=' + encodeURIComponent(name) + - '&xml=' + encodeURIComponent(xml)).simulate(document, '_blank'); - } - else - { - mxUtils.alert(mxResources.get('drawingTooLarge')); - mxUtils.popup(xml); - - return; - } - } - - this.editor.setModified(false); - this.editor.setFilename(name); - this.updateDocumentTitle(); - } - catch (e) - { - this.editor.setStatus(mxUtils.htmlEntities(mxResources.get('errorSavingFile'))); - } - } -}; - -/** - * Executes the given layout. - */ -EditorUi.prototype.executeLayout = function(exec, animate, post) -{ - var graph = this.editor.graph; - - if (graph.isEnabled()) - { - graph.getModel().beginUpdate(); - try - { - exec(); - } - catch (e) - { - throw e; - } - finally - { - // Animates the changes in the graph model except - // for Camino, where animation is too slow - if (this.allowAnimation && animate && navigator.userAgent.indexOf('Camino') < 0) - { - // New API for animating graph layout results asynchronously - var morph = new mxMorphing(graph); - morph.addListener(mxEvent.DONE, mxUtils.bind(this, function() - { - graph.getModel().endUpdate(); - - if (post != null) - { - post(); - } - })); - - morph.startAnimation(); - } - else - { - graph.getModel().endUpdate(); - - if (post != null) - { - post(); - } - } - } - } -}; - -/** - * Hides the current menu. - */ -EditorUi.prototype.showImageDialog = function(title, value, fn, ignoreExisting) -{ - var cellEditor = this.editor.graph.cellEditor; - var selState = cellEditor.saveSelection(); - var newValue = mxUtils.prompt(title, value); - cellEditor.restoreSelection(selState); - - if (newValue != null && newValue.length > 0) - { - var img = new Image(); - - img.onload = function() - { - fn(newValue, img.width, img.height); - }; - img.onerror = function() - { - fn(null); - mxUtils.alert(mxResources.get('fileNotFound')); - }; - - img.src = newValue; - } - else - { - fn(null); - } -}; - -/** - * Hides the current menu. - */ -EditorUi.prototype.showLinkDialog = function(value, btnLabel, fn) -{ - var dlg = new LinkDialog(this, value, btnLabel, fn); - this.showDialog(dlg.container, 420, 90, true, true); - dlg.init(); -}; - -/** - * Hides the current menu. - */ -EditorUi.prototype.showDataDialog = function(cell) -{ - if (cell != null) - { - var dlg = new EditDataDialog(this, cell); - this.showDialog(dlg.container, 340, 340, true, false, null, false); - dlg.init(); - } -}; - -/** - * Hides the current menu. - */ -EditorUi.prototype.showBackgroundImageDialog = function(apply) -{ - apply = (apply != null) ? apply : mxUtils.bind(this, function(image) - { - var change = new ChangePageSetup(this, null, image); - change.ignoreColor = true; - - this.editor.graph.model.execute(change); - }); - - var newValue = mxUtils.prompt(mxResources.get('backgroundImage'), ''); - - if (newValue != null && newValue.length > 0) - { - var img = new Image(); - - img.onload = function() - { - apply(new mxImage(newValue, img.width, img.height)); - }; - img.onerror = function() - { - apply(null); - mxUtils.alert(mxResources.get('fileNotFound')); - }; - - img.src = newValue; - } - else - { - apply(null); - } -}; - -/** - * Loads the stylesheet for this graph. - */ -EditorUi.prototype.setBackgroundImage = function(image) -{ - this.editor.graph.setBackgroundImage(image); - this.editor.graph.view.validateBackgroundImage(); - - this.fireEvent(new mxEventObject('backgroundImageChanged')); -}; - -/** - * Creates the keyboard event handler for the current graph and history. - */ -EditorUi.prototype.confirm = function(msg, okFn, cancelFn) -{ - if (mxUtils.confirm(msg)) - { - if (okFn != null) - { - okFn(); - } - } - else if (cancelFn != null) - { - cancelFn(); - } -}; - -/** - * Creates the keyboard event handler for the current graph and history. - */ -EditorUi.prototype.createOutline = function(wnd) -{ - var outline = new mxOutline(this.editor.graph); - outline.border = 20; - - mxEvent.addListener(window, 'resize', function() - { - outline.update(); - }); - - this.addListener('pageFormatChanged', function() - { - outline.update(); - }); - - return outline; -}; - -/** - * Creates the keyboard event handler for the current graph and history. - */ -EditorUi.prototype.createKeyHandler = function(editor) -{ - var editorUi = this; - var graph = this.editor.graph; - var keyHandler = new mxKeyHandler(graph); - - var isEventIgnored = keyHandler.isEventIgnored; - keyHandler.isEventIgnored = function(evt) - { - // Handles undo/redo/ctrl+./,/u via action and allows ctrl+b/i only if editing value is HTML (except for FF and Safari) - return (!this.isControlDown(evt) || mxEvent.isShiftDown(evt) || (evt.keyCode != 90 && evt.keyCode != 89 && - evt.keyCode != 188 && evt.keyCode != 190 && evt.keyCode != 85)) && ((evt.keyCode != 66 && evt.keyCode != 73) || - !this.isControlDown(evt) || (this.graph.cellEditor.isContentEditing() && !mxClient.IS_FF && !mxClient.IS_SF)) && - isEventIgnored.apply(this, arguments); - }; - - // Ignores graph enabled state but not chromeless state - keyHandler.isEnabledForEvent = function(evt) - { - return (!mxEvent.isConsumed(evt) && this.isGraphEvent(evt) && this.isEnabled() && - (editorUi.dialogs == null || editorUi.dialogs.length == 0)); - }; - - // Routes command-key to control-key on Mac - keyHandler.isControlDown = function(evt) - { - return mxEvent.isControlDown(evt) || (mxClient.IS_MAC && evt.metaKey); - }; - - var queue = []; - var thread = null; - - // Helper function to move cells with the cursor keys - function nudge(keyCode, stepSize, resize) - { - queue.push(function() - { - if (!graph.isSelectionEmpty() && graph.isEnabled()) - { - stepSize = (stepSize != null) ? stepSize : 1; - - if (resize) - { - // Resizes all selected vertices - graph.getModel().beginUpdate(); - try - { - var cells = graph.getSelectionCells(); - - for (var i = 0; i < cells.length; i++) - { - if (graph.getModel().isVertex(cells[i]) && graph.isCellResizable(cells[i])) - { - var geo = graph.getCellGeometry(cells[i]); - - if (geo != null) - { - geo = geo.clone(); - - if (keyCode == 37) - { - geo.width = Math.max(0, geo.width - stepSize); - } - else if (keyCode == 38) - { - geo.height = Math.max(0, geo.height - stepSize); - } - else if (keyCode == 39) - { - geo.width += stepSize; - } - else if (keyCode == 40) - { - geo.height += stepSize; - } - - graph.getModel().setGeometry(cells[i], geo); - } - } - } - } - finally - { - graph.getModel().endUpdate(); - } - } - else - { - // Moves vertices up/down in a stack layout - var cell = graph.getSelectionCell(); - var parent = graph.model.getParent(cell); - var layout = null; - - if (graph.getSelectionCount() == 1 && graph.model.isVertex(cell) && - graph.layoutManager != null && !graph.isCellLocked(cell)) - { - layout = graph.layoutManager.getLayout(parent); - } - - if (layout != null && layout.constructor == mxStackLayout) - { - var index = parent.getIndex(cell); - - if (keyCode == 37 || keyCode == 38) - { - graph.model.add(parent, cell, Math.max(0, index - 1)); - } - else if (keyCode == 39 ||keyCode == 40) - { - graph.model.add(parent, cell, Math.min(graph.model.getChildCount(parent), index + 1)); - } - } - else - { - var dx = 0; - var dy = 0; - - if (keyCode == 37) - { - dx = -stepSize; - } - else if (keyCode == 38) - { - dy = -stepSize; - } - else if (keyCode == 39) - { - dx = stepSize; - } - else if (keyCode == 40) - { - dy = stepSize; - } - - graph.moveCells(graph.getMovableCells(graph.getSelectionCells()), dx, dy); - } - } - } - }); - - if (thread != null) - { - window.clearTimeout(thread); - } - - thread = window.setTimeout(function() - { - if (queue.length > 0) - { - graph.getModel().beginUpdate(); - try - { - for (var i = 0; i < queue.length; i++) - { - queue[i](); - } - - queue = []; - } - finally - { - graph.getModel().endUpdate(); - } - graph.scrollCellToVisible(graph.getSelectionCell()); - } - }, 200); - }; - - // Overridden to handle special alt+shift+cursor keyboard shortcuts - var directions = {37: mxConstants.DIRECTION_WEST, 38: mxConstants.DIRECTION_NORTH, - 39: mxConstants.DIRECTION_EAST, 40: mxConstants.DIRECTION_SOUTH}; - - var keyHandlerGetFunction = keyHandler.getFunction; - - // Alt+Shift+Keycode mapping to action - var altShiftActions = {67: this.actions.get('clearWaypoints'), // Alt+Shift+C - 65: this.actions.get('connectionArrows'), // Alt+Shift+A - 76: this.actions.get('editLink'), // Alt+Shift+L - 80: this.actions.get('connectionPoints'), // Alt+Shift+P - 84: this.actions.get('editTooltip'), // Alt+Shift+T - 86: this.actions.get('pasteSize'), // Alt+Shift+V - 88: this.actions.get('copySize') // Alt+Shift+X - }; - - mxKeyHandler.prototype.getFunction = function(evt) - { - if (graph.isEnabled()) - { - // TODO: Add alt modified state in core API, here are some specific cases - if (mxEvent.isShiftDown(evt) && mxEvent.isAltDown(evt)) - { - var action = altShiftActions[evt.keyCode]; - - if (action != null) - { - return action.funct; - } - } - - if (evt.keyCode == 9 && mxEvent.isAltDown(evt)) - { - if (mxEvent.isShiftDown(evt)) - { - // Alt+Shift+Tab - return function() - { - graph.selectParentCell(); - }; - } - else - { - // Alt+Tab - return function() - { - graph.selectChildCell(); - }; - } - } - else if (directions[evt.keyCode] != null && !graph.isSelectionEmpty()) - { - if (mxEvent.isShiftDown(evt) && mxEvent.isAltDown(evt)) - { - if (graph.model.isVertex(graph.getSelectionCell())) - { - return function() - { - var cells = graph.connectVertex(graph.getSelectionCell(), directions[evt.keyCode], - graph.defaultEdgeLength, evt, true); - - if (cells != null && cells.length > 0) - { - if (cells.length == 1 && graph.model.isEdge(cells[0])) - { - graph.setSelectionCell(graph.model.getTerminal(cells[0], false)); - } - else - { - graph.setSelectionCell(cells[cells.length - 1]); - } - - graph.scrollCellToVisible(graph.getSelectionCell()); - - if (editorUi.hoverIcons != null) - { - editorUi.hoverIcons.update(graph.view.getState(graph.getSelectionCell())); - } - } - }; - } - } - else - { - // Avoids consuming event if no vertex is selected by returning null below - // Cursor keys move and resize (ctrl) cells - if (this.isControlDown(evt)) - { - return function() - { - nudge(evt.keyCode, (mxEvent.isShiftDown(evt)) ? graph.gridSize : null, true); - }; - } - else - { - return function() - { - nudge(evt.keyCode, (mxEvent.isShiftDown(evt)) ? graph.gridSize : null); - }; - } - } - } - } - - return keyHandlerGetFunction.apply(this, arguments); - }; - - // Binds keystrokes to actions - keyHandler.bindAction = mxUtils.bind(this, function(code, control, key, shift) - { - var action = this.actions.get(key); - - if (action != null) - { - var f = function() - { - if (action.isEnabled()) - { - action.funct(); - } - }; - - if (control) - { - if (shift) - { - keyHandler.bindControlShiftKey(code, f); - } - else - { - keyHandler.bindControlKey(code, f); - } - } - else - { - if (shift) - { - keyHandler.bindShiftKey(code, f); - } - else - { - keyHandler.bindKey(code, f); - } - } - } - }); - - var ui = this; - var keyHandlerEscape = keyHandler.escape; - keyHandler.escape = function(evt) - { - keyHandlerEscape.apply(this, arguments); - }; - - // Ignores enter keystroke. Remove this line if you want the - // enter keystroke to stop editing. N, W, T are reserved. - keyHandler.enter = function() {}; - - keyHandler.bindControlShiftKey(36, function() { graph.exitGroup(); }); // Ctrl+Shift+Home - keyHandler.bindControlShiftKey(35, function() { graph.enterGroup(); }); // Ctrl+Shift+End - keyHandler.bindKey(36, function() { graph.home(); }); // Home - keyHandler.bindKey(35, function() { graph.refresh(); }); // End - keyHandler.bindAction(107, true, 'zoomIn'); // Ctrl+Plus - keyHandler.bindAction(109, true, 'zoomOut'); // Ctrl+Minus - keyHandler.bindAction(80, true, 'print'); // Ctrl+P - keyHandler.bindAction(79, true, 'outline', true); // Ctrl+Shift+O - keyHandler.bindAction(112, false, 'about'); // F1 - - if (!this.editor.chromeless || this.editor.editable) - { - keyHandler.bindControlKey(36, function() { if (graph.isEnabled()) { graph.foldCells(true); }}); // Ctrl+Home - keyHandler.bindControlKey(35, function() { if (graph.isEnabled()) { graph.foldCells(false); }}); // Ctrl+End - keyHandler.bindControlKey(13, function() { if (graph.isEnabled()) { graph.setSelectionCells(graph.duplicateCells(graph.getSelectionCells(), false)); }}); // Ctrl+Enter - keyHandler.bindAction(8, false, 'delete'); // Backspace - keyHandler.bindAction(8, true, 'deleteAll'); // Backspace - keyHandler.bindAction(46, false, 'delete'); // Delete - keyHandler.bindAction(46, true, 'deleteAll'); // Ctrl+Delete - keyHandler.bindAction(72, true, 'resetView'); // Ctrl+H - keyHandler.bindAction(72, true, 'fitWindow', true); // Ctrl+Shift+H - keyHandler.bindAction(74, true, 'fitPage'); // Ctrl+J - keyHandler.bindAction(74, true, 'fitTwoPages', true); // Ctrl+Shift+J - keyHandler.bindAction(48, true, 'customZoom'); // Ctrl+0 - keyHandler.bindAction(82, true, 'turn'); // Ctrl+R - keyHandler.bindAction(82, true, 'clearDefaultStyle', true); // Ctrl+Shift+R - keyHandler.bindAction(83, true, 'save'); // Ctrl+S - keyHandler.bindAction(83, true, 'saveAs', true); // Ctrl+Shift+S - keyHandler.bindAction(65, true, 'selectAll'); // Ctrl+A - keyHandler.bindAction(65, true, 'selectNone', true); // Ctrl+A - keyHandler.bindAction(73, true, 'selectVertices', true); // Ctrl+Shift+I - keyHandler.bindAction(69, true, 'selectEdges', true); // Ctrl+Shift+E - keyHandler.bindAction(69, true, 'editStyle'); // Ctrl+E - keyHandler.bindAction(66, true, 'bold'); // Ctrl+B - keyHandler.bindAction(66, true, 'toBack', true); // Ctrl+Shift+B - keyHandler.bindAction(70, true, 'toFront', true); // Ctrl+Shift+F - keyHandler.bindAction(68, true, 'duplicate'); // Ctrl+D - keyHandler.bindAction(68, true, 'setAsDefaultStyle', true); // Ctrl+Shift+D - keyHandler.bindAction(90, true, 'undo'); // Ctrl+Z - keyHandler.bindAction(89, true, 'autosize', true); // Ctrl+Shift+Y - keyHandler.bindAction(88, true, 'cut'); // Ctrl+X - keyHandler.bindAction(67, true, 'copy'); // Ctrl+C - keyHandler.bindAction(86, true, 'paste'); // Ctrl+V - keyHandler.bindAction(71, true, 'group'); // Ctrl+G - keyHandler.bindAction(77, true, 'editData'); // Ctrl+M - keyHandler.bindAction(71, true, 'grid', true); // Ctrl+Shift+G - keyHandler.bindAction(73, true, 'italic'); // Ctrl+I - keyHandler.bindAction(76, true, 'lockUnlock'); // Ctrl+L - keyHandler.bindAction(76, true, 'layers', true); // Ctrl+Shift+L - keyHandler.bindAction(80, true, 'formatPanel', true); // Ctrl+Shift+P - keyHandler.bindAction(85, true, 'underline'); // Ctrl+U - keyHandler.bindAction(85, true, 'ungroup', true); // Ctrl+Shift+U - keyHandler.bindAction(190, true, 'superscript'); // Ctrl+. - keyHandler.bindAction(188, true, 'subscript'); // Ctrl+, - keyHandler.bindKey(13, function() { if (graph.isEnabled()) { graph.startEditingAtCell(); }}); // Enter - keyHandler.bindKey(113, function() { if (graph.isEnabled()) { graph.startEditingAtCell(); }}); // F2 - } - - if (!mxClient.IS_WIN) - { - keyHandler.bindAction(90, true, 'redo', true); // Ctrl+Shift+Z - } - else - { - keyHandler.bindAction(89, true, 'redo'); // Ctrl+Y - } - - return keyHandler; -}; - -/** - * Creates the keyboard event handler for the current graph and history. - */ -EditorUi.prototype.destroy = function() -{ - if (this.editor != null) - { - this.editor.destroy(); - this.editor = null; - } - - if (this.menubar != null) - { - this.menubar.destroy(); - this.menubar = null; - } - - if (this.toolbar != null) - { - this.toolbar.destroy(); - this.toolbar = null; - } - - if (this.sidebar != null) - { - this.sidebar.destroy(); - this.sidebar = null; - } - - if (this.keyHandler != null) - { - this.keyHandler.destroy(); - this.keyHandler = null; - } - - if (this.keydownHandler != null) - { - mxEvent.removeListener(document, 'keydown', this.keydownHandler); - this.keydownHandler = null; - } - - if (this.keyupHandler != null) - { - mxEvent.removeListener(document, 'keyup', this.keyupHandler); - this.keyupHandler = null; - } - - if (this.resizeHandler != null) - { - mxEvent.removeListener(window, 'resize', this.resizeHandler); - this.resizeHandler = null; - } - - if (this.gestureHandler != null) - { - mxEvent.removeGestureListeners(document, this.gestureHandler); - this.gestureHandler = null; - } - - if (this.orientationChangeHandler != null) - { - mxEvent.removeListener(window, 'orientationchange', this.orientationChangeHandler); - this.orientationChangeHandler = null; - } - - if (this.scrollHandler != null) - { - mxEvent.removeListener(window, 'scroll', this.scrollHandler); - this.scrollHandler = null; - } - - if (this.destroyFunctions != null) - { - for (var i = 0; i < this.destroyFunctions.length; i++) - { - this.destroyFunctions[i](); - } - - this.destroyFunctions = null; - } - - var c = [this.menubarContainer, this.toolbarContainer, this.sidebarContainer, - this.formatContainer, this.diagramContainer, this.footerContainer, - this.chromelessToolbar, this.hsplit, this.sidebarFooterContainer, - this.layersDialog]; - - for (var i = 0; i < c.length; i++) - { - if (c[i] != null && c[i].parentNode != null) - { - c[i].parentNode.removeChild(c[i]); - } - } -}; diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Format.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Format.js deleted file mode 100644 index a0d2c6fb..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Format.js +++ /dev/null @@ -1,5496 +0,0 @@ -/** - * Copyright (c) 2006-2012, JGraph Ltd - */ -Format = function(editorUi, container) -{ - this.editorUi = editorUi; - this.container = container; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.labelIndex = 0; - -/** - * Returns information about the current selection. - */ -Format.prototype.currentIndex = 0; - -/** - * Returns information about the current selection. - */ -Format.prototype.showCloseButton = true; - -/** - * Background color for inactive tabs. - */ -Format.prototype.inactiveTabBackgroundColor = '#d7d7d7'; - -/** - * Background color for inactive tabs. - */ -Format.prototype.roundableShapes = ['label', 'rectangle', 'internalStorage', 'corner', - 'parallelogram', 'swimlane', 'triangle', 'trapezoid', - 'ext', 'step', 'tee', 'process', 'link', - 'rhombus', 'offPageConnector', 'loopLimit', 'hexagon', - 'manualInput', 'curlyBracket', 'singleArrow', 'callout', - 'doubleArrow', 'flexArrow', 'card', 'umlLifeline']; - -/** - * Adds the label menu items to the given menu and parent. - */ -Format.prototype.init = function() -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - this.update = mxUtils.bind(this, function(sender, evt) - { - this.clearSelectionState(); - this.refresh(); - }); - - graph.getSelectionModel().addListener(mxEvent.CHANGE, this.update); - graph.addListener(mxEvent.EDITING_STARTED, this.update); - graph.addListener(mxEvent.EDITING_STOPPED, this.update); - graph.getModel().addListener(mxEvent.CHANGE, this.update); - graph.addListener(mxEvent.ROOT, mxUtils.bind(this, function() - { - this.refresh(); - })); - - editor.addListener('autosaveChanged', mxUtils.bind(this, function() - { - this.refresh(); - })); - - this.refresh(); -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.clearSelectionState = function() -{ - this.selectionState = null; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.getSelectionState = function() -{ - if (this.selectionState == null) - { - this.selectionState = this.createSelectionState(); - } - - return this.selectionState; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.createSelectionState = function() -{ - var cells = this.editorUi.editor.graph.getSelectionCells(); - var result = this.initSelectionState(); - - for (var i = 0; i < cells.length; i++) - { - this.updateSelectionStateForCell(result, cells[i], cells); - } - - return result; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.initSelectionState = function() -{ - return {vertices: [], edges: [], x: null, y: null, width: null, height: null, style: {}, - containsImage: false, containsLabel: false, fill: true, glass: true, rounded: true, - comic: true, autoSize: false, image: true, shadow: true, lineJumps: true}; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.updateSelectionStateForCell = function(result, cell, cells) -{ - var graph = this.editorUi.editor.graph; - - if (graph.getModel().isVertex(cell)) - { - result.vertices.push(cell); - var geo = graph.getCellGeometry(cell); - - if (geo != null) - { - if (geo.width > 0) - { - if (result.width == null) - { - result.width = geo.width; - } - else if (result.width != geo.width) - { - result.width = ''; - } - } - else - { - result.containsLabel = true; - } - - if (geo.height > 0) - { - if (result.height == null) - { - result.height = geo.height; - } - else if (result.height != geo.height) - { - result.height = ''; - } - } - else - { - result.containsLabel = true; - } - - if (!geo.relative || geo.offset != null) - { - var x = (geo.relative) ? geo.offset.x : geo.x; - var y = (geo.relative) ? geo.offset.y : geo.y; - - if (result.x == null) - { - result.x = x; - } - else if (result.x != x) - { - result.x = ''; - } - - if (result.y == null) - { - result.y = y; - } - else if (result.y != y) - { - result.y = ''; - } - } - } - } - else if (graph.getModel().isEdge(cell)) - { - result.edges.push(cell); - } - - var state = graph.view.getState(cell); - - if (state != null) - { - result.autoSize = result.autoSize || this.isAutoSizeState(state); - result.glass = result.glass && this.isGlassState(state); - result.rounded = result.rounded && this.isRoundedState(state); - result.lineJumps = result.lineJumps && this.isLineJumpState(state); - result.comic = result.comic && this.isComicState(state); - result.image = result.image && this.isImageState(state); - result.shadow = result.shadow && this.isShadowState(state); - result.fill = result.fill && this.isFillState(state); - - var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - result.containsImage = result.containsImage || shape == 'image'; - - for (var key in state.style) - { - var value = state.style[key]; - - if (value != null) - { - if (result.style[key] == null) - { - result.style[key] = value; - } - else if (result.style[key] != value) - { - result.style[key] = ''; - } - } - } - } -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isFillState = function(state) -{ - return state.view.graph.model.isVertex(state.cell) || - mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null) == 'arrow' || - mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null) == 'filledEdge' || - mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null) == 'flexArrow'; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isGlassState = function(state) -{ - var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - - return (shape == 'label' || shape == 'rectangle' || shape == 'internalStorage' || - shape == 'ext' || shape == 'umlLifeline' || shape == 'swimlane' || - shape == 'process'); -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isRoundedState = function(state) -{ - return (state.shape != null) ? state.shape.isRoundable() : - mxUtils.indexOf(this.roundableShapes, mxUtils.getValue(state.style, - mxConstants.STYLE_SHAPE, null)) >= 0; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isLineJumpState = function(state) -{ - var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - var curved = mxUtils.getValue(state.style, mxConstants.STYLE_CURVED, false); - - return !curved && (shape == 'connector' || shape == 'filledEdge'); -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isComicState = function(state) -{ - var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - - return mxUtils.indexOf(['label', 'rectangle', 'internalStorage', 'corner', 'parallelogram', 'note', 'collate', - 'swimlane', 'triangle', 'trapezoid', 'ext', 'step', 'tee', 'process', 'link', 'rhombus', - 'offPageConnector', 'loopLimit', 'hexagon', 'manualInput', 'singleArrow', 'doubleArrow', - 'flexArrow', 'filledEdge', 'card', 'umlLifeline', 'connector', 'folder', 'component', 'sortShape', - 'cross', 'umlFrame', 'cube', 'isoCube', 'isoRectangle', 'partialRectangle'], shape) >= 0; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isAutoSizeState = function(state) -{ - return mxUtils.getValue(state.style, mxConstants.STYLE_AUTOSIZE, null) == '1'; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isImageState = function(state) -{ - var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - - return (shape == 'label' || shape == 'image'); -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isShadowState = function(state) -{ - var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - - return (shape != 'image'); -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -Format.prototype.clear = function() -{ - this.container.innerHTML = ''; - - // Destroy existing panels - if (this.panels != null) - { - for (var i = 0; i < this.panels.length; i++) - { - this.panels[i].destroy(); - } - } - - this.panels = []; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -Format.prototype.refresh = function() -{ - // Performance tweak: No refresh needed if not visible - if (this.container.style.width == '0px') - { - return; - } - - this.clear(); - var ui = this.editorUi; - var graph = ui.editor.graph; - - var div = document.createElement('div'); - div.style.whiteSpace = 'nowrap'; - div.style.color = 'rgb(112, 112, 112)'; - div.style.textAlign = 'left'; - div.style.cursor = 'default'; - - var label = document.createElement('div'); - label.style.border = '1px solid #c0c0c0'; - label.style.borderWidth = '0px 0px 1px 0px'; - label.style.textAlign = 'center'; - label.style.fontWeight = 'bold'; - label.style.overflow = 'hidden'; - label.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; - label.style.paddingTop = '8px'; - label.style.height = (mxClient.IS_QUIRKS) ? '34px' : '25px'; - label.style.width = '100%'; - this.container.appendChild(div); - - if (graph.isSelectionEmpty()) - { - mxUtils.write(label, mxResources.get('diagram')); - - // Adds button to hide the format panel since - // people don't seem to find the toolbar button - // and the menu item in the format menu - if (this.showCloseButton) - { - var img = document.createElement('img'); - img.setAttribute('border', '0'); - img.setAttribute('src', Dialog.prototype.closeImage); - img.setAttribute('title', mxResources.get('hide')); - img.style.position = 'absolute'; - img.style.display = 'block'; - img.style.right = '0px'; - img.style.top = '8px'; - img.style.cursor = 'pointer'; - img.style.marginTop = '1px'; - img.style.marginRight = '17px'; - img.style.border = '1px solid transparent'; - img.style.padding = '1px'; - img.style.opacity = 0.5; - label.appendChild(img) - - mxEvent.addListener(img, 'click', function() - { - ui.actions.get('formatPanel').funct(); - }); - } - - div.appendChild(label); - this.panels.push(new DiagramFormatPanel(this, ui, div)); - } - else if (graph.isEditing()) - { - mxUtils.write(label, mxResources.get('text')); - div.appendChild(label); - this.panels.push(new TextFormatPanel(this, ui, div)); - } - else - { - var containsLabel = this.getSelectionState().containsLabel; - var currentLabel = null; - var currentPanel = null; - - var addClickHandler = mxUtils.bind(this, function(elt, panel, index) - { - var clickHandler = mxUtils.bind(this, function(evt) - { - if (currentLabel != elt) - { - if (containsLabel) - { - this.labelIndex = index; - } - else - { - this.currentIndex = index; - } - - if (currentLabel != null) - { - currentLabel.style.backgroundColor = this.inactiveTabBackgroundColor; - currentLabel.style.borderBottomWidth = '1px'; - } - - currentLabel = elt; - currentLabel.style.backgroundColor = ''; - currentLabel.style.borderBottomWidth = '0px'; - - if (currentPanel != panel) - { - if (currentPanel != null) - { - currentPanel.style.display = 'none'; - } - - currentPanel = panel; - currentPanel.style.display = ''; - } - } - }); - - mxEvent.addListener(elt, 'click', clickHandler); - - if (index == ((containsLabel) ? this.labelIndex : this.currentIndex)) - { - // Invokes handler directly as a workaround for no click on DIV in KHTML. - clickHandler(); - } - }); - - var idx = 0; - - label.style.backgroundColor = this.inactiveTabBackgroundColor; - label.style.borderLeftWidth = '1px'; - label.style.width = (containsLabel) ? '50%' : '33.3%'; - label.style.width = (containsLabel) ? '50%' : '33.3%'; - var label2 = label.cloneNode(false); - var label3 = label2.cloneNode(false); - - // Workaround for ignored background in IE - label2.style.backgroundColor = this.inactiveTabBackgroundColor; - label3.style.backgroundColor = this.inactiveTabBackgroundColor; - - // Style - if (containsLabel) - { - label2.style.borderLeftWidth = '0px'; - } - else - { - label.style.borderLeftWidth = '0px'; - mxUtils.write(label, mxResources.get('style')); - div.appendChild(label); - - var stylePanel = div.cloneNode(false); - stylePanel.style.display = 'none'; - this.panels.push(new StyleFormatPanel(this, ui, stylePanel)); - this.container.appendChild(stylePanel); - - addClickHandler(label, stylePanel, idx++); - } - - // Text - mxUtils.write(label2, mxResources.get('text')); - div.appendChild(label2); - - var textPanel = div.cloneNode(false); - textPanel.style.display = 'none'; - this.panels.push(new TextFormatPanel(this, ui, textPanel)); - this.container.appendChild(textPanel); - - // Arrange - mxUtils.write(label3, mxResources.get('arrange')); - div.appendChild(label3); - - var arrangePanel = div.cloneNode(false); - arrangePanel.style.display = 'none'; - this.panels.push(new ArrangePanel(this, ui, arrangePanel)); - this.container.appendChild(arrangePanel); - - addClickHandler(label2, textPanel, idx++); - addClickHandler(label3, arrangePanel, idx++); - } -}; - -/** - * Base class for format panels. - */ -BaseFormatPanel = function(format, editorUi, container) -{ - this.format = format; - this.editorUi = editorUi; - this.container = container; - this.listeners = []; -}; - -/** - * - */ -BaseFormatPanel.prototype.buttonBackgroundColor = 'white'; - -/** - * Adds the given color option. - */ -BaseFormatPanel.prototype.getSelectionState = function() -{ - var graph = this.editorUi.editor.graph; - var cells = graph.getSelectionCells(); - var shape = null; - - for (var i = 0; i < cells.length; i++) - { - var state = graph.view.getState(cells[i]); - - if (state != null) - { - var tmp = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - - if (tmp != null) - { - if (shape == null) - { - shape = tmp; - } - else if (shape != tmp) - { - return null; - } - } - - } - } - - return shape; -}; - -/** - * Install input handler. - */ -BaseFormatPanel.prototype.installInputHandler = function(input, key, defaultValue, min, max, unit, textEditFallback, isFloat) -{ - unit = (unit != null) ? unit : ''; - isFloat = (isFloat != null) ? isFloat : false; - - var ui = this.editorUi; - var graph = ui.editor.graph; - - min = (min != null) ? min : 1; - max = (max != null) ? max : 999; - - var selState = null; - var updating = false; - - var update = mxUtils.bind(this, function(evt) - { - var value = (isFloat) ? parseFloat(input.value) : parseInt(input.value); - - // Special case: angle mod 360 - if (!isNaN(value) && key == mxConstants.STYLE_ROTATION) - { - // Workaround for decimal rounding errors in floats is to - // use integer and round all numbers to two decimal point - value = mxUtils.mod(Math.round(value * 100), 36000) / 100; - } - - value = Math.min(max, Math.max(min, (isNaN(value)) ? defaultValue : value)); - - if (graph.cellEditor.isContentEditing() && textEditFallback) - { - if (!updating) - { - updating = true; - - if (selState != null) - { - graph.cellEditor.restoreSelection(selState); - selState = null; - } - - textEditFallback(value); - input.value = value + unit; - - // Restore focus and selection in input - updating = false; - } - } - else if (value != mxUtils.getValue(this.format.getSelectionState().style, key, defaultValue)) - { - if (graph.isEditing()) - { - graph.stopEditing(true); - } - - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(key, value, graph.getSelectionCells()); - - // Handles special case for fontSize where HTML labels are parsed and updated - if (key == mxConstants.STYLE_FONTSIZE) - { - graph.updateLabelElements(graph.getSelectionCells(), function(elt) - { - elt.style.fontSize = value + 'px'; - elt.removeAttribute('size'); - }); - } - - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [key], - 'values', [value], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - } - - input.value = value + unit; - mxEvent.consume(evt); - }); - - if (textEditFallback && graph.cellEditor.isContentEditing()) - { - // KNOWN: Arrow up/down clear selection text in quirks/IE 8 - // Text size via arrow button limits to 16 in IE11. Why? - mxEvent.addListener(input, 'mousedown', function() - { - if (document.activeElement == graph.cellEditor.textarea) - { - selState = graph.cellEditor.saveSelection(); - } - }); - - mxEvent.addListener(input, 'touchstart', function() - { - if (document.activeElement == graph.cellEditor.textarea) - { - selState = graph.cellEditor.saveSelection(); - } - }); - } - - mxEvent.addListener(input, 'change', update); - mxEvent.addListener(input, 'blur', update); - - return update; -}; - -/** - * Adds the given option. - */ -BaseFormatPanel.prototype.createPanel = function() -{ - var div = document.createElement('div'); - div.style.padding = '12px 0px 12px 18px'; - div.style.borderBottom = '1px solid #c0c0c0'; - - return div; -}; - -/** - * Adds the given option. - */ -BaseFormatPanel.prototype.createTitle = function(title) -{ - var div = document.createElement('div'); - div.style.padding = '0px 0px 6px 0px'; - div.style.whiteSpace = 'nowrap'; - div.style.overflow = 'hidden'; - div.style.width = '200px'; - div.style.fontWeight = 'bold'; - mxUtils.write(div, title); - - return div; -}; - -/** - * - */ -BaseFormatPanel.prototype.createStepper = function(input, update, step, height, disableFocus, defaultValue) -{ - step = (step != null) ? step : 1; - height = (height != null) ? height : 8; - - if (mxClient.IS_QUIRKS) - { - height = height - 2; - } - else if (mxClient.IS_MT || document.documentMode >= 8) - { - height = height + 1; - } - - var stepper = document.createElement('div'); - mxUtils.setPrefixedStyle(stepper.style, 'borderRadius', '3px'); - stepper.style.border = '1px solid rgb(192, 192, 192)'; - stepper.style.position = 'absolute'; - - var up = document.createElement('div'); - up.style.borderBottom = '1px solid rgb(192, 192, 192)'; - up.style.position = 'relative'; - up.style.height = height + 'px'; - up.style.width = '10px'; - up.className = 'geBtnUp'; - stepper.appendChild(up); - - var down = up.cloneNode(false); - down.style.border = 'none'; - down.style.height = height + 'px'; - down.className = 'geBtnDown'; - stepper.appendChild(down); - - mxEvent.addListener(down, 'click', function(evt) - { - if (input.value == '') - { - input.value = defaultValue || '2'; - } - - var val = parseInt(input.value); - - if (!isNaN(val)) - { - input.value = val - step; - - if (update != null) - { - update(evt); - } - } - - mxEvent.consume(evt); - }); - - mxEvent.addListener(up, 'click', function(evt) - { - if (input.value == '') - { - input.value = defaultValue || '0'; - } - - var val = parseInt(input.value); - - if (!isNaN(val)) - { - input.value = val + step; - - if (update != null) - { - update(evt); - } - } - - mxEvent.consume(evt); - }); - - // Disables transfer of focus to DIV but also :active CSS - // so it's only used for fontSize where the focus should - // stay on the selected text, but not for any other input. - if (disableFocus) - { - var currentSelection = null; - - mxEvent.addGestureListeners(stepper, - function(evt) - { - // Workaround for lost current selection in page because of focus in IE - if (mxClient.IS_QUIRKS || document.documentMode == 8) - { - currentSelection = document.selection.createRange(); - } - - mxEvent.consume(evt); - }, - null, - function(evt) - { - // Workaround for lost current selection in page because of focus in IE - if (currentSelection != null) - { - try - { - currentSelection.select(); - } - catch (e) - { - // ignore - } - - currentSelection = null; - mxEvent.consume(evt); - } - } - ); - } - - return stepper; -}; - -/** - * Adds the given option. - */ -BaseFormatPanel.prototype.createOption = function(label, isCheckedFn, setCheckedFn, listener) -{ - var div = document.createElement('div'); - div.style.padding = '6px 0px 1px 0px'; - div.style.whiteSpace = 'nowrap'; - div.style.overflow = 'hidden'; - div.style.width = '200px'; - div.style.height = (mxClient.IS_QUIRKS) ? '27px' : '18px'; - - var cb = document.createElement('input'); - cb.setAttribute('type', 'checkbox'); - cb.style.margin = '0px 6px 0px 0px'; - div.appendChild(cb); - - var span = document.createElement('span'); - mxUtils.write(span, label); - div.appendChild(span); - - var applying = false; - var value = isCheckedFn(); - - var apply = function(newValue) - { - if (!applying) - { - applying = true; - - if (newValue) - { - cb.setAttribute('checked', 'checked'); - cb.defaultChecked = true; - cb.checked = true; - } - else - { - cb.removeAttribute('checked'); - cb.defaultChecked = false; - cb.checked = false; - } - - if (value != newValue) - { - value = newValue; - - // Checks if the color value needs to be updated in the model - if (isCheckedFn() != value) - { - setCheckedFn(value); - } - } - - applying = false; - } - }; - - mxEvent.addListener(div, 'click', function(evt) - { - if (cb.getAttribute('disabled') != 'disabled') - { - // Toggles checkbox state for click on label - var source = mxEvent.getSource(evt); - - if (source == div || source == span) - { - cb.checked = !cb.checked; - } - - apply(cb.checked); - } - }); - - apply(value); - - if (listener != null) - { - listener.install(apply); - this.listeners.push(listener); - } - - return div; -}; - -/** - * The string 'null' means use null in values. - */ -BaseFormatPanel.prototype.createCellOption = function(label, key, defaultValue, enabledValue, disabledValue, fn, action, stopEditing) -{ - enabledValue = (enabledValue != null) ? ((enabledValue == 'null') ? null : enabledValue) : '1'; - disabledValue = (disabledValue != null) ? ((disabledValue == 'null') ? null : disabledValue) : '0'; - - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - return this.createOption(label, function() - { - // Seems to be null sometimes, not sure why... - var state = graph.view.getState(graph.getSelectionCell()); - - if (state != null) - { - return mxUtils.getValue(state.style, key, defaultValue) != disabledValue; - } - - return null; - }, function(checked) - { - if (stopEditing) - { - graph.stopEditing(); - } - - if (action != null) - { - action.funct(); - } - else - { - graph.getModel().beginUpdate(); - try - { - var value = (checked) ? enabledValue : disabledValue; - graph.setCellStyles(key, value, graph.getSelectionCells()); - - if (fn != null) - { - fn(graph.getSelectionCells(), value); - } - - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [key], - 'values', [value], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - } - }, - { - install: function(apply) - { - this.listener = function() - { - // Seems to be null sometimes, not sure why... - var state = graph.view.getState(graph.getSelectionCell()); - - if (state != null) - { - apply(mxUtils.getValue(state.style, key, defaultValue) != disabledValue); - } - }; - - graph.getModel().addListener(mxEvent.CHANGE, this.listener); - }, - destroy: function() - { - graph.getModel().removeListener(this.listener); - } - }); -}; - -/** - * Adds the given color option. - */ -BaseFormatPanel.prototype.createColorOption = function(label, getColorFn, setColorFn, defaultColor, listener, callbackFn, hideCheckbox) -{ - var div = document.createElement('div'); - div.style.padding = '6px 0px 1px 0px'; - div.style.whiteSpace = 'nowrap'; - div.style.overflow = 'hidden'; - div.style.width = '200px'; - div.style.height = (mxClient.IS_QUIRKS) ? '27px' : '18px'; - - var cb = document.createElement('input'); - cb.setAttribute('type', 'checkbox'); - cb.style.margin = '0px 6px 0px 0px'; - - if (!hideCheckbox) - { - div.appendChild(cb); - } - - var span = document.createElement('span'); - mxUtils.write(span, label); - div.appendChild(span); - - var applying = false; - var value = getColorFn(); - - var btn = null; - - var apply = function(color, disableUpdate, forceUpdate) - { - if (!applying) - { - applying = true; - btn.innerHTML = '
'; - - // Fine-tuning in Firefox, quirks mode and IE8 standards - if (mxClient.IS_QUIRKS || document.documentMode == 8) - { - btn.firstChild.style.margin = '0px'; - } - - if (color != null && color != mxConstants.NONE) - { - cb.setAttribute('checked', 'checked'); - cb.defaultChecked = true; - cb.checked = true; - } - else - { - cb.removeAttribute('checked'); - cb.defaultChecked = false; - cb.checked = false; - } - - btn.style.display = (cb.checked || hideCheckbox) ? '' : 'none'; - - if (callbackFn != null) - { - callbackFn(color); - } - - if (!disableUpdate) - { - value = color; - - // Checks if the color value needs to be updated in the model - if (forceUpdate || hideCheckbox || getColorFn() != value) - { - setColorFn(value); - } - } - - applying = false; - } - }; - - btn = mxUtils.button('', mxUtils.bind(this, function(evt) - { - this.editorUi.pickColor(value, function(color) - { - apply(color, null, true); - }); - mxEvent.consume(evt); - })); - - btn.style.position = 'absolute'; - btn.style.marginTop = '-4px'; - btn.style.right = (mxClient.IS_QUIRKS) ? '0px' : '20px'; - btn.style.height = '22px'; - btn.className = 'geColorBtn'; - btn.style.display = (cb.checked || hideCheckbox) ? '' : 'none'; - div.appendChild(btn); - - mxEvent.addListener(div, 'click', function(evt) - { - var source = mxEvent.getSource(evt); - - if (source == cb || source.nodeName != 'INPUT') - { - // Toggles checkbox state for click on label - if (source != cb) - { - cb.checked = !cb.checked; - } - - // Overrides default value with current value to make it easier - // to restore previous value if the checkbox is clicked twice - if (!cb.checked && value != null && value != mxConstants.NONE && - defaultColor != mxConstants.NONE) - { - defaultColor = value; - } - - apply((cb.checked) ? defaultColor : mxConstants.NONE); - } - }); - - apply(value, true); - - if (listener != null) - { - listener.install(apply); - this.listeners.push(listener); - } - - return div; -}; - -/** - * - */ -BaseFormatPanel.prototype.createCellColorOption = function(label, colorKey, defaultColor, callbackFn, setStyleFn) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - return this.createColorOption(label, function() - { - // Seems to be null sometimes, not sure why... - var state = graph.view.getState(graph.getSelectionCell()); - - if (state != null) - { - return mxUtils.getValue(state.style, colorKey, null); - } - - return null; - }, function(color) - { - graph.getModel().beginUpdate(); - try - { - if (setStyleFn != null) - { - setStyleFn(color); - } - - graph.setCellStyles(colorKey, color, graph.getSelectionCells()); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [colorKey], - 'values', [color], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }, defaultColor || mxConstants.NONE, - { - install: function(apply) - { - this.listener = function() - { - // Seems to be null sometimes, not sure why... - var state = graph.view.getState(graph.getSelectionCell()); - - if (state != null) - { - apply(mxUtils.getValue(state.style, colorKey, null)); - } - }; - - graph.getModel().addListener(mxEvent.CHANGE, this.listener); - }, - destroy: function() - { - graph.getModel().removeListener(this.listener); - } - }, callbackFn); -}; - -/** - * - */ -BaseFormatPanel.prototype.addArrow = function(elt, height) -{ - height = (height != null) ? height : 10; - - var arrow = document.createElement('div'); - arrow.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; - arrow.style.padding = '6px'; - arrow.style.paddingRight = '4px'; - - var m = (10 - height); - - if (m == 2) - { - arrow.style.paddingTop = 6 + 'px'; - } - else if (m > 0) - { - arrow.style.paddingTop = (6 - m) + 'px'; - } - else - { - arrow.style.marginTop = '-2px'; - } - - arrow.style.height = height + 'px'; - arrow.style.borderLeft = '1px solid #a0a0a0'; - arrow.innerHTML = ''; - mxUtils.setOpacity(arrow, 70); - - var symbol = elt.getElementsByTagName('div')[0]; - - if (symbol != null) - { - symbol.style.paddingRight = '6px'; - symbol.style.marginLeft = '4px'; - symbol.style.marginTop = '-1px'; - symbol.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; - mxUtils.setOpacity(symbol, 60); - } - - mxUtils.setOpacity(elt, 100); - elt.style.border = '1px solid #a0a0a0'; - elt.style.backgroundColor = this.buttonBackgroundColor; - elt.style.backgroundImage = 'none'; - elt.style.width = 'auto'; - elt.className += ' geColorBtn'; - mxUtils.setPrefixedStyle(elt.style, 'borderRadius', '3px'); - - elt.appendChild(arrow); - - return symbol; -}; - -/** - * - */ -BaseFormatPanel.prototype.addUnitInput = function(container, unit, right, width, update, step, marginTop, disableFocus) -{ - marginTop = (marginTop != null) ? marginTop : 0; - - var input = document.createElement('input'); - input.style.position = 'absolute'; - input.style.textAlign = 'right'; - input.style.marginTop = '-2px'; - input.style.right = (right + 12) + 'px'; - input.style.width = width + 'px'; - container.appendChild(input); - - var stepper = this.createStepper(input, update, step, null, disableFocus); - stepper.style.marginTop = (marginTop - 2) + 'px'; - stepper.style.right = right + 'px'; - container.appendChild(stepper); - - return input; -}; - -/** - * - */ -BaseFormatPanel.prototype.createRelativeOption = function(label, key, width, handler, init) -{ - width = (width != null) ? width : 44; - - var graph = this.editorUi.editor.graph; - var div = this.createPanel(); - div.style.paddingTop = '10px'; - div.style.paddingBottom = '10px'; - mxUtils.write(div, label); - div.style.fontWeight = 'bold'; - - var update = mxUtils.bind(this, function(evt) - { - if (handler != null) - { - handler(input); - } - else - { - var value = parseInt(input.value); - value = Math.min(100, Math.max(0, (isNaN(value)) ? 100 : value)); - var state = graph.view.getState(graph.getSelectionCell()); - - if (state != null && value != mxUtils.getValue(state.style, key, 100)) - { - // Removes entry in style (assumes 100 is default for relative values) - if (value == 100) - { - value = null; - } - - graph.setCellStyles(key, value, graph.getSelectionCells()); - this.editorUi.fireEvent(new mxEventObject('styleChanged', 'keys', [key], - 'values', [value], 'cells', graph.getSelectionCells())); - } - - input.value = ((value != null) ? value : '100') + ' %'; - } - - mxEvent.consume(evt); - }); - - var input = this.addUnitInput(div, '%', 20, width, update, 10, -15, handler != null); - - if (key != null) - { - var listener = mxUtils.bind(this, function(sender, evt, force) - { - if (force || input != document.activeElement) - { - var ss = this.format.getSelectionState(); - var tmp = parseInt(mxUtils.getValue(ss.style, key, 100)); - input.value = (isNaN(tmp)) ? '' : tmp + ' %'; - } - }); - - mxEvent.addListener(input, 'keydown', function(e) - { - if (e.keyCode == 13) - { - graph.container.focus(); - mxEvent.consume(e); - } - else if (e.keyCode == 27) - { - listener(null, null, true); - graph.container.focus(); - mxEvent.consume(e); - } - }); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - } - - mxEvent.addListener(input, 'blur', update); - mxEvent.addListener(input, 'change', update); - - if (init != null) - { - init(input); - } - - return div; -}; - -/** - * - */ -BaseFormatPanel.prototype.addLabel = function(div, title, right, width) -{ - width = (width != null) ? width : 61; - - var label = document.createElement('div'); - mxUtils.write(label, title); - label.style.position = 'absolute'; - label.style.right = right + 'px'; - label.style.width = width + 'px'; - label.style.marginTop = '6px'; - label.style.textAlign = 'center'; - div.appendChild(label); -}; - -/** - * - */ -BaseFormatPanel.prototype.addKeyHandler = function(input, listener) -{ - mxEvent.addListener(input, 'keydown', mxUtils.bind(this, function(e) - { - if (e.keyCode == 13) - { - this.editorUi.editor.graph.container.focus(); - mxEvent.consume(e); - } - else if (e.keyCode == 27) - { - if (listener != null) - { - listener(null, null, true); - } - - this.editorUi.editor.graph.container.focus(); - mxEvent.consume(e); - } - })); -}; - -/** - * - */ -BaseFormatPanel.prototype.styleButtons = function(elts) -{ - for (var i = 0; i < elts.length; i++) - { - mxUtils.setPrefixedStyle(elts[i].style, 'borderRadius', '3px'); - mxUtils.setOpacity(elts[i], 100); - elts[i].style.border = '1px solid #a0a0a0'; - elts[i].style.padding = '4px'; - elts[i].style.paddingTop = '3px'; - elts[i].style.paddingRight = '1px'; - elts[i].style.margin = '1px'; - elts[i].style.width = '24px'; - elts[i].style.height = '20px'; - elts[i].className += ' geColorBtn'; - } -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -BaseFormatPanel.prototype.destroy = function() -{ - if (this.listeners != null) - { - for (var i = 0; i < this.listeners.length; i++) - { - this.listeners[i].destroy(); - } - - this.listeners = null; - } -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -ArrangePanel = function(format, editorUi, container) -{ - BaseFormatPanel.call(this, format, editorUi, container); - this.init(); -}; - -mxUtils.extend(ArrangePanel, BaseFormatPanel); - -/** - * Adds the label menu items to the given menu and parent. - */ -ArrangePanel.prototype.init = function() -{ - var graph = this.editorUi.editor.graph; - var ss = this.format.getSelectionState(); - - this.container.appendChild(this.addLayerOps(this.createPanel())); - // Special case that adds two panels - this.addGeometry(this.container); - this.addEdgeGeometry(this.container); - - if (!ss.containsLabel || ss.edges.length == 0) - { - this.container.appendChild(this.addAngle(this.createPanel())); - } - - if (!ss.containsLabel && ss.edges.length == 0) - { - this.container.appendChild(this.addFlip(this.createPanel())); - } - - if (ss.vertices.length > 1) - { - this.container.appendChild(this.addAlign(this.createPanel())); - this.container.appendChild(this.addDistribute(this.createPanel())); - } - - this.container.appendChild(this.addGroupOps(this.createPanel())); -}; - -/** - * - */ -ArrangePanel.prototype.addLayerOps = function(div) -{ - var ui = this.editorUi; - - var btn = mxUtils.button(mxResources.get('toFront'), function(evt) - { - ui.actions.get('toFront').funct(); - }) - - btn.setAttribute('title', mxResources.get('toFront') + ' (' + this.editorUi.actions.get('toFront').shortcut + ')'); - btn.style.width = '100px'; - btn.style.marginRight = '2px'; - div.appendChild(btn); - - var btn = mxUtils.button(mxResources.get('toBack'), function(evt) - { - ui.actions.get('toBack').funct(); - }) - - btn.setAttribute('title', mxResources.get('toBack') + ' (' + this.editorUi.actions.get('toBack').shortcut + ')'); - btn.style.width = '100px'; - div.appendChild(btn); - - return div; -}; - -/** - * - */ -ArrangePanel.prototype.addGroupOps = function(div) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var cell = graph.getSelectionCell(); - var ss = this.format.getSelectionState(); - var count = 0; - var btn = null; - - div.style.paddingTop = '8px'; - div.style.paddingBottom = '6px'; - - if (graph.getSelectionCount() > 1) - { - btn = mxUtils.button(mxResources.get('group'), function(evt) - { - ui.actions.get('group').funct(); - }) - - btn.setAttribute('title', mxResources.get('group') + ' (' + this.editorUi.actions.get('group').shortcut + ')'); - btn.style.width = '202px'; - btn.style.marginBottom = '2px'; - div.appendChild(btn); - count++; - } - else if (graph.getSelectionCount() == 1 && !graph.getModel().isEdge(cell) && !graph.isSwimlane(cell) && - graph.getModel().getChildCount(cell) > 0) - { - btn = mxUtils.button(mxResources.get('ungroup'), function(evt) - { - ui.actions.get('ungroup').funct(); - }) - - btn.setAttribute('title', mxResources.get('ungroup') + ' (' + - this.editorUi.actions.get('ungroup').shortcut + ')'); - btn.style.width = '202px'; - btn.style.marginBottom = '2px'; - div.appendChild(btn); - count++; - } - - if (ss.vertices.length > 0) - { - if (count > 0) - { - mxUtils.br(div); - count = 0; - } - - var btn = mxUtils.button(mxResources.get('copySize'), function(evt) - { - ui.actions.get('copySize').funct(); - }); - - btn.setAttribute('title', mxResources.get('copySize') + ' (' + - this.editorUi.actions.get('copySize').shortcut + ')'); - btn.style.width = '202px'; - btn.style.marginBottom = '2px'; - - div.appendChild(btn); - count++; - - if (ui.copiedSize != null) - { - var btn2 = mxUtils.button(mxResources.get('pasteSize'), function(evt) - { - ui.actions.get('pasteSize').funct(); - }); - - btn2.setAttribute('title', mxResources.get('pasteSize') + ' (' + - this.editorUi.actions.get('pasteSize').shortcut + ')'); - - div.appendChild(btn2); - count++; - - btn.style.width = '100px'; - btn.style.marginBottom = '2px'; - btn2.style.width = '100px'; - btn2.style.marginBottom = '2px'; - } - } - - if (graph.getSelectionCount() == 1 && graph.getModel().isVertex(cell) && - graph.getModel().isVertex(graph.getModel().getParent(cell))) - { - if (count > 0) - { - mxUtils.br(div); - } - - btn = mxUtils.button(mxResources.get('removeFromGroup'), function(evt) - { - ui.actions.get('removeFromGroup').funct(); - }) - - btn.setAttribute('title', mxResources.get('removeFromGroup')); - btn.style.width = '202px'; - btn.style.marginBottom = '2px'; - div.appendChild(btn); - count++; - } - else if (graph.getSelectionCount() > 0) - { - if (count > 0) - { - mxUtils.br(div); - } - - btn = mxUtils.button(mxResources.get('clearWaypoints'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('clearWaypoints').funct(); - })); - - btn.setAttribute('title', mxResources.get('clearWaypoints') + ' (' + this.editorUi.actions.get('clearWaypoints').shortcut + ')'); - btn.style.width = '202px'; - btn.style.marginBottom = '2px'; - div.appendChild(btn); - - count++; - } - - if (graph.getSelectionCount() == 1) - { - if (count > 0) - { - mxUtils.br(div); - } - - btn = mxUtils.button(mxResources.get('editData'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('editData').funct(); - })); - - btn.setAttribute('title', mxResources.get('editData') + ' (' + this.editorUi.actions.get('editData').shortcut + ')'); - btn.style.width = '100px'; - btn.style.marginBottom = '2px'; - div.appendChild(btn); - count++; - - btn = mxUtils.button(mxResources.get('editLink'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('editLink').funct(); - })); - - btn.setAttribute('title', mxResources.get('editLink')); - btn.style.width = '100px'; - btn.style.marginLeft = '2px'; - btn.style.marginBottom = '2px'; - div.appendChild(btn); - count++; - } - - if (count == 0) - { - div.style.display = 'none'; - } - - return div; -}; - -/** - * - */ -ArrangePanel.prototype.addAlign = function(div) -{ - var graph = this.editorUi.editor.graph; - div.style.paddingTop = '6px'; - div.style.paddingBottom = '12px'; - div.appendChild(this.createTitle(mxResources.get('align'))); - - var stylePanel = document.createElement('div'); - stylePanel.style.position = 'relative'; - stylePanel.style.paddingLeft = '0px'; - stylePanel.style.borderWidth = '0px'; - stylePanel.className = 'geToolbarContainer'; - - if (mxClient.IS_QUIRKS) - { - div.style.height = '60px'; - } - - var left = this.editorUi.toolbar.addButton('geSprite-alignleft', mxResources.get('left'), - function() { graph.alignCells(mxConstants.ALIGN_LEFT); }, stylePanel); - var center = this.editorUi.toolbar.addButton('geSprite-aligncenter', mxResources.get('center'), - function() { graph.alignCells(mxConstants.ALIGN_CENTER); }, stylePanel); - var right = this.editorUi.toolbar.addButton('geSprite-alignright', mxResources.get('right'), - function() { graph.alignCells(mxConstants.ALIGN_RIGHT); }, stylePanel); - - var top = this.editorUi.toolbar.addButton('geSprite-aligntop', mxResources.get('top'), - function() { graph.alignCells(mxConstants.ALIGN_TOP); }, stylePanel); - var middle = this.editorUi.toolbar.addButton('geSprite-alignmiddle', mxResources.get('middle'), - function() { graph.alignCells(mxConstants.ALIGN_MIDDLE); }, stylePanel); - var bottom = this.editorUi.toolbar.addButton('geSprite-alignbottom', mxResources.get('bottom'), - function() { graph.alignCells(mxConstants.ALIGN_BOTTOM); }, stylePanel); - - this.styleButtons([left, center, right, top, middle, bottom]); - right.style.marginRight = '6px'; - div.appendChild(stylePanel); - - return div; -}; - -/** - * - */ -ArrangePanel.prototype.addFlip = function(div) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - div.style.paddingTop = '6px'; - div.style.paddingBottom = '10px'; - - var span = document.createElement('div'); - span.style.marginTop = '2px'; - span.style.marginBottom = '8px'; - span.style.fontWeight = 'bold'; - mxUtils.write(span, mxResources.get('flip')); - div.appendChild(span); - - var btn = mxUtils.button(mxResources.get('horizontal'), function(evt) - { - graph.toggleCellStyles(mxConstants.STYLE_FLIPH, false); - }) - - btn.setAttribute('title', mxResources.get('horizontal')); - btn.style.width = '100px'; - btn.style.marginRight = '2px'; - div.appendChild(btn); - - var btn = mxUtils.button(mxResources.get('vertical'), function(evt) - { - graph.toggleCellStyles(mxConstants.STYLE_FLIPV, false); - }) - - btn.setAttribute('title', mxResources.get('vertical')); - btn.style.width = '100px'; - div.appendChild(btn); - - return div; -}; - -/** - * - */ -ArrangePanel.prototype.addDistribute = function(div) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - div.style.paddingTop = '6px'; - div.style.paddingBottom = '12px'; - - div.appendChild(this.createTitle(mxResources.get('distribute'))); - - var btn = mxUtils.button(mxResources.get('horizontal'), function(evt) - { - graph.distributeCells(true); - }) - - btn.setAttribute('title', mxResources.get('horizontal')); - btn.style.width = '100px'; - btn.style.marginRight = '2px'; - div.appendChild(btn); - - var btn = mxUtils.button(mxResources.get('vertical'), function(evt) - { - graph.distributeCells(false); - }) - - btn.setAttribute('title', mxResources.get('vertical')); - btn.style.width = '100px'; - div.appendChild(btn); - - return div; -}; - -/** - * - */ -ArrangePanel.prototype.addAngle = function(div) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - var ss = this.format.getSelectionState(); - - div.style.paddingBottom = '8px'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.width = '70px'; - span.style.marginTop = '0px'; - span.style.fontWeight = 'bold'; - - var input = null; - var update = null; - var btn = null; - - if (ss.edges.length == 0) - { - mxUtils.write(span, mxResources.get('angle')); - div.appendChild(span); - - input = this.addUnitInput(div, '°', 20, 44, function() - { - update.apply(this, arguments); - }); - - mxUtils.br(div); - div.style.paddingTop = '10px'; - } - else - { - div.style.paddingTop = '8px'; - } - - if (!ss.containsLabel) - { - var label = mxResources.get('reverse'); - - if (ss.vertices.length > 0 && ss.edges.length > 0) - { - label = mxResources.get('turn') + ' / ' + label; - } - else if (ss.vertices.length > 0) - { - label = mxResources.get('turn'); - } - - btn = mxUtils.button(label, function(evt) - { - ui.actions.get('turn').funct(); - }) - - btn.setAttribute('title', label + ' (' + this.editorUi.actions.get('turn').shortcut + ')'); - btn.style.width = '202px'; - div.appendChild(btn); - - if (input != null) - { - btn.style.marginTop = '8px'; - } - } - - if (input != null) - { - var listener = mxUtils.bind(this, function(sender, evt, force) - { - if (force || document.activeElement != input) - { - ss = this.format.getSelectionState(); - var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_ROTATION, 0)); - input.value = (isNaN(tmp)) ? '' : tmp + '°'; - } - }); - - update = this.installInputHandler(input, mxConstants.STYLE_ROTATION, 0, 0, 360, '°', null, true); - this.addKeyHandler(input, listener); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - } - - return div; -}; - -/** - * - */ -ArrangePanel.prototype.addGeometry = function(container) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var rect = this.format.getSelectionState(); - - var div = this.createPanel(); - div.style.paddingBottom = '8px'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.width = '50px'; - span.style.marginTop = '0px'; - span.style.fontWeight = 'bold'; - mxUtils.write(span, mxResources.get('size')); - div.appendChild(span); - - var widthUpdate, heightUpdate, leftUpdate, topUpdate; - var width = this.addUnitInput(div, 'pt', 84, 44, function() - { - widthUpdate.apply(this, arguments); - }); - var height = this.addUnitInput(div, 'pt', 20, 44, function() - { - heightUpdate.apply(this, arguments); - }); - - var autosizeBtn = document.createElement('div'); - autosizeBtn.className = 'geSprite geSprite-fit'; - autosizeBtn.setAttribute('title', mxResources.get('autosize') + ' (' + this.editorUi.actions.get('autosize').shortcut + ')'); - autosizeBtn.style.position = 'relative'; - autosizeBtn.style.cursor = 'pointer'; - autosizeBtn.style.marginTop = '-3px'; - autosizeBtn.style.border = '0px'; - autosizeBtn.style.left = '52px'; - mxUtils.setOpacity(autosizeBtn, 50); - - mxEvent.addListener(autosizeBtn, 'mouseenter', function() - { - mxUtils.setOpacity(autosizeBtn, 100); - }); - - mxEvent.addListener(autosizeBtn, 'mouseleave', function() - { - mxUtils.setOpacity(autosizeBtn, 50); - }); - - mxEvent.addListener(autosizeBtn, 'click', function() - { - ui.actions.get('autosize').funct(); - }); - - div.appendChild(autosizeBtn); - this.addLabel(div, mxResources.get('width'), 84); - this.addLabel(div, mxResources.get('height'), 20); - mxUtils.br(div); - - var wrapper = document.createElement('div'); - wrapper.style.paddingTop = '8px'; - wrapper.style.paddingRight = '20px'; - wrapper.style.whiteSpace = 'nowrap'; - wrapper.style.textAlign = 'right'; - var opt = this.createCellOption(mxResources.get('constrainProportions'), - mxConstants.STYLE_ASPECT, null, 'fixed', 'null'); - opt.style.width = '100%'; - wrapper.appendChild(opt); - div.appendChild(wrapper); - - var constrainCheckbox = opt.getElementsByTagName('input')[0]; - this.addKeyHandler(width, listener); - this.addKeyHandler(height, listener); - - widthUpdate = this.addGeometryHandler(width, function(geo, value) - { - if (geo.width > 0) - { - var value = Math.max(1, value); - - if (constrainCheckbox.checked) - { - geo.height = Math.round((geo.height * value * 100) / geo.width) / 100; - } - - geo.width = value; - } - }); - heightUpdate = this.addGeometryHandler(height, function(geo, value) - { - if (geo.height > 0) - { - var value = Math.max(1, value); - - if (constrainCheckbox.checked) - { - geo.width = Math.round((geo.width * value * 100) / geo.height) / 100; - } - - geo.height = value; - } - }); - - container.appendChild(div); - - var div2 = this.createPanel(); - div2.style.paddingBottom = '30px'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.width = '70px'; - span.style.marginTop = '0px'; - span.style.fontWeight = 'bold'; - mxUtils.write(span, mxResources.get('position')); - div2.appendChild(span); - - var left = this.addUnitInput(div2, 'pt', 84, 44, function() - { - leftUpdate.apply(this, arguments); - }); - var top = this.addUnitInput(div2, 'pt', 20, 44, function() - { - topUpdate.apply(this, arguments); - }); - - mxUtils.br(div2); - this.addLabel(div2, mxResources.get('left'), 84); - this.addLabel(div2, mxResources.get('top'), 20); - - var listener = mxUtils.bind(this, function(sender, evt, force) - { - rect = this.format.getSelectionState(); - - if (!rect.containsLabel && rect.vertices.length == graph.getSelectionCount() && - rect.width != null && rect.height != null) - { - div.style.display = ''; - - if (force || document.activeElement != width) - { - width.value = rect.width + ((rect.width == '') ? '' : ' pt'); - } - - if (force || document.activeElement != height) - { - height.value = rect.height + ((rect.height == '') ? '' : ' pt'); - } - } - else - { - div.style.display = 'none'; - } - - if (rect.vertices.length == graph.getSelectionCount() && - rect.x != null && rect.y != null) - { - div2.style.display = ''; - - if (force || document.activeElement != left) - { - left.value = rect.x + ((rect.x == '') ? '' : ' pt'); - } - - if (force || document.activeElement != top) - { - top.value = rect.y + ((rect.y == '') ? '' : ' pt'); - } - } - else - { - div2.style.display = 'none'; - } - }); - - this.addKeyHandler(left, listener); - this.addKeyHandler(top, listener); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - - leftUpdate = this.addGeometryHandler(left, function(geo, value) - { - if (geo.relative) - { - geo.offset.x = value; - } - else - { - geo.x = value; - } - }); - topUpdate = this.addGeometryHandler(top, function(geo, value) - { - if (geo.relative) - { - geo.offset.y = value; - } - else - { - geo.y = value; - } - }); - - container.appendChild(div2); -}; - -/** - * - */ -ArrangePanel.prototype.addGeometryHandler = function(input, fn) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var initialValue = null; - - function update(evt) - { - if (input.value != '') - { - var value = parseFloat(input.value); - - if (value != initialValue) - { - graph.getModel().beginUpdate(); - try - { - var cells = graph.getSelectionCells(); - - for (var i = 0; i < cells.length; i++) - { - if (graph.getModel().isVertex(cells[i])) - { - var geo = graph.getCellGeometry(cells[i]); - - if (geo != null) - { - geo = geo.clone(); - fn(geo, value); - - graph.getModel().setGeometry(cells[i], geo); - } - } - } - } - finally - { - graph.getModel().endUpdate(); - } - - initialValue = value; - input.value = value + ' pt'; - } - else if (isNaN(value)) - { - input.value = initialValue + ' pt'; - } - } - - mxEvent.consume(evt); - }; - - mxEvent.addListener(input, 'blur', update); - mxEvent.addListener(input, 'change', update); - mxEvent.addListener(input, 'focus', function() - { - initialValue = input.value; - }); - - return update; -}; - -ArrangePanel.prototype.addEdgeGeometryHandler = function(input, fn) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var initialValue = null; - - function update(evt) - { - if (input.value != '') - { - var value = parseFloat(input.value); - - if (isNaN(value)) - { - input.value = initialValue + ' pt'; - } - else if (value != initialValue) - { - graph.getModel().beginUpdate(); - try - { - var cells = graph.getSelectionCells(); - - for (var i = 0; i < cells.length; i++) - { - if (graph.getModel().isEdge(cells[i])) - { - var geo = graph.getCellGeometry(cells[i]); - - if (geo != null) - { - geo = geo.clone(); - fn(geo, value); - - graph.getModel().setGeometry(cells[i], geo); - } - } - } - } - finally - { - graph.getModel().endUpdate(); - } - - initialValue = value; - input.value = value + ' pt'; - } - } - - mxEvent.consume(evt); - }; - - mxEvent.addListener(input, 'blur', update); - mxEvent.addListener(input, 'change', update); - mxEvent.addListener(input, 'focus', function() - { - initialValue = input.value; - }); - - return update; -}; - -/** - * - */ -ArrangePanel.prototype.addEdgeGeometry = function(container) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var rect = this.format.getSelectionState(); - - var div = this.createPanel(); - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.width = '70px'; - span.style.marginTop = '0px'; - span.style.fontWeight = 'bold'; - mxUtils.write(span, mxResources.get('width')); - div.appendChild(span); - - var widthUpdate, xtUpdate, ytUpdate, xsUpdate, ysUpdate; - var width = this.addUnitInput(div, 'pt', 20, 44, function() - { - widthUpdate.apply(this, arguments); - }); - - mxUtils.br(div); - this.addKeyHandler(width, listener); - - function widthUpdate(evt) - { - // Maximum stroke width is 999 - var value = parseInt(width.value); - value = Math.min(999, Math.max(1, (isNaN(value)) ? 1 : value)); - - if (value != mxUtils.getValue(rect.style, 'width', mxCellRenderer.defaultShapes['flexArrow'].prototype.defaultWidth)) - { - graph.setCellStyles('width', value, graph.getSelectionCells()); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['width'], - 'values', [value], 'cells', graph.getSelectionCells())); - } - - width.value = value + ' pt'; - mxEvent.consume(evt); - }; - - mxEvent.addListener(width, 'blur', widthUpdate); - mxEvent.addListener(width, 'change', widthUpdate); - - container.appendChild(div); - - var divs = this.createPanel(); - divs.style.paddingBottom = '30px'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.width = '70px'; - span.style.marginTop = '0px'; - span.style.fontWeight = 'bold'; - mxUtils.write(span, 'Start'); - divs.appendChild(span); - - var xs = this.addUnitInput(divs, 'pt', 84, 44, function() - { - xsUpdate.apply(this, arguments); - }); - var ys = this.addUnitInput(divs, 'pt', 20, 44, function() - { - ysUpdate.apply(this, arguments); - }); - - mxUtils.br(divs); - this.addLabel(divs, mxResources.get('left'), 84); - this.addLabel(divs, mxResources.get('top'), 20); - container.appendChild(divs); - this.addKeyHandler(xs, listener); - this.addKeyHandler(ys, listener); - - var divt = this.createPanel(); - divt.style.paddingBottom = '30px'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.width = '70px'; - span.style.marginTop = '0px'; - span.style.fontWeight = 'bold'; - mxUtils.write(span, 'End'); - divt.appendChild(span); - - var xt = this.addUnitInput(divt, 'pt', 84, 44, function() - { - xtUpdate.apply(this, arguments); - }); - var yt = this.addUnitInput(divt, 'pt', 20, 44, function() - { - ytUpdate.apply(this, arguments); - }); - - mxUtils.br(divt); - this.addLabel(divt, mxResources.get('left'), 84); - this.addLabel(divt, mxResources.get('top'), 20); - container.appendChild(divt); - this.addKeyHandler(xt, listener); - this.addKeyHandler(yt, listener); - - var listener = mxUtils.bind(this, function(sender, evt, force) - { - rect = this.format.getSelectionState(); - var cell = graph.getSelectionCell(); - - if (rect.style.shape == 'link' || rect.style.shape == 'flexArrow') - { - div.style.display = ''; - - if (force || document.activeElement != width) - { - var value = mxUtils.getValue(rect.style, 'width', - mxCellRenderer.defaultShapes['flexArrow'].prototype.defaultWidth); - width.value = value + ' pt'; - } - } - else - { - div.style.display = 'none'; - } - - if (graph.getSelectionCount() == 1 && graph.model.isEdge(cell)) - { - var geo = graph.model.getGeometry(cell); - - if (geo.sourcePoint != null && graph.model.getTerminal(cell, true) == null) - { - xs.value = geo.sourcePoint.x; - ys.value = geo.sourcePoint.y; - } - else - { - divs.style.display = 'none'; - } - - if (geo.targetPoint != null && graph.model.getTerminal(cell, false) == null) - { - xt.value = geo.targetPoint.x; - yt.value = geo.targetPoint.y; - } - else - { - divt.style.display = 'none'; - } - } - else - { - divs.style.display = 'none'; - divt.style.display = 'none'; - } - }); - - xsUpdate = this.addEdgeGeometryHandler(xs, function(geo, value) - { - geo.sourcePoint.x = value; - }); - - ysUpdate = this.addEdgeGeometryHandler(ys, function(geo, value) - { - geo.sourcePoint.y = value; - }); - - xtUpdate = this.addEdgeGeometryHandler(xt, function(geo, value) - { - geo.targetPoint.x = value; - }); - - ytUpdate = this.addEdgeGeometryHandler(yt, function(geo, value) - { - geo.targetPoint.y = value; - }); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -TextFormatPanel = function(format, editorUi, container) -{ - BaseFormatPanel.call(this, format, editorUi, container); - this.init(); -}; - -mxUtils.extend(TextFormatPanel, BaseFormatPanel); - -/** - * Adds the label menu items to the given menu and parent. - */ -TextFormatPanel.prototype.init = function() -{ - this.container.style.borderBottom = 'none'; - this.addFont(this.container); -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -TextFormatPanel.prototype.addFont = function(container) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - var ss = this.format.getSelectionState(); - - var title = this.createTitle(mxResources.get('font')); - title.style.paddingLeft = '18px'; - title.style.paddingTop = '10px'; - title.style.paddingBottom = '6px'; - container.appendChild(title); - - var stylePanel = this.createPanel(); - stylePanel.style.paddingTop = '2px'; - stylePanel.style.paddingBottom = '2px'; - stylePanel.style.position = 'relative'; - stylePanel.style.marginLeft = '-2px'; - stylePanel.style.borderWidth = '0px'; - stylePanel.className = 'geToolbarContainer'; - - if (mxClient.IS_QUIRKS) - { - stylePanel.style.display = 'block'; - } - - if (graph.cellEditor.isContentEditing()) - { - var cssPanel = stylePanel.cloneNode(); - - var cssMenu = this.editorUi.toolbar.addMenu(mxResources.get('style'), - mxResources.get('style'), true, 'formatBlock', cssPanel); - cssMenu.style.color = 'rgb(112, 112, 112)'; - cssMenu.style.whiteSpace = 'nowrap'; - cssMenu.style.overflow = 'hidden'; - cssMenu.style.margin = '0px'; - this.addArrow(cssMenu); - cssMenu.style.width = '192px'; - cssMenu.style.height = '15px'; - - var arrow = cssMenu.getElementsByTagName('div')[0]; - arrow.style.cssFloat = 'right'; - container.appendChild(cssPanel); - - // Workaround for offset in FF - if (mxClient.IS_FF) - { - cssMenu.getElementsByTagName('div')[0].style.marginTop = '-18px'; - } - } - - container.appendChild(stylePanel); - - var colorPanel = this.createPanel(); - colorPanel.style.marginTop = '8px'; - colorPanel.style.borderTop = '1px solid #c0c0c0'; - colorPanel.style.paddingTop = '6px'; - colorPanel.style.paddingBottom = '6px'; - - var fontMenu = this.editorUi.toolbar.addMenu('Helvetica', mxResources.get('fontFamily'), true, 'fontFamily', stylePanel); - fontMenu.style.color = 'rgb(112, 112, 112)'; - fontMenu.style.whiteSpace = 'nowrap'; - fontMenu.style.overflow = 'hidden'; - fontMenu.style.margin = '0px'; - - this.addArrow(fontMenu); - fontMenu.style.width = '192px'; - fontMenu.style.height = '15px'; - - // Workaround for offset in FF - if (mxClient.IS_FF) - { - fontMenu.getElementsByTagName('div')[0].style.marginTop = '-18px'; - } - - var stylePanel2 = stylePanel.cloneNode(false); - stylePanel2.style.marginLeft = '-3px'; - var fontStyleItems = this.editorUi.toolbar.addItems(['bold', 'italic', 'underline'], stylePanel2, true); - fontStyleItems[0].setAttribute('title', mxResources.get('bold') + ' (' + this.editorUi.actions.get('bold').shortcut + ')'); - fontStyleItems[1].setAttribute('title', mxResources.get('italic') + ' (' + this.editorUi.actions.get('italic').shortcut + ')'); - fontStyleItems[2].setAttribute('title', mxResources.get('underline') + ' (' + this.editorUi.actions.get('underline').shortcut + ')'); - - var verticalItem = this.editorUi.toolbar.addItems(['vertical'], stylePanel2, true)[0]; - - if (mxClient.IS_QUIRKS) - { - mxUtils.br(container); - } - - container.appendChild(stylePanel2); - - this.styleButtons(fontStyleItems); - this.styleButtons([verticalItem]); - - var stylePanel3 = stylePanel.cloneNode(false); - stylePanel3.style.marginLeft = '-3px'; - stylePanel3.style.paddingBottom = '0px'; - - // Helper function to return a wrapper function does not pass any arguments - var callFn = function(fn) - { - return function() - { - return fn(); - }; - }; - - var left = this.editorUi.toolbar.addButton('geSprite-left', mxResources.get('left'), - (graph.cellEditor.isContentEditing()) ? - function() - { - document.execCommand('justifyleft', false, null); - } : callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_LEFT])), stylePanel3); - var center = this.editorUi.toolbar.addButton('geSprite-center', mxResources.get('center'), - (graph.cellEditor.isContentEditing()) ? - function() - { - document.execCommand('justifycenter', false, null); - } : callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_CENTER])), stylePanel3); - var right = this.editorUi.toolbar.addButton('geSprite-right', mxResources.get('right'), - (graph.cellEditor.isContentEditing()) ? - function() - { - document.execCommand('justifyright', false, null); - } : callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_RIGHT])), stylePanel3); - - this.styleButtons([left, center, right]); - - if (graph.cellEditor.isContentEditing()) - { - var clear = this.editorUi.toolbar.addButton('geSprite-removeformat', mxResources.get('removeFormat'), - function() - { - document.execCommand('removeformat', false, null); - }, stylePanel2); - this.styleButtons([clear]); - } - - var top = this.editorUi.toolbar.addButton('geSprite-top', mxResources.get('top'), - callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_TOP])), stylePanel3); - var middle = this.editorUi.toolbar.addButton('geSprite-middle', mxResources.get('middle'), - callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_MIDDLE])), stylePanel3); - var bottom = this.editorUi.toolbar.addButton('geSprite-bottom', mxResources.get('bottom'), - callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_BOTTOM])), stylePanel3); - - this.styleButtons([top, middle, bottom]); - - if (mxClient.IS_QUIRKS) - { - mxUtils.br(container); - } - - container.appendChild(stylePanel3); - - // Hack for updating UI state below based on current text selection - // currentTable is the current selected DOM table updated below - var sub, sup, full, tableWrapper, currentTable, tableCell, tableRow; - - if (graph.cellEditor.isContentEditing()) - { - top.style.display = 'none'; - middle.style.display = 'none'; - bottom.style.display = 'none'; - verticalItem.style.display = 'none'; - - full = this.editorUi.toolbar.addButton('geSprite-justifyfull', null, - function() - { - document.execCommand('justifyfull', false, null); - }, stylePanel3); - this.styleButtons([full, - sub = this.editorUi.toolbar.addButton('geSprite-subscript', - mxResources.get('subscript') + ' (' + Editor.ctrlKey + '+,)', - function() - { - document.execCommand('subscript', false, null); - }, stylePanel3), sup = this.editorUi.toolbar.addButton('geSprite-superscript', - mxResources.get('superscript') + ' (' + Editor.ctrlKey + '+.)', - function() - { - document.execCommand('superscript', false, null); - }, stylePanel3)]); - full.style.marginRight = '9px'; - - var tmp = stylePanel3.cloneNode(false); - tmp.style.paddingTop = '4px'; - var btns = [this.editorUi.toolbar.addButton('geSprite-orderedlist', mxResources.get('numberedList'), - function() - { - document.execCommand('insertorderedlist', false, null); - }, tmp), - this.editorUi.toolbar.addButton('geSprite-unorderedlist', mxResources.get('bulletedList'), - function() - { - document.execCommand('insertunorderedlist', false, null); - }, tmp), - this.editorUi.toolbar.addButton('geSprite-outdent', mxResources.get('decreaseIndent'), - function() - { - document.execCommand('outdent', false, null); - }, tmp), - this.editorUi.toolbar.addButton('geSprite-indent', mxResources.get('increaseIndent'), - function() - { - document.execCommand('indent', false, null); - }, tmp), - this.editorUi.toolbar.addButton('geSprite-code', mxResources.get('html'), - function() - { - graph.cellEditor.toggleViewMode(); - }, tmp)]; - this.styleButtons(btns); - btns[btns.length - 1].style.marginLeft = '9px'; - - if (mxClient.IS_QUIRKS) - { - mxUtils.br(container); - tmp.style.height = '40'; - } - - container.appendChild(tmp); - } - else - { - fontStyleItems[2].style.marginRight = '9px'; - right.style.marginRight = '9px'; - } - - // Label position - var stylePanel4 = stylePanel.cloneNode(false); - stylePanel4.style.marginLeft = '0px'; - stylePanel4.style.paddingTop = '8px'; - stylePanel4.style.paddingBottom = '4px'; - stylePanel4.style.fontWeight = 'normal'; - - mxUtils.write(stylePanel4, mxResources.get('position')); - - // Adds label position options - var positionSelect = document.createElement('select'); - positionSelect.style.position = 'absolute'; - positionSelect.style.right = '20px'; - positionSelect.style.width = '97px'; - positionSelect.style.marginTop = '-2px'; - - var directions = ['topLeft', 'top', 'topRight', 'left', 'center', 'right', 'bottomLeft', 'bottom', 'bottomRight']; - var lset = {'topLeft': [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_TOP, mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_BOTTOM], - 'top': [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_TOP, mxConstants.ALIGN_CENTER, mxConstants.ALIGN_BOTTOM], - 'topRight': [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_TOP, mxConstants.ALIGN_LEFT, mxConstants.ALIGN_BOTTOM], - 'left': [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_MIDDLE], - 'center': [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_CENTER, mxConstants.ALIGN_MIDDLE], - 'right': [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_LEFT, mxConstants.ALIGN_MIDDLE], - 'bottomLeft': [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_TOP], - 'bottom': [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_CENTER, mxConstants.ALIGN_TOP], - 'bottomRight': [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_LEFT, mxConstants.ALIGN_TOP]}; - - for (var i = 0; i < directions.length; i++) - { - var positionOption = document.createElement('option'); - positionOption.setAttribute('value', directions[i]); - mxUtils.write(positionOption, mxResources.get(directions[i])); - positionSelect.appendChild(positionOption); - } - - stylePanel4.appendChild(positionSelect); - - // Writing direction - var stylePanel5 = stylePanel.cloneNode(false); - stylePanel5.style.marginLeft = '0px'; - stylePanel5.style.paddingTop = '4px'; - stylePanel5.style.paddingBottom = '4px'; - stylePanel5.style.fontWeight = 'normal'; - - mxUtils.write(stylePanel5, mxResources.get('writingDirection')); - - // Adds writing direction options - // LATER: Handle reselect of same option in all selects (change event - // is not fired for same option so have opened state on click) and - // handle multiple different styles for current selection - var dirSelect = document.createElement('select'); - dirSelect.style.position = 'absolute'; - dirSelect.style.right = '20px'; - dirSelect.style.width = '97px'; - dirSelect.style.marginTop = '-2px'; - - // NOTE: For automatic we use the value null since automatic - // requires the text to be non formatted and non-wrapped - var dirs = ['automatic', 'leftToRight', 'rightToLeft']; - var dirSet = {'automatic': null, - 'leftToRight': mxConstants.TEXT_DIRECTION_LTR, - 'rightToLeft': mxConstants.TEXT_DIRECTION_RTL}; - - for (var i = 0; i < dirs.length; i++) - { - var dirOption = document.createElement('option'); - dirOption.setAttribute('value', dirs[i]); - mxUtils.write(dirOption, mxResources.get(dirs[i])); - dirSelect.appendChild(dirOption); - } - - stylePanel5.appendChild(dirSelect); - - if (!graph.isEditing()) - { - container.appendChild(stylePanel4); - - mxEvent.addListener(positionSelect, 'change', function(evt) - { - graph.getModel().beginUpdate(); - try - { - var vals = lset[positionSelect.value]; - - if (vals != null) - { - graph.setCellStyles(mxConstants.STYLE_LABEL_POSITION, vals[0], graph.getSelectionCells()); - graph.setCellStyles(mxConstants.STYLE_VERTICAL_LABEL_POSITION, vals[1], graph.getSelectionCells()); - graph.setCellStyles(mxConstants.STYLE_ALIGN, vals[2], graph.getSelectionCells()); - graph.setCellStyles(mxConstants.STYLE_VERTICAL_ALIGN, vals[3], graph.getSelectionCells()); - } - } - finally - { - graph.getModel().endUpdate(); - } - - mxEvent.consume(evt); - }); - - // LATER: Update dir in text editor while editing and update style with label - // NOTE: The tricky part is handling and passing on the auto value - container.appendChild(stylePanel5); - - mxEvent.addListener(dirSelect, 'change', function(evt) - { - graph.setCellStyles(mxConstants.STYLE_TEXT_DIRECTION, dirSet[dirSelect.value], graph.getSelectionCells()); - mxEvent.consume(evt); - }); - } - - // Font size - var input = document.createElement('input'); - input.style.textAlign = 'right'; - input.style.marginTop = '4px'; - - if (!mxClient.IS_QUIRKS) - { - input.style.position = 'absolute'; - input.style.right = '32px'; - } - - input.style.width = '46px'; - input.style.height = (mxClient.IS_QUIRKS) ? '21px' : '17px'; - stylePanel2.appendChild(input); - - // Workaround for font size 4 if no text is selected is update font size below - // after first character was entered (as the font element is lazy created) - var pendingFontSize = null; - - var inputUpdate = this.installInputHandler(input, mxConstants.STYLE_FONTSIZE, Menus.prototype.defaultFontSize, 1, 999, ' pt', - function(fontSize) - { - // IE does not support containsNode - // KNOWN: Fixes font size issues but bypasses undo - if (window.getSelection && !mxClient.IS_IE && !mxClient.IS_IE11) - { - var selection = window.getSelection(); - var container = (selection.rangeCount > 0) ? selection.getRangeAt(0).commonAncestorContainer : - graph.cellEditor.textarea; - - function updateSize(elt, ignoreContains) - { - if (elt != graph.cellEditor.textarea && graph.cellEditor.textarea.contains(elt) && - (ignoreContains || selection.containsNode(elt, true))) - { - if (elt.nodeName == 'FONT') - { - elt.removeAttribute('size'); - elt.style.fontSize = fontSize + 'px'; - } - else - { - var css = mxUtils.getCurrentStyle(elt); - - if (css.fontSize != fontSize + 'px') - { - if (mxUtils.getCurrentStyle(elt.parentNode).fontSize != fontSize + 'px') - { - elt.style.fontSize = fontSize + 'px'; - } - else - { - elt.style.fontSize = ''; - } - } - } - } - }; - - // Wraps text node or mixed selection with leading text in a font element - if (container == graph.cellEditor.textarea || - container.nodeType != mxConstants.NODETYPE_ELEMENT) - { - document.execCommand('fontSize', false, '1'); - } - - if (container != graph.cellEditor.textarea) - { - container = container.parentNode; - } - - if (container.nodeType == mxConstants.NODETYPE_ELEMENT) - { - var elts = container.getElementsByTagName('*'); - updateSize(container); - - for (var i = 0; i < elts.length; i++) - { - updateSize(elts[i]); - } - } - - input.value = fontSize + ' pt'; - } - else if (window.getSelection || document.selection) - { - // Checks selection - var par = null; - - if (document.selection) - { - par = document.selection.createRange().parentElement(); - } - else - { - var selection = window.getSelection(); - - if (selection.rangeCount > 0) - { - par = selection.getRangeAt(0).commonAncestorContainer; - } - } - - // Node.contains does not work for text nodes in IE11 - function isOrContains(container, node) - { - while (node != null) - { - if (node === container) - { - return true; - } - - node = node.parentNode; - } - - return false; - }; - - if (par != null && isOrContains(graph.cellEditor.textarea, par)) - { - pendingFontSize = fontSize; - - // Workaround for can't set font size in px is to change font size afterwards - document.execCommand('fontSize', false, '4'); - var elts = graph.cellEditor.textarea.getElementsByTagName('font'); - - for (var i = 0; i < elts.length; i++) - { - if (elts[i].getAttribute('size') == '4') - { - elts[i].removeAttribute('size'); - elts[i].style.fontSize = pendingFontSize + 'px'; - - // Overrides fontSize in input with the one just assigned as a workaround - // for potential fontSize values of parent elements that don't match - window.setTimeout(function() - { - input.value = pendingFontSize + ' pt'; - pendingFontSize = null; - }, 0); - - break; - } - } - } - } - }, true); - - var stepper = this.createStepper(input, inputUpdate, 1, 10, true, Menus.prototype.defaultFontSize); - stepper.style.display = input.style.display; - stepper.style.marginTop = '4px'; - - if (!mxClient.IS_QUIRKS) - { - stepper.style.right = '20px'; - } - - stylePanel2.appendChild(stepper); - - var arrow = fontMenu.getElementsByTagName('div')[0]; - arrow.style.cssFloat = 'right'; - - var bgColorApply = null; - var currentBgColor = '#ffffff'; - - var fontColorApply = null; - var currentFontColor = '#000000'; - - var bgPanel = (graph.cellEditor.isContentEditing()) ? this.createColorOption(mxResources.get('backgroundColor'), function() - { - return currentBgColor; - }, function(color) - { - document.execCommand('backcolor', false, (color != mxConstants.NONE) ? color : 'transparent'); - }, '#ffffff', - { - install: function(apply) { bgColorApply = apply; }, - destroy: function() { bgColorApply = null; } - }, null, true) : this.createCellColorOption(mxResources.get('backgroundColor'), mxConstants.STYLE_LABEL_BACKGROUNDCOLOR, '#ffffff', null, function(color) - { - graph.updateLabelElements(graph.getSelectionCells(), function(elt) - { - elt.style.backgroundColor = null; - }); - }); - bgPanel.style.fontWeight = 'bold'; - - var borderPanel = this.createCellColorOption(mxResources.get('borderColor'), mxConstants.STYLE_LABEL_BORDERCOLOR, '#000000'); - borderPanel.style.fontWeight = 'bold'; - - var panel = (graph.cellEditor.isContentEditing()) ? this.createColorOption(mxResources.get('fontColor'), function() - { - return currentFontColor; - }, function(color) - { - document.execCommand('forecolor', false, (color != mxConstants.NONE) ? color : 'transparent'); - }, '#000000', - { - install: function(apply) { fontColorApply = apply; }, - destroy: function() { fontColorApply = null; } - }, null, true) : this.createCellColorOption(mxResources.get('fontColor'), mxConstants.STYLE_FONTCOLOR, '#000000', function(color) - { - if (color == null || color == mxConstants.NONE) - { - bgPanel.style.display = 'none'; - } - else - { - bgPanel.style.display = ''; - } - - borderPanel.style.display = bgPanel.style.display; - }, function(color) - { - if (color == null || color == mxConstants.NONE) - { - graph.setCellStyles(mxConstants.STYLE_NOLABEL, '1', graph.getSelectionCells()); - } - else - { - graph.setCellStyles(mxConstants.STYLE_NOLABEL, null, graph.getSelectionCells()); - } - - graph.updateLabelElements(graph.getSelectionCells(), function(elt) - { - elt.removeAttribute('color'); - elt.style.color = null; - }); - }); - panel.style.fontWeight = 'bold'; - - colorPanel.appendChild(panel); - colorPanel.appendChild(bgPanel); - - if (!graph.cellEditor.isContentEditing()) - { - colorPanel.appendChild(borderPanel); - } - - container.appendChild(colorPanel); - - var extraPanel = this.createPanel(); - extraPanel.style.paddingTop = '2px'; - extraPanel.style.paddingBottom = '4px'; - - // LATER: Fix toggle using '' instead of 'null' - var wwOpt = this.createCellOption(mxResources.get('wordWrap'), mxConstants.STYLE_WHITE_SPACE, null, 'wrap', 'null', null, null, true); - wwOpt.style.fontWeight = 'bold'; - - // Word wrap in edge labels only supported via labelWidth style - if (!ss.containsLabel && !ss.autoSize && ss.edges.length == 0) - { - extraPanel.appendChild(wwOpt); - } - - // Delegates switch of style to formattedText action as it also convertes newlines - var htmlOpt = this.createCellOption(mxResources.get('formattedText'), 'html', '0', - null, null, null, ui.actions.get('formattedText')); - htmlOpt.style.fontWeight = 'bold'; - extraPanel.appendChild(htmlOpt); - - var spacingPanel = this.createPanel(); - spacingPanel.style.paddingTop = '10px'; - spacingPanel.style.paddingBottom = '28px'; - spacingPanel.style.fontWeight = 'normal'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.width = '70px'; - span.style.marginTop = '0px'; - span.style.fontWeight = 'bold'; - mxUtils.write(span, mxResources.get('spacing')); - spacingPanel.appendChild(span); - - var topUpdate, globalUpdate, leftUpdate, bottomUpdate, rightUpdate; - var topSpacing = this.addUnitInput(spacingPanel, 'pt', 91, 44, function() - { - topUpdate.apply(this, arguments); - }); - var globalSpacing = this.addUnitInput(spacingPanel, 'pt', 20, 44, function() - { - globalUpdate.apply(this, arguments); - }); - - mxUtils.br(spacingPanel); - this.addLabel(spacingPanel, mxResources.get('top'), 91); - this.addLabel(spacingPanel, mxResources.get('global'), 20); - mxUtils.br(spacingPanel); - mxUtils.br(spacingPanel); - - var leftSpacing = this.addUnitInput(spacingPanel, 'pt', 162, 44, function() - { - leftUpdate.apply(this, arguments); - }); - var bottomSpacing = this.addUnitInput(spacingPanel, 'pt', 91, 44, function() - { - bottomUpdate.apply(this, arguments); - }); - var rightSpacing = this.addUnitInput(spacingPanel, 'pt', 20, 44, function() - { - rightUpdate.apply(this, arguments); - }); - - mxUtils.br(spacingPanel); - this.addLabel(spacingPanel, mxResources.get('left'), 162); - this.addLabel(spacingPanel, mxResources.get('bottom'), 91); - this.addLabel(spacingPanel, mxResources.get('right'), 20); - - if (!graph.cellEditor.isContentEditing()) - { - container.appendChild(extraPanel); - container.appendChild(this.createRelativeOption(mxResources.get('opacity'), mxConstants.STYLE_TEXT_OPACITY)); - container.appendChild(spacingPanel); - } - else - { - var selState = null; - var lineHeightInput = null; - - container.appendChild(this.createRelativeOption(mxResources.get('lineheight'), null, null, function(input) - { - var value = (input.value == '') ? 120 : parseInt(input.value); - value = Math.max(0, (isNaN(value)) ? 120 : value); - - if (selState != null) - { - graph.cellEditor.restoreSelection(selState); - selState = null; - } - - var selectedElement = graph.getSelectedElement(); - var node = selectedElement; - - while (node != null && node.nodeType != mxConstants.NODETYPE_ELEMENT) - { - node = node.parentNode; - } - - if (node != null && node == graph.cellEditor.textarea && graph.cellEditor.textarea.firstChild != null) - { - if (graph.cellEditor.textarea.firstChild.nodeName != 'P') - { - graph.cellEditor.textarea.innerHTML = '

' + graph.cellEditor.textarea.innerHTML + '

'; - } - - node = graph.cellEditor.textarea.firstChild; - } - - if (node != null && node != graph.cellEditor.textarea && graph.cellEditor.textarea.contains(node)) - { - node.style.lineHeight = value + '%'; - } - - input.value = value + ' %'; - }, function(input) - { - // Used in CSS handler to update current value - lineHeightInput = input; - - // KNOWN: Arrow up/down clear selection text in quirks/IE 8 - // Text size via arrow button limits to 16 in IE11. Why? - mxEvent.addListener(input, 'mousedown', function() - { - if (document.activeElement == graph.cellEditor.textarea) - { - selState = graph.cellEditor.saveSelection(); - } - }); - - mxEvent.addListener(input, 'touchstart', function() - { - if (document.activeElement == graph.cellEditor.textarea) - { - selState = graph.cellEditor.saveSelection(); - } - }); - - input.value = '120 %'; - })); - - var insertPanel = stylePanel.cloneNode(false); - insertPanel.style.paddingLeft = '0px'; - var insertBtns = this.editorUi.toolbar.addItems(['link', 'image'], insertPanel, true); - - var btns = [ - this.editorUi.toolbar.addButton('geSprite-horizontalrule', mxResources.get('insertHorizontalRule'), - function() - { - document.execCommand('inserthorizontalrule', false); - }, insertPanel), - this.editorUi.toolbar.addMenuFunctionInContainer(insertPanel, 'geSprite-table', mxResources.get('table'), false, mxUtils.bind(this, function(menu) - { - this.editorUi.menus.addInsertTableItem(menu); - }))]; - this.styleButtons(insertBtns); - this.styleButtons(btns); - - var wrapper2 = this.createPanel(); - wrapper2.style.paddingTop = '10px'; - wrapper2.style.paddingBottom = '10px'; - wrapper2.appendChild(this.createTitle(mxResources.get('insert'))); - wrapper2.appendChild(insertPanel); - container.appendChild(wrapper2); - - if (mxClient.IS_QUIRKS) - { - wrapper2.style.height = '70'; - } - - var tablePanel = stylePanel.cloneNode(false); - tablePanel.style.paddingLeft = '0px'; - - var btns = [ - this.editorUi.toolbar.addButton('geSprite-insertcolumnbefore', mxResources.get('insertColumnBefore'), - mxUtils.bind(this, function() - { - try - { - if (currentTable != null) - { - graph.selectNode(graph.insertColumn(currentTable, (tableCell != null) ? tableCell.cellIndex : 0)); - } - } - catch (e) - { - this.editorUi.handleError(e); - } - }), tablePanel), - this.editorUi.toolbar.addButton('geSprite-insertcolumnafter', mxResources.get('insertColumnAfter'), - mxUtils.bind(this, function() - { - try - { - if (currentTable != null) - { - graph.selectNode(graph.insertColumn(currentTable, (tableCell != null) ? tableCell.cellIndex + 1 : -1)); - } - } - catch (e) - { - this.editorUi.handleError(e); - } - }), tablePanel), - this.editorUi.toolbar.addButton('geSprite-deletecolumn', mxResources.get('deleteColumn'), - mxUtils.bind(this, function() - { - try - { - if (currentTable != null && tableCell != null) - { - graph.deleteColumn(currentTable, tableCell.cellIndex); - } - } - catch (e) - { - this.editorUi.handleError(e); - } - }), tablePanel), - this.editorUi.toolbar.addButton('geSprite-insertrowbefore', mxResources.get('insertRowBefore'), - mxUtils.bind(this, function() - { - try - { - if (currentTable != null && tableRow != null) - { - graph.selectNode(graph.insertRow(currentTable, tableRow.sectionRowIndex)); - } - } - catch (e) - { - this.editorUi.handleError(e); - } - }), tablePanel), - this.editorUi.toolbar.addButton('geSprite-insertrowafter', mxResources.get('insertRowAfter'), - mxUtils.bind(this, function() - { - try - { - if (currentTable != null && tableRow != null) - { - graph.selectNode(graph.insertRow(currentTable, tableRow.sectionRowIndex + 1)); - } - } - catch (e) - { - this.editorUi.handleError(e); - } - }), tablePanel), - this.editorUi.toolbar.addButton('geSprite-deleterow', mxResources.get('deleteRow'), - mxUtils.bind(this, function() - { - try - { - if (currentTable != null && tableRow != null) - { - graph.deleteRow(currentTable, tableRow.sectionRowIndex); - } - } - catch (e) - { - this.editorUi.handleError(e); - } - }), tablePanel)]; - this.styleButtons(btns); - btns[2].style.marginRight = '9px'; - - var wrapper3 = this.createPanel(); - wrapper3.style.paddingTop = '10px'; - wrapper3.style.paddingBottom = '10px'; - wrapper3.appendChild(this.createTitle(mxResources.get('table'))); - wrapper3.appendChild(tablePanel); - - if (mxClient.IS_QUIRKS) - { - mxUtils.br(container); - wrapper3.style.height = '70'; - } - - var tablePanel2 = stylePanel.cloneNode(false); - tablePanel2.style.paddingLeft = '0px'; - - var btns = [ - this.editorUi.toolbar.addButton('geSprite-strokecolor', mxResources.get('borderColor'), - mxUtils.bind(this, function() - { - if (currentTable != null) - { - // Converts rgb(r,g,b) values - var color = currentTable.style.borderColor.replace( - /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g, - function($0, $1, $2, $3) { - return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2); - }); - this.editorUi.pickColor(color, function(newColor) - { - if (newColor == null || newColor == mxConstants.NONE) - { - currentTable.removeAttribute('border'); - currentTable.style.border = ''; - currentTable.style.borderCollapse = ''; - } - else - { - currentTable.setAttribute('border', '1'); - currentTable.style.border = '1px solid ' + newColor; - currentTable.style.borderCollapse = 'collapse'; - } - }); - } - }), tablePanel2), - this.editorUi.toolbar.addButton('geSprite-fillcolor', mxResources.get('backgroundColor'), - mxUtils.bind(this, function() - { - // Converts rgb(r,g,b) values - if (currentTable != null) - { - var color = currentTable.style.backgroundColor.replace( - /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g, - function($0, $1, $2, $3) { - return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2); - }); - this.editorUi.pickColor(color, function(newColor) - { - if (newColor == null || newColor == mxConstants.NONE) - { - currentTable.style.backgroundColor = ''; - } - else - { - currentTable.style.backgroundColor = newColor; - } - }); - } - }), tablePanel2), - this.editorUi.toolbar.addButton('geSprite-fit', mxResources.get('spacing'), - function() - { - if (currentTable != null) - { - var value = currentTable.getAttribute('cellPadding') || 0; - - var dlg = new FilenameDialog(ui, value, mxResources.get('apply'), mxUtils.bind(this, function(newValue) - { - if (newValue != null && newValue.length > 0) - { - currentTable.setAttribute('cellPadding', newValue); - } - else - { - currentTable.removeAttribute('cellPadding'); - } - }), mxResources.get('spacing')); - ui.showDialog(dlg.container, 300, 80, true, true); - dlg.init(); - } - }, tablePanel2), - this.editorUi.toolbar.addButton('geSprite-left', mxResources.get('left'), - function() - { - if (currentTable != null) - { - currentTable.setAttribute('align', 'left'); - } - }, tablePanel2), - this.editorUi.toolbar.addButton('geSprite-center', mxResources.get('center'), - function() - { - if (currentTable != null) - { - currentTable.setAttribute('align', 'center'); - } - }, tablePanel2), - this.editorUi.toolbar.addButton('geSprite-right', mxResources.get('right'), - function() - { - if (currentTable != null) - { - currentTable.setAttribute('align', 'right'); - } - }, tablePanel2)]; - this.styleButtons(btns); - btns[2].style.marginRight = '9px'; - - if (mxClient.IS_QUIRKS) - { - mxUtils.br(wrapper3); - mxUtils.br(wrapper3); - } - - wrapper3.appendChild(tablePanel2); - container.appendChild(wrapper3); - - tableWrapper = wrapper3; - } - - function setSelected(elt, selected) - { - if (mxClient.IS_IE && (mxClient.IS_QUIRKS || document.documentMode < 10)) - { - elt.style.filter = (selected) ? 'progid:DXImageTransform.Microsoft.Gradient('+ - 'StartColorStr=\'#c5ecff\', EndColorStr=\'#87d4fb\', GradientType=0)' : ''; - } - else - { - elt.style.backgroundImage = (selected) ? 'linear-gradient(#c5ecff 0px,#87d4fb 100%)' : ''; - } - }; - - var listener = mxUtils.bind(this, function(sender, evt, force) - { - ss = this.format.getSelectionState(); - var fontStyle = mxUtils.getValue(ss.style, mxConstants.STYLE_FONTSTYLE, 0); - setSelected(fontStyleItems[0], (fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD); - setSelected(fontStyleItems[1], (fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC); - setSelected(fontStyleItems[2], (fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE); - fontMenu.firstChild.nodeValue = mxUtils.htmlEntities(mxUtils.getValue(ss.style, mxConstants.STYLE_FONTFAMILY, Menus.prototype.defaultFont)); - - setSelected(verticalItem, mxUtils.getValue(ss.style, mxConstants.STYLE_HORIZONTAL, '1') == '0'); - - if (force || document.activeElement != input) - { - var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_FONTSIZE, Menus.prototype.defaultFontSize)); - input.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - var align = mxUtils.getValue(ss.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_CENTER); - setSelected(left, align == mxConstants.ALIGN_LEFT); - setSelected(center, align == mxConstants.ALIGN_CENTER); - setSelected(right, align == mxConstants.ALIGN_RIGHT); - - var valign = mxUtils.getValue(ss.style, mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE); - setSelected(top, valign == mxConstants.ALIGN_TOP); - setSelected(middle, valign == mxConstants.ALIGN_MIDDLE); - setSelected(bottom, valign == mxConstants.ALIGN_BOTTOM); - - var pos = mxUtils.getValue(ss.style, mxConstants.STYLE_LABEL_POSITION, mxConstants.ALIGN_CENTER); - var vpos = mxUtils.getValue(ss.style, mxConstants.STYLE_VERTICAL_LABEL_POSITION, mxConstants.ALIGN_MIDDLE); - - if (pos == mxConstants.ALIGN_LEFT && vpos == mxConstants.ALIGN_TOP) - { - positionSelect.value = 'topLeft'; - } - else if (pos == mxConstants.ALIGN_CENTER && vpos == mxConstants.ALIGN_TOP) - { - positionSelect.value = 'top'; - } - else if (pos == mxConstants.ALIGN_RIGHT && vpos == mxConstants.ALIGN_TOP) - { - positionSelect.value = 'topRight'; - } - else if (pos == mxConstants.ALIGN_LEFT && vpos == mxConstants.ALIGN_BOTTOM) - { - positionSelect.value = 'bottomLeft'; - } - else if (pos == mxConstants.ALIGN_CENTER && vpos == mxConstants.ALIGN_BOTTOM) - { - positionSelect.value = 'bottom'; - } - else if (pos == mxConstants.ALIGN_RIGHT && vpos == mxConstants.ALIGN_BOTTOM) - { - positionSelect.value = 'bottomRight'; - } - else if (pos == mxConstants.ALIGN_LEFT) - { - positionSelect.value = 'left'; - } - else if (pos == mxConstants.ALIGN_RIGHT) - { - positionSelect.value = 'right'; - } - else - { - positionSelect.value = 'center'; - } - - var dir = mxUtils.getValue(ss.style, mxConstants.STYLE_TEXT_DIRECTION, mxConstants.DEFAULT_TEXT_DIRECTION); - - if (dir == mxConstants.TEXT_DIRECTION_RTL) - { - dirSelect.value = 'rightToLeft'; - } - else if (dir == mxConstants.TEXT_DIRECTION_LTR) - { - dirSelect.value = 'leftToRight'; - } - else if (dir == mxConstants.TEXT_DIRECTION_AUTO) - { - dirSelect.value = 'automatic'; - } - - if (force || document.activeElement != globalSpacing) - { - var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING, 2)); - globalSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != topSpacing) - { - var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_TOP, 0)); - topSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != rightSpacing) - { - var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_RIGHT, 0)); - rightSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != bottomSpacing) - { - var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_BOTTOM, 0)); - bottomSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != leftSpacing) - { - var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_LEFT, 0)); - leftSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - }); - - globalUpdate = this.installInputHandler(globalSpacing, mxConstants.STYLE_SPACING, 2, -999, 999, ' pt'); - topUpdate = this.installInputHandler(topSpacing, mxConstants.STYLE_SPACING_TOP, 0, -999, 999, ' pt'); - rightUpdate = this.installInputHandler(rightSpacing, mxConstants.STYLE_SPACING_RIGHT, 0, -999, 999, ' pt'); - bottomUpdate = this.installInputHandler(bottomSpacing, mxConstants.STYLE_SPACING_BOTTOM, 0, -999, 999, ' pt'); - leftUpdate = this.installInputHandler(leftSpacing, mxConstants.STYLE_SPACING_LEFT, 0, -999, 999, ' pt'); - - this.addKeyHandler(input, listener); - this.addKeyHandler(globalSpacing, listener); - this.addKeyHandler(topSpacing, listener); - this.addKeyHandler(rightSpacing, listener); - this.addKeyHandler(bottomSpacing, listener); - this.addKeyHandler(leftSpacing, listener); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - - if (graph.cellEditor.isContentEditing()) - { - var updating = false; - - var updateCssHandler = function() - { - if (!updating) - { - updating = true; - - window.setTimeout(function() - { - var selectedElement = graph.getSelectedElement(); - var node = selectedElement; - - while (node != null && node.nodeType != mxConstants.NODETYPE_ELEMENT) - { - node = node.parentNode; - } - - if (node != null) - { - // Workaround for commonAncestor on range in IE11 returning parent of common ancestor - if (node == graph.cellEditor.textarea && graph.cellEditor.textarea.children.length == 1 && - graph.cellEditor.textarea.firstChild.nodeType == mxConstants.NODETYPE_ELEMENT) - { - node = graph.cellEditor.textarea.firstChild; - } - - function getRelativeLineHeight(fontSize, lineHeight, elt) - { - if (elt.style.lineHeight.substring(elt.style.lineHeight.length - 1) == '%') - { - return parseInt(elt.style.lineHeight) / 100; - } - else - { - return (lineHeight.substring(lineHeight.length - 2) == 'px') ? - parseFloat(lineHeight) / fontSize : parseInt(lineHeight); - } - }; - - function getAbsoluteFontSize(fontSize) - { - if (fontSize.substring(fontSize.length - 2) == 'px') - { - return parseFloat(fontSize); - } - else - { - return mxConstants.DEFAULT_FONTSIZE; - } - } - - //var realCss = mxUtils.getCurrentStyle(selectedElement); - var css = mxUtils.getCurrentStyle(node); - var fontSize = getAbsoluteFontSize(css.fontSize); - var lineHeight = getRelativeLineHeight(fontSize, css.lineHeight, node); - - // Finds common font size - var elts = node.getElementsByTagName('*'); - - // IE does not support containsNode - if (elts.length > 0 && window.getSelection && !mxClient.IS_IE && !mxClient.IS_IE11) - { - var selection = window.getSelection(); - - for (var i = 0; i < elts.length; i++) - { - if (selection.containsNode(elts[i], true)) - { - temp = mxUtils.getCurrentStyle(elts[i]); - fontSize = Math.max(getAbsoluteFontSize(temp.fontSize), fontSize); - var lh = getRelativeLineHeight(fontSize, temp.lineHeight, elts[i]); - - if (lh != lineHeight || isNaN(lh)) - { - lineHeight = ''; - } - } - } - } - - if (css != null) - { - setSelected(fontStyleItems[0], css.fontWeight == 'bold' || graph.getParentByName(node, 'B', graph.cellEditor.textarea) != null); - setSelected(fontStyleItems[1], css.fontStyle == 'italic' || graph.getParentByName(node, 'I', graph.cellEditor.textarea) != null); - setSelected(fontStyleItems[2], graph.getParentByName(node, 'U', graph.cellEditor.textarea) != null); - setSelected(left, css.textAlign == 'left'); - setSelected(center, css.textAlign == 'center'); - setSelected(right, css.textAlign == 'right'); - setSelected(full, css.textAlign == 'justify'); - setSelected(sup, graph.getParentByName(node, 'SUP', graph.cellEditor.textarea) != null); - setSelected(sub, graph.getParentByName(node, 'SUB', graph.cellEditor.textarea) != null); - - currentTable = graph.getParentByName(node, 'TABLE', graph.cellEditor.textarea); - tableRow = (currentTable == null) ? null : graph.getParentByName(node, 'TR', currentTable); - tableCell = (currentTable == null) ? null : graph.getParentByName(node, 'TD', currentTable); - tableWrapper.style.display = (currentTable != null) ? '' : 'none'; - - if (document.activeElement != input) - { - if (node.nodeName == 'FONT' && node.getAttribute('size') == '4' && - pendingFontSize != null) - { - node.removeAttribute('size'); - node.style.fontSize = pendingFontSize + ' pt'; - pendingFontSize = null; - } - else - { - input.value = (isNaN(fontSize)) ? '' : fontSize + ' pt'; - } - - var lh = parseFloat(lineHeight); - - if (!isNaN(lh)) - { - lineHeightInput.value = Math.round(lh * 100) + ' %'; - } - else - { - lineHeightInput.value = '100 %'; - } - } - - // Converts rgb(r,g,b) values - var color = css.color.replace( - /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g, - function($0, $1, $2, $3) { - return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2); - }); - var color2 = css.backgroundColor.replace( - /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g, - function($0, $1, $2, $3) { - return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2); - }); - - // Updates the color picker for the current font - if (fontColorApply != null) - { - if (color.charAt(0) == '#') - { - currentFontColor = color; - } - else - { - currentFontColor = '#000000'; - } - - fontColorApply(currentFontColor, true); - } - - if (bgColorApply != null) - { - if (color2.charAt(0) == '#') - { - currentBgColor = color2; - } - else - { - currentBgColor = null; - } - - bgColorApply(currentBgColor, true); - } - - // Workaround for firstChild is null or not an object - // in the log which seems to be IE8- only / 29.01.15 - if (fontMenu.firstChild != null) - { - // Strips leading and trailing quotes - var ff = css.fontFamily; - - if (ff.charAt(0) == '\'') - { - ff = ff.substring(1); - } - - if (ff.charAt(ff.length - 1) == '\'') - { - ff = ff.substring(0, ff.length - 1); - } - - if (ff.charAt(0) == '"') - { - ff = ff.substring(1); - } - - if (ff.charAt(ff.length - 1) == '"') - { - ff = ff.substring(0, ff.length - 1); - } - - fontMenu.firstChild.nodeValue = ff; - } - } - } - - updating = false; - }, 0); - } - }; - - mxEvent.addListener(graph.cellEditor.textarea, 'input', updateCssHandler) - mxEvent.addListener(graph.cellEditor.textarea, 'touchend', updateCssHandler); - mxEvent.addListener(graph.cellEditor.textarea, 'mouseup', updateCssHandler); - mxEvent.addListener(graph.cellEditor.textarea, 'keyup', updateCssHandler); - this.listeners.push({destroy: function() - { - // No need to remove listener since textarea is destroyed after edit - }}); - updateCssHandler(); - } - - return container; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel = function(format, editorUi, container) -{ - BaseFormatPanel.call(this, format, editorUi, container); - this.init(); -}; - -mxUtils.extend(StyleFormatPanel, BaseFormatPanel); - -/** - * - */ -StyleFormatPanel.prototype.defaultStrokeColor = 'black'; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.init = function() -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - var ss = this.format.getSelectionState(); - - if (ss.containsImage && ss.vertices.length == 1 && ss.style.shape == 'image' && - ss.style.image != null && ss.style.image.substring(0, 19) == 'data:image/svg+xml;') - { - this.container.appendChild(this.addSvgStyles(this.createPanel())); - } - - if (!ss.containsImage || ss.style.shape == 'image') - { - this.container.appendChild(this.addFill(this.createPanel())); - } - - this.container.appendChild(this.addStroke(this.createPanel())); - this.container.appendChild(this.addLineJumps(this.createPanel())); - var opacityPanel = this.createRelativeOption(mxResources.get('opacity'), mxConstants.STYLE_OPACITY, 41); - opacityPanel.style.paddingTop = '8px'; - opacityPanel.style.paddingBottom = '8px'; - this.container.appendChild(opacityPanel); - this.container.appendChild(this.addEffects(this.createPanel())); - var opsPanel = this.addEditOps(this.createPanel()); - - if (opsPanel.firstChild != null) - { - mxUtils.br(opsPanel); - } - - this.container.appendChild(this.addStyleOps(opsPanel)); -}; - -/** - * Use browser for parsing CSS. - */ -StyleFormatPanel.prototype.getCssRules = function(css) -{ - var doc = document.implementation.createHTMLDocument(''); - var styleElement = document.createElement('style'); - - mxUtils.setTextContent(styleElement, css); - doc.body.appendChild(styleElement); - - return styleElement.sheet.cssRules; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.addSvgStyles = function(container) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var ss = this.format.getSelectionState(); - container.style.paddingTop = '6px'; - container.style.paddingBottom = '6px'; - container.style.fontWeight = 'bold'; - container.style.display = 'none'; - - try - { - var exp = ss.style.editableCssRules; - - if (exp != null) - { - var regex = new RegExp(exp); - - var data = ss.style.image.substring(ss.style.image.indexOf(',') + 1); - var xml = (window.atob) ? atob(data) : Base64.decode(data, true); - var svg = mxUtils.parseXml(xml); - - if (svg != null) - { - var styles = svg.getElementsByTagName('style'); - - for (var i = 0; i < styles.length; i++) - { - var rules = this.getCssRules(mxUtils.getTextContent(styles[i])); - - for (var j = 0; j < rules.length; j++) - { - this.addSvgRule(container, rules[j], svg, styles[i], rules, j, regex); - } - } - } - } - } - catch (e) - { - // ignore - } - - return container; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.addSvgRule = function(container, rule, svg, styleElem, rules, ruleIndex, regex) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - - if (regex.test(rule.selectorText)) - { - function rgb2hex(rgb) - { - rgb = rgb.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i); - - return (rgb && rgb.length === 4) ? "#" + - ("0" + parseInt(rgb[1],10).toString(16)).slice(-2) + - ("0" + parseInt(rgb[2],10).toString(16)).slice(-2) + - ("0" + parseInt(rgb[3],10).toString(16)).slice(-2) : ''; - }; - - var addStyleRule = mxUtils.bind(this, function(rule, key, label) - { - if (rule.style[key] != '') - { - var option = this.createColorOption(label + ' ' + rule.selectorText, function() - { - return rgb2hex(rule.style[key]); - }, function(color) - { - rules[ruleIndex].style[key] = color; - var cssTxt = ''; - - for (var i = 0; i < rules.length; i++) - { - cssTxt += rules[i].cssText + ' '; - } - - styleElem.textContent = cssTxt; - var xml = mxUtils.getXml(svg.documentElement); - - graph.setCellStyles(mxConstants.STYLE_IMAGE, 'data:image/svg+xml,' + - ((window.btoa) ? btoa(xml) : Base64.encode(xml, true)), - graph.getSelectionCells()); - }, '#ffffff', - { - install: function(apply) - { - // ignore - }, - destroy: function() - { - // ignore - } - }); - - container.appendChild(option); - - // Shows container if rules are added - container.style.display = ''; - } - }); - - addStyleRule(rule, 'fill', mxResources.get('fill')); - addStyleRule(rule, 'stroke', mxResources.get('line')); - } -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.addEditOps = function(div) -{ - var ss = this.format.getSelectionState(); - var btn = null; - - if (this.editorUi.editor.graph.getSelectionCount() == 1) - { - btn = mxUtils.button(mxResources.get('editStyle'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('editStyle').funct(); - })); - - btn.setAttribute('title', mxResources.get('editStyle') + ' (' + this.editorUi.actions.get('editStyle').shortcut + ')'); - btn.style.width = '202px'; - btn.style.marginBottom = '2px'; - - div.appendChild(btn); - } - - if (ss.image) - { - var btn2 = mxUtils.button(mxResources.get('editImage'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('image').funct(); - })); - - btn2.setAttribute('title', mxResources.get('editImage')); - btn2.style.marginBottom = '2px'; - - if (btn == null) - { - btn2.style.width = '202px'; - } - else - { - btn.style.width = '100px'; - btn2.style.width = '100px'; - btn2.style.marginLeft = '2px'; - } - - div.appendChild(btn2); - } - - return div; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.addFill = function(container) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var ss = this.format.getSelectionState(); - container.style.paddingTop = '6px'; - container.style.paddingBottom = '6px'; - - // Adds gradient direction option - var gradientSelect = document.createElement('select'); - gradientSelect.style.position = 'absolute'; - gradientSelect.style.marginTop = '-2px'; - gradientSelect.style.right = (mxClient.IS_QUIRKS) ? '52px' : '72px'; - gradientSelect.style.width = '70px'; - - // Stops events from bubbling to color option event handler - mxEvent.addListener(gradientSelect, 'click', function(evt) - { - mxEvent.consume(evt); - }); - - var gradientPanel = this.createCellColorOption(mxResources.get('gradient'), mxConstants.STYLE_GRADIENTCOLOR, '#ffffff', function(color) - { - if (color == null || color == mxConstants.NONE) - { - gradientSelect.style.display = 'none'; - } - else - { - gradientSelect.style.display = ''; - } - }); - - var fillKey = (ss.style.shape == 'image') ? mxConstants.STYLE_IMAGE_BACKGROUND : mxConstants.STYLE_FILLCOLOR; - var label = (ss.style.shape == 'image') ? mxResources.get('background') : mxResources.get('fill'); - - var fillPanel = this.createCellColorOption(label, fillKey, '#ffffff'); - fillPanel.style.fontWeight = 'bold'; - - var tmpColor = mxUtils.getValue(ss.style, fillKey, null); - gradientPanel.style.display = (tmpColor != null && tmpColor != mxConstants.NONE && - ss.fill && ss.style.shape != 'image') ? '' : 'none'; - - var directions = [mxConstants.DIRECTION_NORTH, mxConstants.DIRECTION_EAST, - mxConstants.DIRECTION_SOUTH, mxConstants.DIRECTION_WEST]; - - for (var i = 0; i < directions.length; i++) - { - var gradientOption = document.createElement('option'); - gradientOption.setAttribute('value', directions[i]); - mxUtils.write(gradientOption, mxResources.get(directions[i])); - gradientSelect.appendChild(gradientOption); - } - - gradientPanel.appendChild(gradientSelect); - - var listener = mxUtils.bind(this, function() - { - ss = this.format.getSelectionState(); - var value = mxUtils.getValue(ss.style, mxConstants.STYLE_GRADIENT_DIRECTION, mxConstants.DIRECTION_SOUTH); - - // Handles empty string which is not allowed as a value - if (value == '') - { - value = mxConstants.DIRECTION_SOUTH; - } - - gradientSelect.value = value; - container.style.display = (ss.fill) ? '' : 'none'; - - var fillColor = mxUtils.getValue(ss.style, mxConstants.STYLE_FILLCOLOR, null); - - if (!ss.fill || ss.containsImage || fillColor == null || fillColor == mxConstants.NONE || ss.style.shape == 'filledEdge') - { - gradientPanel.style.display = 'none'; - } - else - { - gradientPanel.style.display = ''; - } - }); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - - mxEvent.addListener(gradientSelect, 'change', function(evt) - { - graph.setCellStyles(mxConstants.STYLE_GRADIENT_DIRECTION, gradientSelect.value, graph.getSelectionCells()); - mxEvent.consume(evt); - }); - - container.appendChild(fillPanel); - container.appendChild(gradientPanel); - - // Adds custom colors - var custom = this.getCustomColors(); - - for (var i = 0; i < custom.length; i++) - { - container.appendChild(this.createCellColorOption(custom[i].title, custom[i].key, custom[i].defaultValue)); - } - - return container; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.getCustomColors = function() -{ - var ss = this.format.getSelectionState(); - var result = []; - - if (ss.style.shape == 'swimlane') - { - result.push({title: mxResources.get('laneColor'), key: 'swimlaneFillColor', defaultValue: '#ffffff'}); - } - - return result; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.addStroke = function(container) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var ss = this.format.getSelectionState(); - - container.style.paddingTop = '4px'; - container.style.paddingBottom = '4px'; - container.style.whiteSpace = 'normal'; - - var colorPanel = document.createElement('div'); - colorPanel.style.fontWeight = 'bold'; - - // Adds gradient direction option - var styleSelect = document.createElement('select'); - styleSelect.style.position = 'absolute'; - styleSelect.style.marginTop = '-2px'; - styleSelect.style.right = '72px'; - styleSelect.style.width = '80px'; - - var styles = ['sharp', 'rounded', 'curved']; - - for (var i = 0; i < styles.length; i++) - { - var styleOption = document.createElement('option'); - styleOption.setAttribute('value', styles[i]); - mxUtils.write(styleOption, mxResources.get(styles[i])); - styleSelect.appendChild(styleOption); - } - - mxEvent.addListener(styleSelect, 'change', function(evt) - { - graph.getModel().beginUpdate(); - try - { - var keys = [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED]; - // Default for rounded is 1 - var values = ['0', null]; - - if (styleSelect.value == 'rounded') - { - values = ['1', null]; - } - else if (styleSelect.value == 'curved') - { - values = [null, '1']; - } - - for (var i = 0; i < keys.length; i++) - { - graph.setCellStyles(keys[i], values[i], graph.getSelectionCells()); - } - - ui.fireEvent(new mxEventObject('styleChanged', 'keys', keys, - 'values', values, 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - - mxEvent.consume(evt); - }); - - // Stops events from bubbling to color option event handler - mxEvent.addListener(styleSelect, 'click', function(evt) - { - mxEvent.consume(evt); - }); - - var strokeKey = (ss.style.shape == 'image') ? mxConstants.STYLE_IMAGE_BORDER : mxConstants.STYLE_STROKECOLOR; - var label = (ss.style.shape == 'image') ? mxResources.get('border') : mxResources.get('line'); - - var lineColor = this.createCellColorOption(label, strokeKey, '#000000'); - lineColor.appendChild(styleSelect); - colorPanel.appendChild(lineColor); - - // Used if only edges selected - var stylePanel = colorPanel.cloneNode(false); - stylePanel.style.fontWeight = 'normal'; - stylePanel.style.whiteSpace = 'nowrap'; - stylePanel.style.position = 'relative'; - stylePanel.style.paddingLeft = '16px' - stylePanel.style.marginBottom = '2px'; - stylePanel.style.marginTop = '2px'; - stylePanel.className = 'geToolbarContainer'; - - var addItem = mxUtils.bind(this, function(menu, width, cssName, keys, values) - { - var item = this.editorUi.menus.styleChange(menu, '', keys, values, 'geIcon', null); - - var pat = document.createElement('div'); - pat.style.width = width + 'px'; - pat.style.height = '1px'; - pat.style.borderBottom = '1px ' + cssName + ' ' + this.defaultStrokeColor; - pat.style.paddingTop = '6px'; - - item.firstChild.firstChild.style.padding = '0px 4px 0px 4px'; - item.firstChild.firstChild.style.width = width + 'px'; - item.firstChild.firstChild.appendChild(pat); - - return item; - }); - - var pattern = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel, 'geSprite-orthogonal', mxResources.get('pattern'), false, mxUtils.bind(this, function(menu) - { - addItem(menu, 75, 'solid', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], [null, null]).setAttribute('title', mxResources.get('solid')); - addItem(menu, 75, 'dashed', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', null]).setAttribute('title', mxResources.get('dashed')); - addItem(menu, 75, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 1']).setAttribute('title', mxResources.get('dotted') + ' (1)'); - addItem(menu, 75, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 2']).setAttribute('title', mxResources.get('dotted') + ' (2)'); - addItem(menu, 75, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 4']).setAttribute('title', mxResources.get('dotted') + ' (3)'); - })); - - // Used for mixed selection (vertices and edges) - var altStylePanel = stylePanel.cloneNode(false); - - var edgeShape = this.editorUi.toolbar.addMenuFunctionInContainer(altStylePanel, 'geSprite-connection', mxResources.get('connection'), false, mxUtils.bind(this, function(menu) - { - this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], [null, null, null, null], 'geIcon geSprite geSprite-connection', null, true).setAttribute('title', mxResources.get('line')); - this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], ['link', null, null, null], 'geIcon geSprite geSprite-linkedge', null, true).setAttribute('title', mxResources.get('link')); - this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], ['flexArrow', null, null, null], 'geIcon geSprite geSprite-arrow', null, true).setAttribute('title', mxResources.get('arrow')); - this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], ['arrow', null, null, null], 'geIcon geSprite geSprite-simplearrow', null, true).setAttribute('title', mxResources.get('simpleArrow')); - })); - - var altPattern = this.editorUi.toolbar.addMenuFunctionInContainer(altStylePanel, 'geSprite-orthogonal', mxResources.get('pattern'), false, mxUtils.bind(this, function(menu) - { - addItem(menu, 33, 'solid', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], [null, null]).setAttribute('title', mxResources.get('solid')); - addItem(menu, 33, 'dashed', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', null]).setAttribute('title', mxResources.get('dashed')); - addItem(menu, 33, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 1']).setAttribute('title', mxResources.get('dotted') + ' (1)'); - addItem(menu, 33, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 2']).setAttribute('title', mxResources.get('dotted') + ' (2)'); - addItem(menu, 33, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 4']).setAttribute('title', mxResources.get('dotted') + ' (3)'); - })); - - var stylePanel2 = stylePanel.cloneNode(false); - - // Stroke width - var input = document.createElement('input'); - input.style.textAlign = 'right'; - input.style.marginTop = '2px'; - input.style.width = '41px'; - input.setAttribute('title', mxResources.get('linewidth')); - - stylePanel.appendChild(input); - - var altInput = input.cloneNode(true); - altStylePanel.appendChild(altInput); - - function update(evt) - { - // Maximum stroke width is 999 - var value = parseInt(input.value); - value = Math.min(999, Math.max(1, (isNaN(value)) ? 1 : value)); - - if (value != mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1)) - { - graph.setCellStyles(mxConstants.STYLE_STROKEWIDTH, value, graph.getSelectionCells()); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_STROKEWIDTH], - 'values', [value], 'cells', graph.getSelectionCells())); - } - - input.value = value + ' pt'; - mxEvent.consume(evt); - }; - - function altUpdate(evt) - { - // Maximum stroke width is 999 - var value = parseInt(altInput.value); - value = Math.min(999, Math.max(1, (isNaN(value)) ? 1 : value)); - - if (value != mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1)) - { - graph.setCellStyles(mxConstants.STYLE_STROKEWIDTH, value, graph.getSelectionCells()); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_STROKEWIDTH], - 'values', [value], 'cells', graph.getSelectionCells())); - } - - altInput.value = value + ' pt'; - mxEvent.consume(evt); - }; - - var stepper = this.createStepper(input, update, 1, 9); - stepper.style.display = input.style.display; - stepper.style.marginTop = '2px'; - stylePanel.appendChild(stepper); - - var altStepper = this.createStepper(altInput, altUpdate, 1, 9); - altStepper.style.display = altInput.style.display; - altStepper.style.marginTop = '2px'; - altStylePanel.appendChild(altStepper); - - if (!mxClient.IS_QUIRKS) - { - input.style.position = 'absolute'; - input.style.right = '32px'; - input.style.height = '15px'; - stepper.style.right = '20px'; - - altInput.style.position = 'absolute'; - altInput.style.right = '32px'; - altInput.style.height = '15px'; - altStepper.style.right = '20px'; - } - else - { - input.style.height = '17px'; - altInput.style.height = '17px'; - } - - mxEvent.addListener(input, 'blur', update); - mxEvent.addListener(input, 'change', update); - - mxEvent.addListener(altInput, 'blur', altUpdate); - mxEvent.addListener(altInput, 'change', altUpdate); - - if (mxClient.IS_QUIRKS) - { - mxUtils.br(stylePanel2); - mxUtils.br(stylePanel2); - } - - var edgeStyle = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel2, 'geSprite-orthogonal', mxResources.get('waypoints'), false, mxUtils.bind(this, function(menu) - { - if (ss.style.shape != 'arrow') - { - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], [null, null, null], 'geIcon geSprite geSprite-straight', null, true).setAttribute('title', mxResources.get('straight')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['orthogonalEdgeStyle', null, null], 'geIcon geSprite geSprite-orthogonal', null, true).setAttribute('title', mxResources.get('orthogonal')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['elbowEdgeStyle', null, null, null], 'geIcon geSprite geSprite-horizontalelbow', null, true).setAttribute('title', mxResources.get('simple')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['elbowEdgeStyle', 'vertical', null, null], 'geIcon geSprite geSprite-verticalelbow', null, true).setAttribute('title', mxResources.get('simple')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['isometricEdgeStyle', null, null, null], 'geIcon geSprite geSprite-horizontalisometric', null, true).setAttribute('title', mxResources.get('isometric')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['isometricEdgeStyle', 'vertical', null, null], 'geIcon geSprite geSprite-verticalisometric', null, true).setAttribute('title', mxResources.get('isometric')); - - if (ss.style.shape == 'connector') - { - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['orthogonalEdgeStyle', '1', null], 'geIcon geSprite geSprite-curved', null, true).setAttribute('title', mxResources.get('curved')); - } - - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['entityRelationEdgeStyle', null, null], 'geIcon geSprite geSprite-entity', null, true).setAttribute('title', mxResources.get('entityRelation')); - } - })); - - var lineStart = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel2, 'geSprite-startclassic', mxResources.get('linestart'), false, mxUtils.bind(this, function(menu) - { - if (ss.style.shape == 'connector' || ss.style.shape == 'flexArrow' || ss.style.shape == 'filledEdge') - { - var item = this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.NONE, 0], 'geIcon', null, false); - item.setAttribute('title', mxResources.get('none')); - item.firstChild.firstChild.innerHTML = '' + mxUtils.htmlEntities(mxResources.get('none')) + ''; - - if (ss.style.shape == 'connector' || ss.style.shape == 'filledEdge') - { - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-startclassic', null, false).setAttribute('title', mxResources.get('classic')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC_THIN, 1], 'geIcon geSprite geSprite-startclassicthin', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OPEN, 0], 'geIcon geSprite geSprite-startopen', null, false).setAttribute('title', mxResources.get('openArrow')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OPEN_THIN, 0], 'geIcon geSprite geSprite-startopenthin', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['openAsync', 0], 'geIcon geSprite geSprite-startopenasync', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-startblock', null, false).setAttribute('title', mxResources.get('block')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK_THIN, 1], 'geIcon geSprite geSprite-startblockthin', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['async', 1], 'geIcon geSprite geSprite-startasync', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-startoval', null, false).setAttribute('title', mxResources.get('oval')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-startdiamond', null, false).setAttribute('title', mxResources.get('diamond')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-startthindiamond', null, false).setAttribute('title', mxResources.get('diamondThin')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-startclassictrans', null, false).setAttribute('title', mxResources.get('classic')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC_THIN, 0], 'geIcon geSprite geSprite-startclassicthintrans', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-startblocktrans', null, false).setAttribute('title', mxResources.get('block')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK_THIN, 0], 'geIcon geSprite geSprite-startblockthintrans', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['async', 0], 'geIcon geSprite geSprite-startasynctrans', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-startovaltrans', null, false).setAttribute('title', mxResources.get('oval')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-startdiamondtrans', null, false).setAttribute('title', mxResources.get('diamond')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-startthindiamondtrans', null, false).setAttribute('title', mxResources.get('diamondThin')); - - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['dash', 0], 'geIcon geSprite geSprite-startdash', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['cross', 0], 'geIcon geSprite geSprite-startcross', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['circlePlus', 0], 'geIcon geSprite geSprite-startcircleplus', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['circle', 1], 'geIcon geSprite geSprite-startcircle', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERone', 0], 'geIcon geSprite geSprite-starterone', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERmandOne', 0], 'geIcon geSprite geSprite-starteronetoone', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERmany', 0], 'geIcon geSprite geSprite-startermany', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERoneToMany', 0], 'geIcon geSprite geSprite-starteronetomany', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERzeroToOne', 1], 'geIcon geSprite geSprite-starteroneopt', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERzeroToMany', 1], 'geIcon geSprite geSprite-startermanyopt', null, false); - } - else - { - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW], [mxConstants.ARROW_BLOCK], 'geIcon geSprite geSprite-startblocktrans', null, false).setAttribute('title', mxResources.get('block')); - } - } - })); - - var lineEnd = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel2, 'geSprite-endclassic', mxResources.get('lineend'), false, mxUtils.bind(this, function(menu) - { - if (ss.style.shape == 'connector' || ss.style.shape == 'flexArrow' || ss.style.shape == 'filledEdge') - { - var item = this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.NONE, 0], 'geIcon', null, false); - item.setAttribute('title', mxResources.get('none')); - item.firstChild.firstChild.innerHTML = '' + mxUtils.htmlEntities(mxResources.get('none')) + ''; - - if (ss.style.shape == 'connector' || ss.style.shape == 'filledEdge') - { - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-endclassic', null, false).setAttribute('title', mxResources.get('classic')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC_THIN, 1], 'geIcon geSprite geSprite-endclassicthin', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OPEN, 0], 'geIcon geSprite geSprite-endopen', null, false).setAttribute('title', mxResources.get('openArrow')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OPEN_THIN, 0], 'geIcon geSprite geSprite-endopenthin', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['openAsync', 0], 'geIcon geSprite geSprite-endopenasync', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-endblock', null, false).setAttribute('title', mxResources.get('block')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK_THIN, 1], 'geIcon geSprite geSprite-endblockthin', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['async', 1], 'geIcon geSprite geSprite-endasync', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-endoval', null, false).setAttribute('title', mxResources.get('oval')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-enddiamond', null, false).setAttribute('title', mxResources.get('diamond')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-endthindiamond', null, false).setAttribute('title', mxResources.get('diamondThin')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-endclassictrans', null, false).setAttribute('title', mxResources.get('classic')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC_THIN, 0], 'geIcon geSprite geSprite-endclassicthintrans', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-endblocktrans', null, false).setAttribute('title', mxResources.get('block')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK_THIN, 0], 'geIcon geSprite geSprite-endblockthintrans', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['async', 0], 'geIcon geSprite geSprite-endasynctrans', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-endovaltrans', null, false).setAttribute('title', mxResources.get('oval')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-enddiamondtrans', null, false).setAttribute('title', mxResources.get('diamond')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-endthindiamondtrans', null, false).setAttribute('title', mxResources.get('diamondThin')); - - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['dash', 0], 'geIcon geSprite geSprite-enddash', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['cross', 0], 'geIcon geSprite geSprite-endcross', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['circlePlus', 0], 'geIcon geSprite geSprite-endcircleplus', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['circle', 1], 'geIcon geSprite geSprite-endcircle', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERone', 0], 'geIcon geSprite geSprite-enderone', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERmandOne', 0], 'geIcon geSprite geSprite-enderonetoone', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERmany', 0], 'geIcon geSprite geSprite-endermany', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERoneToMany', 0], 'geIcon geSprite geSprite-enderonetomany', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERzeroToOne', 1], 'geIcon geSprite geSprite-enderoneopt', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERzeroToMany', 1], 'geIcon geSprite geSprite-endermanyopt', null, false); - } - else - { - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW], [mxConstants.ARROW_BLOCK], 'geIcon geSprite geSprite-endblocktrans', null, false).setAttribute('title', mxResources.get('block')); - } - } - })); - - this.addArrow(edgeShape, 8); - this.addArrow(edgeStyle); - this.addArrow(lineStart); - this.addArrow(lineEnd); - - var symbol = this.addArrow(pattern, 9); - symbol.className = 'geIcon'; - symbol.style.width = '84px'; - - var altSymbol = this.addArrow(altPattern, 9); - altSymbol.className = 'geIcon'; - altSymbol.style.width = '22px'; - - var solid = document.createElement('div'); - solid.style.width = '85px'; - solid.style.height = '1px'; - solid.style.borderBottom = '1px solid ' + this.defaultStrokeColor; - solid.style.marginBottom = '9px'; - symbol.appendChild(solid); - - var altSolid = document.createElement('div'); - altSolid.style.width = '23px'; - altSolid.style.height = '1px'; - altSolid.style.borderBottom = '1px solid ' + this.defaultStrokeColor; - altSolid.style.marginBottom = '9px'; - altSymbol.appendChild(altSolid); - - pattern.style.height = '15px'; - altPattern.style.height = '15px'; - edgeShape.style.height = '15px'; - edgeStyle.style.height = '17px'; - lineStart.style.marginLeft = '3px'; - lineStart.style.height = '17px'; - lineEnd.style.marginLeft = '3px'; - lineEnd.style.height = '17px'; - - container.appendChild(colorPanel); - container.appendChild(altStylePanel); - container.appendChild(stylePanel); - - var arrowPanel = stylePanel.cloneNode(false); - arrowPanel.style.paddingBottom = '6px'; - arrowPanel.style.paddingTop = '4px'; - arrowPanel.style.fontWeight = 'normal'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.marginLeft = '3px'; - span.style.marginBottom = '12px'; - span.style.marginTop = '2px'; - span.style.fontWeight = 'normal'; - span.style.width = '76px'; - - mxUtils.write(span, mxResources.get('lineend')); - arrowPanel.appendChild(span); - - var endSpacingUpdate, endSizeUpdate; - var endSpacing = this.addUnitInput(arrowPanel, 'pt', 74, 33, function() - { - endSpacingUpdate.apply(this, arguments); - }); - var endSize = this.addUnitInput(arrowPanel, 'pt', 20, 33, function() - { - endSizeUpdate.apply(this, arguments); - }); - - mxUtils.br(arrowPanel); - - var spacer = document.createElement('div'); - spacer.style.height = '8px'; - arrowPanel.appendChild(spacer); - - span = span.cloneNode(false); - mxUtils.write(span, mxResources.get('linestart')); - arrowPanel.appendChild(span); - - var startSpacingUpdate, startSizeUpdate; - var startSpacing = this.addUnitInput(arrowPanel, 'pt', 74, 33, function() - { - startSpacingUpdate.apply(this, arguments); - }); - var startSize = this.addUnitInput(arrowPanel, 'pt', 20, 33, function() - { - startSizeUpdate.apply(this, arguments); - }); - - mxUtils.br(arrowPanel); - this.addLabel(arrowPanel, mxResources.get('spacing'), 74, 50); - this.addLabel(arrowPanel, mxResources.get('size'), 20, 50); - mxUtils.br(arrowPanel); - - var perimeterPanel = colorPanel.cloneNode(false); - perimeterPanel.style.fontWeight = 'normal'; - perimeterPanel.style.position = 'relative'; - perimeterPanel.style.paddingLeft = '16px' - perimeterPanel.style.marginBottom = '2px'; - perimeterPanel.style.marginTop = '6px'; - perimeterPanel.style.borderWidth = '0px'; - perimeterPanel.style.paddingBottom = '18px'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.marginLeft = '3px'; - span.style.marginBottom = '12px'; - span.style.marginTop = '1px'; - span.style.fontWeight = 'normal'; - span.style.width = '120px'; - mxUtils.write(span, mxResources.get('perimeter')); - perimeterPanel.appendChild(span); - - var perimeterUpdate; - var perimeterSpacing = this.addUnitInput(perimeterPanel, 'pt', 20, 41, function() - { - perimeterUpdate.apply(this, arguments); - }); - - if (ss.edges.length == graph.getSelectionCount()) - { - container.appendChild(stylePanel2); - - if (mxClient.IS_QUIRKS) - { - mxUtils.br(container); - mxUtils.br(container); - } - - container.appendChild(arrowPanel); - } - else if (ss.vertices.length == graph.getSelectionCount()) - { - if (mxClient.IS_QUIRKS) - { - mxUtils.br(container); - } - - container.appendChild(perimeterPanel); - } - - var listener = mxUtils.bind(this, function(sender, evt, force) - { - ss = this.format.getSelectionState(); - var color = mxUtils.getValue(ss.style, strokeKey, null); - - if (force || document.activeElement != input) - { - var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1)); - input.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != altInput) - { - var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1)); - altInput.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - styleSelect.style.visibility = (ss.style.shape == 'connector' || ss.style.shape == 'filledEdge') ? '' : 'hidden'; - - if (mxUtils.getValue(ss.style, mxConstants.STYLE_CURVED, null) == '1') - { - styleSelect.value = 'curved'; - } - else if (mxUtils.getValue(ss.style, mxConstants.STYLE_ROUNDED, null) == '1') - { - styleSelect.value = 'rounded'; - } - - if (mxUtils.getValue(ss.style, mxConstants.STYLE_DASHED, null) == '1') - { - if (mxUtils.getValue(ss.style, mxConstants.STYLE_DASH_PATTERN, null) == null) - { - solid.style.borderBottom = '1px dashed ' + this.defaultStrokeColor; - } - else - { - solid.style.borderBottom = '1px dotted ' + this.defaultStrokeColor; - } - } - else - { - solid.style.borderBottom = '1px solid ' + this.defaultStrokeColor; - } - - altSolid.style.borderBottom = solid.style.borderBottom; - - // Updates toolbar icon for edge style - var edgeStyleDiv = edgeStyle.getElementsByTagName('div')[0]; - var es = mxUtils.getValue(ss.style, mxConstants.STYLE_EDGE, null); - - if (mxUtils.getValue(ss.style, mxConstants.STYLE_NOEDGESTYLE, null) == '1') - { - es = null; - } - - if (es == 'orthogonalEdgeStyle' && mxUtils.getValue(ss.style, mxConstants.STYLE_CURVED, null) == '1') - { - edgeStyleDiv.className = 'geSprite geSprite-curved'; - } - else if (es == 'straight' || es == 'none' || es == null) - { - edgeStyleDiv.className = 'geSprite geSprite-straight'; - } - else if (es == 'entityRelationEdgeStyle') - { - edgeStyleDiv.className = 'geSprite geSprite-entity'; - } - else if (es == 'elbowEdgeStyle') - { - edgeStyleDiv.className = 'geSprite ' + ((mxUtils.getValue(ss.style, - mxConstants.STYLE_ELBOW, null) == 'vertical') ? - 'geSprite-verticalelbow' : 'geSprite-horizontalelbow'); - } - else if (es == 'isometricEdgeStyle') - { - edgeStyleDiv.className = 'geSprite ' + ((mxUtils.getValue(ss.style, - mxConstants.STYLE_ELBOW, null) == 'vertical') ? - 'geSprite-verticalisometric' : 'geSprite-horizontalisometric'); - } - else - { - edgeStyleDiv.className = 'geSprite geSprite-orthogonal'; - } - - // Updates icon for edge shape - var edgeShapeDiv = edgeShape.getElementsByTagName('div')[0]; - - if (ss.style.shape == 'link') - { - edgeShapeDiv.className = 'geSprite geSprite-linkedge'; - } - else if (ss.style.shape == 'flexArrow') - { - edgeShapeDiv.className = 'geSprite geSprite-arrow'; - } - else if (ss.style.shape == 'arrow') - { - edgeShapeDiv.className = 'geSprite geSprite-simplearrow'; - } - else - { - edgeShapeDiv.className = 'geSprite geSprite-connection'; - } - - if (ss.edges.length == graph.getSelectionCount()) - { - altStylePanel.style.display = ''; - stylePanel.style.display = 'none'; - } - else - { - altStylePanel.style.display = 'none'; - stylePanel.style.display = ''; - } - - function updateArrow(marker, fill, elt, prefix) - { - var markerDiv = elt.getElementsByTagName('div')[0]; - - markerDiv.className = ui.getCssClassForMarker(prefix, ss.style.shape, marker, fill); - - if (markerDiv.className == 'geSprite geSprite-noarrow') - { - markerDiv.innerHTML = mxUtils.htmlEntities(mxResources.get('none')); - markerDiv.style.backgroundImage = 'none'; - markerDiv.style.verticalAlign = 'top'; - markerDiv.style.marginTop = '5px'; - markerDiv.style.fontSize = '10px'; - markerDiv.style.filter = 'none'; - markerDiv.style.color = this.defaultStrokeColor; - markerDiv.nextSibling.style.marginTop = '0px'; - } - - return markerDiv; - }; - - var sourceDiv = updateArrow(mxUtils.getValue(ss.style, mxConstants.STYLE_STARTARROW, null), - mxUtils.getValue(ss.style, 'startFill', '1'), lineStart, 'start'); - var targetDiv = updateArrow(mxUtils.getValue(ss.style, mxConstants.STYLE_ENDARROW, null), - mxUtils.getValue(ss.style, 'endFill', '1'), lineEnd, 'end'); - - // Special cases for markers - if (ss.style.shape == 'arrow') - { - sourceDiv.className = 'geSprite geSprite-noarrow'; - targetDiv.className = 'geSprite geSprite-endblocktrans'; - } - else if (ss.style.shape == 'link') - { - sourceDiv.className = 'geSprite geSprite-noarrow'; - targetDiv.className = 'geSprite geSprite-noarrow'; - } - - mxUtils.setOpacity(edgeStyle, (ss.style.shape == 'arrow') ? 30 : 100); - - if (ss.style.shape != 'connector' && ss.style.shape != 'flexArrow' && ss.style.shape != 'filledEdge') - { - mxUtils.setOpacity(lineStart, 30); - mxUtils.setOpacity(lineEnd, 30); - } - else - { - mxUtils.setOpacity(lineStart, 100); - mxUtils.setOpacity(lineEnd, 100); - } - - if (force || document.activeElement != startSize) - { - var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_MARKERSIZE)); - startSize.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != startSpacing) - { - var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_SOURCE_PERIMETER_SPACING, 0)); - startSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != endSize) - { - var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_ENDSIZE, mxConstants.DEFAULT_MARKERSIZE)); - endSize.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != startSpacing) - { - var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_TARGET_PERIMETER_SPACING, 0)); - endSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != perimeterSpacing) - { - var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_PERIMETER_SPACING, 0)); - perimeterSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - }); - - startSizeUpdate = this.installInputHandler(startSize, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_MARKERSIZE, 0, 999, ' pt'); - startSpacingUpdate = this.installInputHandler(startSpacing, mxConstants.STYLE_SOURCE_PERIMETER_SPACING, 0, -999, 999, ' pt'); - endSizeUpdate = this.installInputHandler(endSize, mxConstants.STYLE_ENDSIZE, mxConstants.DEFAULT_MARKERSIZE, 0, 999, ' pt'); - endSpacingUpdate = this.installInputHandler(endSpacing, mxConstants.STYLE_TARGET_PERIMETER_SPACING, 0, -999, 999, ' pt'); - perimeterUpdate = this.installInputHandler(perimeterSpacing, mxConstants.STYLE_PERIMETER_SPACING, 0, 0, 999, ' pt'); - - this.addKeyHandler(input, listener); - this.addKeyHandler(startSize, listener); - this.addKeyHandler(startSpacing, listener); - this.addKeyHandler(endSize, listener); - this.addKeyHandler(endSpacing, listener); - this.addKeyHandler(perimeterSpacing, listener); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - - return container; -}; - -/** - * Adds UI for configuring line jumps. - */ -StyleFormatPanel.prototype.addLineJumps = function(container) -{ - var ss = this.format.getSelectionState(); - - if (Graph.lineJumpsEnabled && ss.edges.length > 0 && - ss.vertices.length == 0 && ss.lineJumps) - { - container.style.padding = '8px 0px 24px 18px'; - - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.fontWeight = 'bold'; - span.style.width = '80px'; - - mxUtils.write(span, mxResources.get('lineJumps')); - container.appendChild(span); - - var styleSelect = document.createElement('select'); - styleSelect.style.position = 'absolute'; - styleSelect.style.marginTop = '-2px'; - styleSelect.style.right = '76px'; - styleSelect.style.width = '62px'; - - var styles = ['none', 'arc', 'gap', 'sharp']; - - for (var i = 0; i < styles.length; i++) - { - var styleOption = document.createElement('option'); - styleOption.setAttribute('value', styles[i]); - mxUtils.write(styleOption, mxResources.get(styles[i])); - styleSelect.appendChild(styleOption); - } - - mxEvent.addListener(styleSelect, 'change', function(evt) - { - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles('jumpStyle', styleSelect.value, graph.getSelectionCells()); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['jumpStyle'], - 'values', [styleSelect.value], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - - mxEvent.consume(evt); - }); - - // Stops events from bubbling to color option event handler - mxEvent.addListener(styleSelect, 'click', function(evt) - { - mxEvent.consume(evt); - }); - - container.appendChild(styleSelect); - - var jumpSizeUpdate; - - var jumpSize = this.addUnitInput(container, 'pt', 22, 33, function() - { - jumpSizeUpdate.apply(this, arguments); - }); - - jumpSizeUpdate = this.installInputHandler(jumpSize, 'jumpSize', - Graph.defaultJumpSize, 0, 999, ' pt'); - - var listener = mxUtils.bind(this, function(sender, evt, force) - { - ss = this.format.getSelectionState(); - styleSelect.value = mxUtils.getValue(ss.style, 'jumpStyle', 'none'); - - if (force || document.activeElement != jumpSize) - { - var tmp = parseInt(mxUtils.getValue(ss.style, 'jumpSize', Graph.defaultJumpSize)); - jumpSize.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - }); - - this.addKeyHandler(jumpSize, listener); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - } - else - { - container.style.display = 'none'; - } - - return container; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.addEffects = function(div) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - var ss = this.format.getSelectionState(); - - div.style.paddingTop = '0px'; - div.style.paddingBottom = '2px'; - - var table = document.createElement('table'); - - if (mxClient.IS_QUIRKS) - { - table.style.fontSize = '1em'; - } - - table.style.width = '100%'; - table.style.fontWeight = 'bold'; - table.style.paddingRight = '20px'; - var tbody = document.createElement('tbody'); - var row = document.createElement('tr'); - row.style.padding = '0px'; - var left = document.createElement('td'); - left.style.padding = '0px'; - left.style.width = '50%'; - left.setAttribute('valign', 'top'); - - var right = left.cloneNode(true); - right.style.paddingLeft = '8px'; - row.appendChild(left); - row.appendChild(right); - tbody.appendChild(row); - table.appendChild(tbody); - div.appendChild(table); - - var current = left; - var count = 0; - - var addOption = mxUtils.bind(this, function(label, key, defaultValue) - { - var opt = this.createCellOption(label, key, defaultValue); - opt.style.width = '100%'; - current.appendChild(opt); - current = (current == left) ? right : left; - count++; - }); - - var listener = mxUtils.bind(this, function(sender, evt, force) - { - ss = this.format.getSelectionState(); - - left.innerHTML = ''; - right.innerHTML = ''; - current = left; - - if (ss.rounded) - { - addOption(mxResources.get('rounded'), mxConstants.STYLE_ROUNDED, 0); - } - - if (ss.style.shape == 'swimlane') - { - addOption(mxResources.get('divider'), 'swimlaneLine', 1); - } - - if (!ss.containsImage) - { - addOption(mxResources.get('shadow'), mxConstants.STYLE_SHADOW, 0); - } - - if (ss.glass) - { - addOption(mxResources.get('glass'), mxConstants.STYLE_GLASS, 0); - } - - if (ss.comic) - { - addOption(mxResources.get('comic'), 'comic', 0); - } - - if (count == 0) - { - div.style.display = 'none'; - } - }); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - - return div; -} - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.addStyleOps = function(div) -{ - div.style.paddingTop = '10px'; - div.style.paddingBottom = '10px'; - - var btn = mxUtils.button(mxResources.get('setAsDefaultStyle'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('setAsDefaultStyle').funct(); - })); - - btn.setAttribute('title', mxResources.get('setAsDefaultStyle') + ' (' + this.editorUi.actions.get('setAsDefaultStyle').shortcut + ')'); - btn.style.width = '202px'; - div.appendChild(btn); - - return div; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel = function(format, editorUi, container) -{ - BaseFormatPanel.call(this, format, editorUi, container); - this.init(); -}; - -mxUtils.extend(DiagramFormatPanel, BaseFormatPanel); - -/** - * Switch to disable page view. - */ -DiagramFormatPanel.showPageView = true; - -/** - * Specifies if the background image option should be shown. Default is true. - */ -DiagramFormatPanel.prototype.showBackgroundImageOption = true; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel.prototype.init = function() -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - this.container.appendChild(this.addView(this.createPanel())); - - if (graph.isEnabled()) - { - this.container.appendChild(this.addOptions(this.createPanel())); - this.container.appendChild(this.addPaperSize(this.createPanel())); - this.container.appendChild(this.addStyleOps(this.createPanel())); - } -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel.prototype.addView = function(div) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - div.appendChild(this.createTitle(mxResources.get('view'))); - - // Grid - this.addGridOption(div); - - if (graph.isEnabled()) - { - // Page View - if (DiagramFormatPanel.showPageView) - { - div.appendChild(this.createOption(mxResources.get('pageView'), function() - { - return graph.pageVisible; - }, function(checked) - { - ui.actions.get('pageView').funct(); - }, - { - install: function(apply) - { - this.listener = function() - { - apply(graph.pageVisible); - }; - - ui.addListener('pageViewChanged', this.listener); - }, - destroy: function() - { - ui.removeListener(this.listener); - } - })); - } - - // Background - var bg = this.createColorOption(mxResources.get('background'), function() - { - return graph.background; - }, function(color) - { - var change = new ChangePageSetup(ui, color); - change.ignoreImage = true; - - graph.model.execute(change); - }, '#ffffff', - { - install: function(apply) - { - this.listener = function() - { - apply(graph.background); - }; - - ui.addListener('backgroundColorChanged', this.listener); - }, - destroy: function() - { - ui.removeListener(this.listener); - } - }); - - if (this.showBackgroundImageOption) - { - var btn = mxUtils.button(mxResources.get('image'), function(evt) - { - ui.showBackgroundImageDialog(); - mxEvent.consume(evt); - }) - - btn.style.position = 'absolute'; - btn.className = 'geColorBtn'; - btn.style.marginTop = '-4px'; - btn.style.paddingBottom = (document.documentMode == 11 || mxClient.IS_MT) ? '0px' : '2px'; - btn.style.height = '22px'; - btn.style.right = (mxClient.IS_QUIRKS) ? '52px' : '72px'; - btn.style.width = '56px'; - - bg.appendChild(btn); - } - - div.appendChild(bg); - } - - return div; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel.prototype.addOptions = function(div) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - div.appendChild(this.createTitle(mxResources.get('options'))); - - if (graph.isEnabled()) - { - // Connection arrows - div.appendChild(this.createOption(mxResources.get('connectionArrows'), function() - { - return graph.connectionArrowsEnabled; - }, function(checked) - { - ui.actions.get('connectionArrows').funct(); - }, - { - install: function(apply) - { - this.listener = function() - { - apply(graph.connectionArrowsEnabled); - }; - - ui.addListener('connectionArrowsChanged', this.listener); - }, - destroy: function() - { - ui.removeListener(this.listener); - } - })); - - // Connection points - div.appendChild(this.createOption(mxResources.get('connectionPoints'), function() - { - return graph.connectionHandler.isEnabled(); - }, function(checked) - { - ui.actions.get('connectionPoints').funct(); - }, - { - install: function(apply) - { - this.listener = function() - { - apply(graph.connectionHandler.isEnabled()); - }; - - ui.addListener('connectionPointsChanged', this.listener); - }, - destroy: function() - { - ui.removeListener(this.listener); - } - })); - - // Guides - div.appendChild(this.createOption(mxResources.get('guides'), function() - { - return graph.graphHandler.guidesEnabled; - }, function(checked) - { - ui.actions.get('guides').funct(); - }, - { - install: function(apply) - { - this.listener = function() - { - apply(graph.graphHandler.guidesEnabled); - }; - - ui.addListener('guidesEnabledChanged', this.listener); - }, - destroy: function() - { - ui.removeListener(this.listener); - } - })); - } - - return div; -}; - -/** - * - */ -DiagramFormatPanel.prototype.addGridOption = function(container) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - - var input = document.createElement('input'); - input.style.position = 'absolute'; - input.style.textAlign = 'right'; - input.style.width = '38px'; - input.value = graph.getGridSize() + ' pt'; - - var stepper = this.createStepper(input, update); - input.style.display = (graph.isGridEnabled()) ? '' : 'none'; - stepper.style.display = input.style.display; - - mxEvent.addListener(input, 'keydown', function(e) - { - if (e.keyCode == 13) - { - graph.container.focus(); - mxEvent.consume(e); - } - else if (e.keyCode == 27) - { - input.value = graph.getGridSize(); - graph.container.focus(); - mxEvent.consume(e); - } - }); - - function update(evt) - { - var value = parseInt(input.value); - value = Math.max(1, (isNaN(value)) ? 10 : value); - - if (value != graph.getGridSize()) - { - graph.setGridSize(value) - } - - input.value = value + ' pt'; - mxEvent.consume(evt); - }; - - mxEvent.addListener(input, 'blur', update); - mxEvent.addListener(input, 'change', update); - - if (mxClient.IS_SVG) - { - input.style.marginTop = '-2px'; - input.style.right = '84px'; - stepper.style.marginTop = '-16px'; - stepper.style.right = '72px'; - - var panel = this.createColorOption(mxResources.get('grid'), function() - { - var color = graph.view.gridColor; - - return (graph.isGridEnabled()) ? color : null; - }, function(color) - { - if (color == mxConstants.NONE) - { - graph.setGridEnabled(false); - } - else - { - graph.setGridEnabled(true); - ui.setGridColor(color); - } - - input.style.display = (graph.isGridEnabled()) ? '' : 'none'; - stepper.style.display = input.style.display; - ui.fireEvent(new mxEventObject('gridEnabledChanged')); - }, '#e0e0e0', - { - install: function(apply) - { - this.listener = function() - { - apply((graph.isGridEnabled()) ? graph.view.gridColor : null); - }; - - ui.addListener('gridColorChanged', this.listener); - ui.addListener('gridEnabledChanged', this.listener); - }, - destroy: function() - { - ui.removeListener(this.listener); - } - }); - - panel.appendChild(input); - panel.appendChild(stepper); - container.appendChild(panel); - } - else - { - input.style.marginTop = '2px'; - input.style.right = '32px'; - stepper.style.marginTop = '2px'; - stepper.style.right = '20px'; - - container.appendChild(input); - container.appendChild(stepper); - - container.appendChild(this.createOption(mxResources.get('grid'), function() - { - return graph.isGridEnabled(); - }, function(checked) - { - graph.setGridEnabled(checked); - - if (graph.isGridEnabled()) - { - graph.view.gridColor = '#e0e0e0'; - } - - ui.fireEvent(new mxEventObject('gridEnabledChanged')); - }, - { - install: function(apply) - { - this.listener = function() - { - input.style.display = (graph.isGridEnabled()) ? '' : 'none'; - stepper.style.display = input.style.display; - - apply(graph.isGridEnabled()); - }; - - ui.addListener('gridEnabledChanged', this.listener); - }, - destroy: function() - { - ui.removeListener(this.listener); - } - })); - } -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel.prototype.addDocumentProperties = function(div) -{ - // Hook for subclassers - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - div.appendChild(this.createTitle(mxResources.get('options'))); - - return div; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel.prototype.addPaperSize = function(div) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - div.appendChild(this.createTitle(mxResources.get('paperSize'))); - - var accessor = PageSetupDialog.addPageFormatPanel(div, 'formatpanel', graph.pageFormat, function(pageFormat) - { - if (graph.pageFormat == null || graph.pageFormat.width != pageFormat.width || - graph.pageFormat.height != pageFormat.height) - { - var change = new ChangePageSetup(ui, null, null, pageFormat); - change.ignoreColor = true; - change.ignoreImage = true; - - graph.model.execute(change); - } - }); - - this.addKeyHandler(accessor.widthInput, function() - { - accessor.set(graph.pageFormat); - }); - this.addKeyHandler(accessor.heightInput, function() - { - accessor.set(graph.pageFormat); - }); - - var listener = function() - { - accessor.set(graph.pageFormat); - }; - - ui.addListener('pageFormatChanged', listener); - this.listeners.push({destroy: function() { ui.removeListener(listener); }}); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - - return div; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel.prototype.addStyleOps = function(div) -{ - var btn = mxUtils.button(mxResources.get('editData'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('editData').funct(); - })); - - btn.setAttribute('title', mxResources.get('editData') + ' (' + this.editorUi.actions.get('editData').shortcut + ')'); - btn.style.width = '202px'; - btn.style.marginBottom = '2px'; - div.appendChild(btn); - - mxUtils.br(div); - - btn = mxUtils.button(mxResources.get('clearDefaultStyle'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('clearDefaultStyle').funct(); - })); - - btn.setAttribute('title', mxResources.get('clearDefaultStyle') + ' (' + this.editorUi.actions.get('clearDefaultStyle').shortcut + ')'); - btn.style.width = '202px'; - div.appendChild(btn); - - return div; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel.prototype.destroy = function() -{ - BaseFormatPanel.prototype.destroy.apply(this, arguments); - - if (this.gridEnabledListener) - { - this.editorUi.removeListener(this.gridEnabledListener); - this.gridEnabledListener = null; - } -}; diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Graph.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Graph.js deleted file mode 100644 index 33ddd57b..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Graph.js +++ /dev/null @@ -1,8344 +0,0 @@ -/** - * Copyright (c) 2006-2012, JGraph Ltd - */ -// Workaround for allowing target="_blank" in HTML sanitizer -// see https://code.google.com/p/google-caja/issues/detail?can=2&q=&colspec=ID%20Type%20Status%20Priority%20Owner%20Summary&groupby=&sort=&id=1296 -if (typeof html4 !== 'undefined') -{ - html4.ATTRIBS["a::target"] = 0; - html4.ATTRIBS["source::src"] = 0; - html4.ATTRIBS["video::src"] = 0; - // Would be nice for tooltips but probably a security risk... - //html4.ATTRIBS["video::autoplay"] = 0; - //html4.ATTRIBS["video::autobuffer"] = 0; -} - -/** - * Sets global constants. - */ -// Changes default colors -mxConstants.SHADOW_OPACITY = 0.25; -mxConstants.SHADOWCOLOR = '#000000'; -mxConstants.VML_SHADOWCOLOR = '#d0d0d0'; -mxGraph.prototype.pageBreakColor = '#c0c0c0'; -mxGraph.prototype.pageScale = 1; - -// Letter page format is default in US, Canada and Mexico -(function() -{ - try - { - if (navigator != null && navigator.language != null) - { - var lang = navigator.language.toLowerCase(); - mxGraph.prototype.pageFormat = (lang === 'en-us' || lang === 'en-ca' || lang === 'es-mx') ? - mxConstants.PAGE_FORMAT_LETTER_PORTRAIT : mxConstants.PAGE_FORMAT_A4_PORTRAIT; - } - } - catch (e) - { - // ignore - } -})(); - -// Matches label positions of mxGraph 1.x -mxText.prototype.baseSpacingTop = 5; -mxText.prototype.baseSpacingBottom = 1; - -// Keeps edges between relative child cells inside parent -mxGraphModel.prototype.ignoreRelativeEdgeParent = false; - -// Defines grid properties -mxGraphView.prototype.gridImage = (mxClient.IS_SVG) ? 'data:image/gif;base64,R0lGODlhCgAKAJEAAAAAAP///8zMzP///yH5BAEAAAMALAAAAAAKAAoAAAIJ1I6py+0Po2wFADs=' : - IMAGE_PATH + '/grid.gif'; -mxGraphView.prototype.gridSteps = 4; -mxGraphView.prototype.minGridSize = 4; - -// UrlParams is null in embed mode -mxGraphView.prototype.gridColor = '#e0e0e0'; - -// Alternative text for unsupported foreignObjects -mxSvgCanvas2D.prototype.foAltText = '[Not supported by viewer]'; - -/** - * Constructs a new graph instance. Note that the constructor does not take a - * container because the graph instance is needed for creating the UI, which - * in turn will create the container for the graph. Hence, the container is - * assigned later in EditorUi. - */ -/** - * Defines graph class. - */ -Graph = function(container, model, renderHint, stylesheet, themes) -{ - mxGraph.call(this, container, model, renderHint, stylesheet); - - this.themes = themes || this.defaultThemes; - this.currentEdgeStyle = mxUtils.clone(this.defaultEdgeStyle); - this.currentVertexStyle = mxUtils.clone(this.defaultVertexStyle); - - // Sets the base domain URL and domain path URL for relative links. - var b = this.baseUrl; - var p = b.indexOf('//'); - this.domainUrl = ''; - this.domainPathUrl = ''; - - if (p > 0) - { - var d = b.indexOf('/', p + 2); - - if (d > 0) - { - this.domainUrl = b.substring(0, d); - } - - d = b.lastIndexOf('/'); - - if (d > 0) - { - this.domainPathUrl = b.substring(0, d + 1); - } - } - - // Adds support for HTML labels via style. Note: Currently, only the Java - // backend supports HTML labels but CSS support is limited to the following: - // http://docs.oracle.com/javase/6/docs/api/index.html?javax/swing/text/html/CSS.html - // TODO: Wrap should not affect isHtmlLabel output (should be handled later) - this.isHtmlLabel = function(cell) - { - var state = this.view.getState(cell); - var style = (state != null) ? state.style : this.getCellStyle(cell); - - return style['html'] == '1' || style[mxConstants.STYLE_WHITE_SPACE] == 'wrap'; - }; - - // Implements a listener for hover and click handling on edges - if (this.edgeMode) - { - var start = { - point: null, - event: null, - state: null, - handle: null, - selected: false - }; - - // Uses this event to process mouseDown to check the selection state before it is changed - this.addListener(mxEvent.FIRE_MOUSE_EVENT, mxUtils.bind(this, function(sender, evt) - { - if (evt.getProperty('eventName') == 'mouseDown' && this.isEnabled()) - { - var me = evt.getProperty('event'); - - if (!mxEvent.isControlDown(me.getEvent()) && !mxEvent.isShiftDown(me.getEvent())) - { - var state = me.getState(); - - if (state != null) - { - // Checks if state was removed in call to stopEditing above - if (this.model.isEdge(state.cell)) - { - start.point = new mxPoint(me.getGraphX(), me.getGraphY()); - start.selected = this.isCellSelected(state.cell); - start.state = state; - start.event = me; - - if (state.text != null && state.text.boundingBox != null && - mxUtils.contains(state.text.boundingBox, me.getGraphX(), me.getGraphY())) - { - start.handle = mxEvent.LABEL_HANDLE; - } - else - { - var handler = this.selectionCellsHandler.getHandler(state.cell); - - if (handler != null && handler.bends != null && handler.bends.length > 0) - { - start.handle = handler.getHandleForEvent(me); - } - } - } - } - } - } - })); - - var mouseDown = null; - - this.addMouseListener( - { - mouseDown: function(sender, me) {}, - mouseMove: mxUtils.bind(this, function(sender, me) - { - // Checks if any other handler is active - var handlerMap = this.selectionCellsHandler.handlers.map; - - for (var key in handlerMap) - { - if (handlerMap[key].index != null) - { - return; - } - } - - if (this.isEnabled() && !this.panningHandler.isActive() && !mxEvent.isControlDown(me.getEvent()) && - !mxEvent.isShiftDown(me.getEvent()) && !mxEvent.isAltDown(me.getEvent())) - { - var tol = this.tolerance; - - if (start.point != null && start.state != null && start.event != null) - { - var state = start.state; - - if (Math.abs(start.point.x - me.getGraphX()) > tol || - Math.abs(start.point.y - me.getGraphY()) > tol) - { - // Lazy selection for edges inside groups - if (!this.isCellSelected(state.cell)) - { - this.setSelectionCell(state.cell); - } - - var handler = this.selectionCellsHandler.getHandler(state.cell); - - if (handler != null && handler.bends != null && handler.bends.length > 0) - { - var handle = handler.getHandleForEvent(start.event); - var edgeStyle = this.view.getEdgeStyle(state); - var entity = edgeStyle == mxEdgeStyle.EntityRelation; - - // Handles special case where label was clicked on unselected edge in which - // case the label will be moved regardless of the handle that is returned - if (!start.selected && start.handle == mxEvent.LABEL_HANDLE) - { - handle = start.handle; - } - - if (!entity || handle == 0 || handle == handler.bends.length - 1 || handle == mxEvent.LABEL_HANDLE) - { - // Source or target handle or connected for direct handle access or orthogonal line - // with just two points where the central handle is moved regardless of mouse position - if (handle == mxEvent.LABEL_HANDLE || handle == 0 || state.visibleSourceState != null || - handle == handler.bends.length - 1 || state.visibleTargetState != null) - { - if (!entity && handle != mxEvent.LABEL_HANDLE) - { - var pts = state.absolutePoints; - - // Default case where handles are at corner points handles - // drag of corner as drag of existing point - if (pts != null && ((edgeStyle == null && handle == null) || - edgeStyle == mxEdgeStyle.OrthConnector)) - { - // Does not use handles if they were not initially visible - handle = start.handle; - - if (handle == null) - { - var box = new mxRectangle(start.point.x, start.point.y); - box.grow(mxEdgeHandler.prototype.handleImage.width / 2); - - if (mxUtils.contains(box, pts[0].x, pts[0].y)) - { - // Moves source terminal handle - handle = 0; - } - else if (mxUtils.contains(box, pts[pts.length - 1].x, pts[pts.length - 1].y)) - { - // Moves target terminal handle - handle = handler.bends.length - 1; - } - else - { - // Checks if edge has no bends - var nobends = edgeStyle != null && (pts.length == 2 || (pts.length == 3 && - ((Math.round(pts[0].x - pts[1].x) == 0 && Math.round(pts[1].x - pts[2].x) == 0) || - (Math.round(pts[0].y - pts[1].y) == 0 && Math.round(pts[1].y - pts[2].y) == 0)))); - - if (nobends) - { - // Moves central handle for straight orthogonal edges - handle = 2; - } - else - { - // Finds and moves vertical or horizontal segment - handle = mxUtils.findNearestSegment(state, start.point.x, start.point.y); - - // Converts segment to virtual handle index - if (edgeStyle == null) - { - handle = mxEvent.VIRTUAL_HANDLE - handle; - } - // Maps segment to handle - else - { - handle += 1; - } - } - } - } - } - - // Creates a new waypoint and starts moving it - if (handle == null) - { - handle = mxEvent.VIRTUAL_HANDLE; - } - } - - handler.start(me.getGraphX(), me.getGraphX(), handle); - start.state = null; - start.event = null; - start.point = null; - start.handle = null; - start.selected = false; - me.consume(); - - // Removes preview rectangle in graph handler - this.graphHandler.reset(); - } - } - else if (entity && (state.visibleSourceState != null || state.visibleTargetState != null)) - { - // Disables moves on entity to make it consistent - this.graphHandler.reset(); - me.consume(); - } - } - } - } - else - { - // Updates cursor for unselected edges under the mouse - var state = me.getState(); - - if (state != null) - { - // Checks if state was removed in call to stopEditing above - if (this.model.isEdge(state.cell)) - { - var cursor = null; - var pts = state.absolutePoints; - - if (pts != null) - { - var box = new mxRectangle(me.getGraphX(), me.getGraphY()); - box.grow(mxEdgeHandler.prototype.handleImage.width / 2); - - if (state.text != null && state.text.boundingBox != null && - mxUtils.contains(state.text.boundingBox, me.getGraphX(), me.getGraphY())) - { - cursor = 'move'; - } - else if (mxUtils.contains(box, pts[0].x, pts[0].y) || - mxUtils.contains(box, pts[pts.length - 1].x, pts[pts.length - 1].y)) - { - cursor = 'pointer'; - } - else if (state.visibleSourceState != null || state.visibleTargetState != null) - { - // Moving is not allowed for entity relation but still indicate hover state - var tmp = this.view.getEdgeStyle(state); - cursor = 'crosshair'; - - if (tmp != mxEdgeStyle.EntityRelation && this.isOrthogonal(state)) - { - var idx = mxUtils.findNearestSegment(state, me.getGraphX(), me.getGraphY()); - - if (idx < pts.length - 1 && idx >= 0) - { - cursor = (Math.round(pts[idx].x - pts[idx + 1].x) == 0) ? - 'col-resize' : 'row-resize'; - } - } - } - } - - if (cursor != null) - { - state.setCursor(cursor); - } - } - } - } - } - }), - mouseUp: mxUtils.bind(this, function(sender, me) - { - start.state = null; - start.event = null; - start.point = null; - start.handle = null; - }) - }); - } - - // HTML entities are displayed as plain text in wrapped plain text labels - this.cellRenderer.getLabelValue = function(state) - { - var result = mxCellRenderer.prototype.getLabelValue.apply(this, arguments); - - if (state.view.graph.isHtmlLabel(state.cell)) - { - if (state.style['html'] != 1) - { - result = mxUtils.htmlEntities(result, false); - } - else - { - result = state.view.graph.sanitizeHtml(result); - } - } - - return result; - }; - - // All code below not available and not needed in embed mode - if (typeof mxVertexHandler !== 'undefined') - { - this.setConnectable(true); - this.setDropEnabled(true); - this.setPanning(true); - this.setTooltips(true); - this.setAllowLoops(true); - this.allowAutoPanning = true; - this.resetEdgesOnConnect = false; - this.constrainChildren = false; - this.constrainRelativeChildren = true; - - // Do not scroll after moving cells - this.graphHandler.scrollOnMove = false; - this.graphHandler.scaleGrid = true; - - // Disables cloning of connection sources by default - this.connectionHandler.setCreateTarget(false); - this.connectionHandler.insertBeforeSource = true; - - // Disables built-in connection starts - this.connectionHandler.isValidSource = function(cell, me) - { - return false; - }; - - // Sets the style to be used when an elbow edge is double clicked - this.alternateEdgeStyle = 'vertical'; - - if (stylesheet == null) - { - this.loadStylesheet(); - } - - // Adds page centers to the guides for moving cells - var graphHandlerGetGuideStates = this.graphHandler.getGuideStates; - this.graphHandler.getGuideStates = function() - { - var result = graphHandlerGetGuideStates.apply(this, arguments); - - // Create virtual cell state for page centers - if (this.graph.pageVisible) - { - var guides = []; - - var pf = this.graph.pageFormat; - var ps = this.graph.pageScale; - var pw = pf.width * ps; - var ph = pf.height * ps; - var t = this.graph.view.translate; - var s = this.graph.view.scale; - - var layout = this.graph.getPageLayout(); - - for (var i = 0; i < layout.width; i++) - { - guides.push(new mxRectangle(((layout.x + i) * pw + t.x) * s, - (layout.y * ph + t.y) * s, pw * s, ph * s)); - } - - for (var j = 0; j < layout.height; j++) - { - guides.push(new mxRectangle((layout.x * pw + t.x) * s, - ((layout.y + j) * ph + t.y) * s, pw * s, ph * s)); - } - - // Page center guides have predence over normal guides - result = guides.concat(result); - } - - return result; - }; - - // Overrides zIndex for dragElement - mxDragSource.prototype.dragElementZIndex = mxPopupMenu.prototype.zIndex; - - // Overrides color for virtual guides for page centers - mxGuide.prototype.getGuideColor = function(state, horizontal) - { - return (state.cell == null) ? '#ffa500' /* orange */ : mxConstants.GUIDE_COLOR; - }; - - // Changes color of move preview for black backgrounds - this.graphHandler.createPreviewShape = function(bounds) - { - this.previewColor = (this.graph.background == '#000000') ? '#ffffff' : mxGraphHandler.prototype.previewColor; - - return mxGraphHandler.prototype.createPreviewShape.apply(this, arguments); - }; - - // Handles parts of cells by checking if part=1 is in the style and returning the parent - // if the parent is not already in the list of cells. container style is used to disable - // step into swimlanes and dropTarget style is used to disable acting as a drop target. - // LATER: Handle recursive parts - this.graphHandler.getCells = function(initialCell) - { - var cells = mxGraphHandler.prototype.getCells.apply(this, arguments); - var newCells = []; - - for (var i = 0; i < cells.length; i++) - { - var state = this.graph.view.getState(cells[i]); - var style = (state != null) ? state.style : this.graph.getCellStyle(cells[i]); - - if (mxUtils.getValue(style, 'part', '0') == '1') - { - var parent = this.graph.model.getParent(cells[i]); - - if (this.graph.model.isVertex(parent) && mxUtils.indexOf(cells, parent) < 0) - { - newCells.push(parent); - } - } - else - { - newCells.push(cells[i]); - } - } - - return newCells; - }; - - // Handles parts of cells when cloning the source for new connections - this.connectionHandler.createTargetVertex = function(evt, source) - { - var state = this.graph.view.getState(source); - var style = (state != null) ? state.style : this.graph.getCellStyle(source); - - if (mxUtils.getValue(style, 'part', false)) - { - var parent = this.graph.model.getParent(source); - - if (this.graph.model.isVertex(parent)) - { - source = parent; - } - } - - return mxConnectionHandler.prototype.createTargetVertex.apply(this, arguments); - }; - - var rubberband = new mxRubberband(this); - - this.getRubberband = function() - { - return rubberband; - }; - - // Timer-based activation of outline connect in connection handler - var startTime = new Date().getTime(); - var timeOnTarget = 0; - - var connectionHandlerMouseMove = this.connectionHandler.mouseMove; - - this.connectionHandler.mouseMove = function() - { - var prev = this.currentState; - connectionHandlerMouseMove.apply(this, arguments); - - if (prev != this.currentState) - { - startTime = new Date().getTime(); - timeOnTarget = 0; - } - else - { - timeOnTarget = new Date().getTime() - startTime; - } - }; - - // Activates outline connect after 1500ms with touch event or if alt is pressed inside the shape - // outlineConnect=0 is a custom style that means do not connect to strokes inside the shape, - // or in other words, connect to the shape's perimeter if the highlight is under the mouse - // (the name is because the highlight, including all strokes, is called outline in the code) - var connectionHandleIsOutlineConnectEvent = this.connectionHandler.isOutlineConnectEvent; - - this.connectionHandler.isOutlineConnectEvent = function(me) - { - return (this.currentState != null && me.getState() == this.currentState && timeOnTarget > 2000) || - ((this.currentState == null || mxUtils.getValue(this.currentState.style, 'outlineConnect', '1') != '0') && - connectionHandleIsOutlineConnectEvent.apply(this, arguments)); - }; - - // Adds shift+click to toggle selection state - var isToggleEvent = this.isToggleEvent; - this.isToggleEvent = function(evt) - { - return isToggleEvent.apply(this, arguments) || mxEvent.isShiftDown(evt); - }; - - // Workaround for Firefox where first mouse down is received - // after tap and hold if scrollbars are visible, which means - // start rubberband immediately if no cell is under mouse. - var isForceRubberBandEvent = rubberband.isForceRubberbandEvent; - rubberband.isForceRubberbandEvent = function(me) - { - return isForceRubberBandEvent.apply(this, arguments) || - (mxUtils.hasScrollbars(this.graph.container) && mxClient.IS_FF && - mxClient.IS_WIN && me.getState() == null && mxEvent.isTouchEvent(me.getEvent())); - }; - - // Shows hand cursor while panning - var prevCursor = null; - - this.panningHandler.addListener(mxEvent.PAN_START, mxUtils.bind(this, function() - { - if (this.isEnabled()) - { - prevCursor = this.container.style.cursor; - this.container.style.cursor = 'move'; - } - })); - - this.panningHandler.addListener(mxEvent.PAN_END, mxUtils.bind(this, function() - { - if (this.isEnabled()) - { - this.container.style.cursor = prevCursor; - } - })); - - this.popupMenuHandler.autoExpand = true; - - this.popupMenuHandler.isSelectOnPopup = function(me) - { - return mxEvent.isMouseEvent(me.getEvent()); - }; - - // Handles links if graph is read-only or cell is locked - var click = this.click; - this.click = function(me) - { - var locked = me.state == null && me.sourceState != null && this.isCellLocked(me.sourceState.cell); - - if ((!this.isEnabled() || locked) && !me.isConsumed()) - { - var cell = (locked) ? me.sourceState.cell : me.getCell(); - - if (cell != null) - { - var link = this.getLinkForCell(cell); - - if (link != null) - { - if (this.isCustomLink(link)) - { - this.customLinkClicked(link); - } - else - { - this.openLink(link); - } - } - } - } - else - { - return click.apply(this, arguments); - } - }; - - // Redirects tooltips for locked cells - this.tooltipHandler.getStateForEvent = function(me) - { - return me.sourceState; - }; - - // Redirects cursor for locked cells - var getCursorForMouseEvent = this.getCursorForMouseEvent; - this.getCursorForMouseEvent = function(me) - { - var locked = me.state == null && me.sourceState != null && this.isCellLocked(me.sourceState.cell); - - return this.getCursorForCell((locked) ? me.sourceState.cell : me.getCell()); - }; - - // Shows pointer cursor for clickable cells with links - // ie. if the graph is disabled and cells cannot be selected - var getCursorForCell = this.getCursorForCell; - this.getCursorForCell = function(cell) - { - if (!this.isEnabled() || this.isCellLocked(cell)) - { - var link = this.getLinkForCell(cell); - - if (link != null) - { - return 'pointer'; - } - else if (this.isCellLocked(cell)) - { - return 'default'; - } - } - - return getCursorForCell.apply(this, arguments); - }; - - // Changes rubberband selection to be recursive - this.selectRegion = function(rect, evt) - { - var cells = this.getAllCells(rect.x, rect.y, rect.width, rect.height); - this.selectCellsForEvent(cells, evt); - - return cells; - }; - - // Recursive implementation for rubberband selection - this.getAllCells = function(x, y, width, height, parent, result) - { - result = (result != null) ? result : []; - - if (width > 0 || height > 0) - { - var model = this.getModel(); - var right = x + width; - var bottom = y + height; - - if (parent == null) - { - parent = this.getCurrentRoot(); - - if (parent == null) - { - parent = model.getRoot(); - } - } - - if (parent != null) - { - var childCount = model.getChildCount(parent); - - for (var i = 0; i < childCount; i++) - { - var cell = model.getChildAt(parent, i); - var state = this.view.getState(cell); - - if (state != null && this.isCellVisible(cell) && mxUtils.getValue(state.style, 'locked', '0') != '1') - { - var deg = mxUtils.getValue(state.style, mxConstants.STYLE_ROTATION) || 0; - var box = state; - - if (deg != 0) - { - box = mxUtils.getBoundingBox(box, deg); - } - - if ((model.isEdge(cell) || model.isVertex(cell)) && - box.x >= x && box.y + box.height <= bottom && - box.y >= y && box.x + box.width <= right) - { - result.push(cell); - } - - this.getAllCells(x, y, width, height, cell, result); - } - } - } - } - - return result; - }; - - // Never removes cells from parents that are being moved - var graphHandlerShouldRemoveCellsFromParent = this.graphHandler.shouldRemoveCellsFromParent; - this.graphHandler.shouldRemoveCellsFromParent = function(parent, cells, evt) - { - if (this.graph.isCellSelected(parent)) - { - return false; - } - - return graphHandlerShouldRemoveCellsFromParent.apply(this, arguments); - }; - - // Unlocks all cells - this.isCellLocked = function(cell) - { - var pState = this.view.getState(cell); - - while (pState != null) - { - if (mxUtils.getValue(pState.style, 'locked', '0') == '1') - { - return true; - } - - pState = this.view.getState(this.model.getParent(pState.cell)); - } - - return false; - }; - - var tapAndHoldSelection = null; - - // Uses this event to process mouseDown to check the selection state before it is changed - this.addListener(mxEvent.FIRE_MOUSE_EVENT, mxUtils.bind(this, function(sender, evt) - { - if (evt.getProperty('eventName') == 'mouseDown') - { - var me = evt.getProperty('event'); - var state = me.getState(); - - if (state != null && !this.isSelectionEmpty() && !this.isCellSelected(state.cell)) - { - tapAndHoldSelection = this.getSelectionCells(); - } - else - { - tapAndHoldSelection = null; - } - } - })); - - // Tap and hold on background starts rubberband for multiple selected - // cells the cell associated with the event is deselected - this.addListener(mxEvent.TAP_AND_HOLD, mxUtils.bind(this, function(sender, evt) - { - if (!mxEvent.isMultiTouchEvent(evt)) - { - var me = evt.getProperty('event'); - var cell = evt.getProperty('cell'); - - if (cell == null) - { - var pt = mxUtils.convertPoint(this.container, - mxEvent.getClientX(me), mxEvent.getClientY(me)); - rubberband.start(pt.x, pt.y); - } - else if (tapAndHoldSelection != null) - { - this.addSelectionCells(tapAndHoldSelection); - } - else if (this.getSelectionCount() > 1 && this.isCellSelected(cell)) - { - this.removeSelectionCell(cell); - } - - // Blocks further processing of the event - tapAndHoldSelection = null; - evt.consume(); - } - })); - - // On connect the target is selected and we clone the cell of the preview edge for insert - this.connectionHandler.selectCells = function(edge, target) - { - this.graph.setSelectionCell(target || edge); - }; - - // Shows connection points only if cell not selected - this.connectionHandler.constraintHandler.isStateIgnored = function(state, source) - { - return source && state.view.graph.isCellSelected(state.cell); - }; - - // Updates constraint handler if the selection changes - this.selectionModel.addListener(mxEvent.CHANGE, mxUtils.bind(this, function() - { - var ch = this.connectionHandler.constraintHandler; - - if (ch.currentFocus != null && ch.isStateIgnored(ch.currentFocus, true)) - { - ch.currentFocus = null; - ch.constraints = null; - ch.destroyIcons(); - } - - ch.destroyFocusHighlight(); - })); - - // Initializes touch interface - if (Graph.touchStyle) - { - this.initTouch(); - } - - /** - * Adds locking - */ - var graphUpdateMouseEvent = this.updateMouseEvent; - this.updateMouseEvent = function(me) - { - me = graphUpdateMouseEvent.apply(this, arguments); - - if (me.state != null && this.isCellLocked(me.getCell())) - { - me.state = null; - } - - return me; - }; - } - - //Create a unique offset object for each graph instance. - this.currentTranslate = new mxPoint(0, 0); -}; - -/** - * Specifies if the touch UI should be used (cannot detect touch in FF so always on for Windows/Linux) - */ -Graph.touchStyle = mxClient.IS_TOUCH || (mxClient.IS_FF && mxClient.IS_WIN) || navigator.maxTouchPoints > 0 || - navigator.msMaxTouchPoints > 0 || window.urlParams == null || urlParams['touch'] == '1'; - -/** - * Shortcut for capability check. - */ -Graph.fileSupport = window.File != null && window.FileReader != null && window.FileList != null && - (window.urlParams == null || urlParams['filesupport'] != '0'); - -/** - * Default size for line jumps. - */ -Graph.lineJumpsEnabled = true; - -/** - * Default size for line jumps. - */ -Graph.defaultJumpSize = 6; - -/** - * Helper function (requires atob). - */ -Graph.createSvgImage = function(w, h, data) -{ - var tmp = unescape(encodeURIComponent( - '' + - '' + data + '')); - - return new mxImage('data:image/svg+xml;base64,' + ((window.btoa) ? btoa(tmp) : Base64.encode(tmp, true)), w, h) -}; - -/** - * Graph inherits from mxGraph. - */ -mxUtils.extend(Graph, mxGraph); - -/** - * Allows all values in fit. - */ -Graph.prototype.minFitScale = null; - -/** - * Allows all values in fit. - */ -Graph.prototype.maxFitScale = null; - -/** - * Sets the policy for links. Possible values are "self" to replace any framesets, - * "blank" to load the URL in and "auto" (default). - */ -Graph.prototype.linkPolicy = (urlParams['target'] == 'frame') ? 'blank' : (urlParams['target'] || 'auto'); - -/** - * Target for links that open in a new window. Default is _blank. - */ -Graph.prototype.linkTarget = (urlParams['target'] == 'frame') ? '_self' : '_blank'; - -/** - * Scrollbars are enabled on non-touch devices (not including Firefox because touch events - * cannot be detected in Firefox, see above). - */ -Graph.prototype.defaultScrollbars = !mxClient.IS_IOS; - -/** - * Specifies if the page should be visible for new files. Default is true. - */ -Graph.prototype.defaultPageVisible = true; - -/** - * Specifies if the app should run in chromeless mode. Default is false. - * This default is only used if the contructor argument is null. - */ -Graph.prototype.lightbox = false; - -/** - * - */ -Graph.prototype.defaultPageBackgroundColor = '#ffffff'; - -/** - * - */ -Graph.prototype.defaultPageBorderColor = '#ffffff'; - -/** - * - */ -Graph.prototype.defaultGraphBackground = '#ffffff'; - -/** - * Specifies the size of the size for "tiles" to be used for a graph with - * scrollbars but no visible background page. A good value is large - * enough to reduce the number of repaints that is caused for auto- - * translation, which depends on this value, and small enough to give - * a small empty buffer around the graph. Default is 400x400. - */ -Graph.prototype.scrollTileSize = new mxRectangle(0, 0, 400, 400); - -/** - * Overrides the background color and paints a transparent background. - */ -Graph.prototype.transparentBackground = true; - -/** - * Sets the default target for all links in cells. - */ -Graph.prototype.defaultEdgeLength = 80; - -/** - * Disables move of bends/segments without selecting. - */ -Graph.prototype.edgeMode = false; - -/** - * Allows all values in fit. - */ -Graph.prototype.connectionArrowsEnabled = true; - -/** - * Specifies the regular expression for matching placeholders. - */ -Graph.prototype.placeholderPattern = new RegExp('%(date\{.*\}|[^%^\{^\}]+)%', 'g'); - -/** - * Specifies the regular expression for matching placeholders. - */ -Graph.prototype.absoluteUrlPattern = new RegExp('^(?:[a-z]+:)?//', 'i'); - -/** - * Specifies the default name for the theme. Default is 'default'. - */ -Graph.prototype.defaultThemeName = 'default'; - -/** - * Specifies the default name for the theme. Default is 'default'. - */ -Graph.prototype.defaultThemes = {}; - -/** - * Base URL for relative links. - */ -Graph.prototype.baseUrl = (urlParams['base'] != null) ? - decodeURIComponent(urlParams['base']) : - (((window != window.top) ? document.referrer : - document.location.toString()).split('#')[0]); - -/** - * Specifies if the label should be edited after an insert. - */ -Graph.prototype.editAfterInsert = false; - -/** - * Installs child layout styles. - */ -Graph.prototype.init = function(container) -{ - mxGraph.prototype.init.apply(this, arguments); - - // Intercepts links with no target attribute and opens in new window - this.cellRenderer.initializeLabel = function(state, shape) - { - mxCellRenderer.prototype.initializeLabel.apply(this, arguments); - - // Checks tolerance for clicks on links - var tol = state.view.graph.tolerance; - var handleClick = true; - var first = null; - - var down = mxUtils.bind(this, function(evt) - { - handleClick = true; - first = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt)); - }); - - var move = mxUtils.bind(this, function(evt) - { - handleClick = handleClick && first != null && - Math.abs(first.x - mxEvent.getClientX(evt)) < tol && - Math.abs(first.y - mxEvent.getClientY(evt)) < tol; - }); - - var up = mxUtils.bind(this, function(evt) - { - if (handleClick) - { - var elt = mxEvent.getSource(evt) - - while (elt != null && elt != shape.node) - { - if (elt.nodeName.toLowerCase() == 'a') - { - state.view.graph.labelLinkClicked(state, elt, evt); - break; - } - - elt = elt.parentNode; - } - } - }); - - mxEvent.addGestureListeners(shape.node, down, move, up); - mxEvent.addListener(shape.node, 'click', function(evt) - { - mxEvent.consume(evt); - }); - }; - - this.initLayoutManager(); -}; - -/** - * Implements zoom and offset via CSS transforms. This is currently only used - * in read-only as there are fewer issues with the mxCellState not being scaled - * and translated. - * - * KNOWN ISSUES TO FIX: - * - Apply CSS transforms to HTML labels in IE11 - */ -(function() -{ - /** - * Uses CSS transforms for scale and translate. - */ - Graph.prototype.useCssTransforms = false; - - /** - * Contains the scale. - */ - Graph.prototype.currentScale = 1; - - /** - * Contains the offset. - */ - Graph.prototype.currentTranslate = new mxPoint(0, 0); - - /** - * Only foreignObject supported for now (no IE11). - */ - Graph.prototype.isCssTransformsSupported = function() - { - return this.dialect == mxConstants.DIALECT_SVG && !mxClient.NO_FO; - }; - - /** - * Function: getCellAt - * - * Needs to modify original method for recursive call. - */ - Graph.prototype.getCellAt = function(x, y, parent, vertices, edges, ignoreFn) - { - if (this.useCssTransforms) - { - x = x / this.currentScale - this.currentTranslate.x; - y = y / this.currentScale - this.currentTranslate.y; - } - - return this.getScaledCellAt.apply(this, arguments); - }; - - /** - * Function: getScaledCellAt - * - * Overridden for recursion. - */ - Graph.prototype.getScaledCellAt = function(x, y, parent, vertices, edges, ignoreFn) - { - vertices = (vertices != null) ? vertices : true; - edges = (edges != null) ? edges : true; - - if (parent == null) - { - parent = this.getCurrentRoot(); - - if (parent == null) - { - parent = this.getModel().getRoot(); - } - } - - if (parent != null) - { - var childCount = this.model.getChildCount(parent); - - for (var i = childCount - 1; i >= 0; i--) - { - var cell = this.model.getChildAt(parent, i); - var result = this.getScaledCellAt(x, y, cell, vertices, edges, ignoreFn); - - if (result != null) - { - return result; - } - else if (this.isCellVisible(cell) && (edges && this.model.isEdge(cell) || - vertices && this.model.isVertex(cell))) - { - var state = this.view.getState(cell); - - if (state != null && (ignoreFn == null || !ignoreFn(state, x, y)) && - this.intersects(state, x, y)) - { - return cell; - } - } - } - } - - return null; - }; - - - /** - * Function: repaint - * - * Updates the highlight after a change of the model or view. - */ - mxCellHighlight.prototype.getStrokeWidth = function(state) - { - var s = this.strokeWidth; - - if (this.graph.useCssTransforms) - { - s /= this.graph.currentScale; - } - - return s; - }; - - /** - * Function: getGraphBounds - * - * Overrides getGraphBounds to use bounding box from SVG. - */ - mxGraphView.prototype.getGraphBounds = function() - { - var b = this.graphBounds; - - if (this.graph.useCssTransforms) - { - var t = this.graph.currentTranslate; - var s = this.graph.currentScale; - - b = new mxRectangle( - (b.x + t.x) * s, (b.y + t.y) * s, - b.width * s, b.height * s); - } - - return b; - }; - - /** - * Function: viewStateChanged - * - * Overrides to bypass full cell tree validation. - * TODO: Check if this improves performance - */ - mxGraphView.prototype.viewStateChanged = function() - { - if (this.graph.useCssTransforms) - { - this.validate(); - this.graph.sizeDidChange(); - } - else - { - this.revalidate(); - this.graph.sizeDidChange(); - } - }; - - /** - * Function: validate - * - * Overrides validate to normalize validation view state and pass - * current state to CSS transform. - */ - var graphViewValidate = mxGraphView.prototype.validate; - - mxGraphView.prototype.validate = function(cell) - { - if (this.graph.useCssTransforms) - { - this.graph.currentScale = this.scale; - this.graph.currentTranslate.x = this.translate.x; - this.graph.currentTranslate.y = this.translate.y; - - this.scale = 1; - this.translate.x = 0; - this.translate.y = 0; - } - - graphViewValidate.apply(this, arguments); - - if (this.graph.useCssTransforms) - { - this.graph.updateCssTransform(); - - this.scale = this.graph.currentScale; - this.translate.x = this.graph.currentTranslate.x; - this.translate.y = this.graph.currentTranslate.y; - } - }; - - /** - * Function: updateCssTransform - * - * Zooms out of the graph by . - */ - Graph.prototype.updateCssTransform = function() - { - var temp = this.view.getDrawPane(); - - if (temp != null) - { - var g = this.view.getDrawPane().parentNode; - var prev = g.getAttribute('transform'); - g.setAttribute('transformOrigin', '0 0'); - g.setAttribute('transform', 'scale(' + this.currentScale + ',' + this.currentScale + ')' + - 'translate(' + this.currentTranslate.x + ',' + this.currentTranslate.y + ')'); - - // Applies workarounds only if translate has changed - if (prev != g.getAttribute('transform')) - { - try - { - // Applies transform to labels outside of the SVG DOM - // Excluded via isCssTransformsSupported -// if (mxClient.NO_FO) -// { -// var transform = 'scale(' + this.currentScale + ')' + 'translate(' + -// this.currentTranslate.x + 'px,' + this.currentTranslate.y + 'px)'; -// -// this.view.states.visit(mxUtils.bind(this, function(cell, state) -// { -// if (state.text != null && state.text.node != null) -// { -// // Stores initial CSS transform that is used for the label alignment -// if (state.text.originalTransform == null) -// { -// state.text.originalTransform = state.text.node.style.transform; -// } -// -// state.text.node.style.transform = transform + state.text.originalTransform; -// } -// })); -// } - // Workaround for https://bugs.webkit.org/show_bug.cgi?id=93358 in WebKit - // Adding an absolute position DIV before the SVG seems to mitigate the problem. - if (mxClient.IS_GC) - { - if (this.mathEnabled && (this.webKitForceRepaintNode == null || - this.webKitForceRepaintNode.parentNode == null) && - this.container.firstChild.nodeName == 'svg') - { - this.webKitForceRepaintNode = document.createElement('div'); - this.webKitForceRepaintNode.style.cssText = 'position:absolute;'; - g.ownerSVGElement.parentNode.insertBefore(this.webKitForceRepaintNode, g.ownerSVGElement); - } - else if (this.webKitForceRepaintNode != null && (!this.mathEnabled || - (this.container.firstChild.nodeName != 'svg' && - this.container.firstChild != this.webKitForceRepaintNode))) - { - if (this.webKitForceRepaintNode.parentNode != null) - { - this.webKitForceRepaintNode.parentNode.removeChild(this.webKitForceRepaintNode); - } - - this.webKitForceRepaintNode = null; - } - } - // Workaround for https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/4320441/ - else if (mxClient.IS_EDGE) - { - // Recommended workaround is to do this on all - // foreignObjects, but this seems to be faster - var val = g.style.display; - g.style.display = 'none'; - g.getBBox(); - g.style.display = val; - } - } - catch (e) - { - // ignore - console.log('err', e); - } - } - } - }; - - var graphViewValidateBackgroundPage = mxGraphView.prototype.validateBackgroundPage; - - mxGraphView.prototype.validateBackgroundPage = function() - { - var useCssTranforms = this.graph.useCssTransforms, scale = this.scale, - translate = this.translate; - - if (useCssTranforms) - { - this.scale = this.graph.currentScale; - this.translate = this.graph.currentTranslate; - } - - graphViewValidateBackgroundPage.apply(this, arguments); - - if (useCssTranforms) - { - this.scale = scale; - this.translate = translate; - } - }; - - var graphUpdatePageBreaks = mxGraph.prototype.updatePageBreaks; - - mxGraph.prototype.updatePageBreaks = function(visible, width, height) - { - var useCssTranforms = this.useCssTransforms, scale = this.view.scale, - translate = this.view.translate; - - if (useCssTranforms) - { - this.view.scale = 1; - this.view.translate = new mxPoint(0, 0); - this.useCssTransforms = false; - } - - graphUpdatePageBreaks.apply(this, arguments); - - if (useCssTranforms) - { - this.view.scale = scale; - this.view.translate = translate; - this.useCssTransforms = true; - } - }; - -})(); - -/** - * Sets the XML node for the current diagram. - */ -Graph.prototype.isLightboxView = function() -{ - return this.lightbox; -}; - -/** - * Installs automatic layout via styles - */ -Graph.prototype.labelLinkClicked = function(state, elt, evt) -{ - var href = elt.getAttribute('href'); - - if (href != null && !this.isCustomLink(href) && (mxEvent.isLeftMouseButton(evt) && - !mxEvent.isPopupTrigger(evt)) || mxEvent.isTouchEvent(evt)) - { - if (!this.isEnabled() || this.isCellLocked(state.cell)) - { - var target = this.isBlankLink(href) ? this.linkTarget : '_top'; - this.openLink(this.getAbsoluteUrl(href), target); - } - - mxEvent.consume(evt); - } -}; - -/** - * Returns the size of the page format scaled with the page size. - */ -Graph.prototype.openLink = function(href, target) -{ - var result = window; - - // Workaround for blocking in same iframe - if (target == '_self' && window != window.top) - { - window.location.href = href; - } - else - { - // Avoids page reload for anchors (workaround for IE but used everywhere) - if (href.substring(0, this.baseUrl.length) == this.baseUrl && - href.charAt(this.baseUrl.length) == '#' && - target == '_top' && window == window.top) - { - var hash = href.split('#')[1]; - - // Forces navigation if on same hash - if (window.location.hash == '#' + hash) - { - window.location.hash = ''; - } - - window.location.hash = hash; - } - else - { - result = window.open(href, target); - } - } - - return result; -}; - -/** - * Adds support for page links. - */ -Graph.prototype.getLinkTitle = function(href) -{ - return href.substring(href.lastIndexOf('/') + 1); -}; - -/** - * Adds support for page links. - */ -Graph.prototype.isCustomLink = function(href) -{ - return href.substring(0, 5) == 'data:'; -}; - -/** - * Adds support for page links. - */ -Graph.prototype.customLinkClicked = function(link) -{ - console.log('customLinkClicked not implemented'); - // Hook for subclassers -}; - -/** - * Returns true if the fiven href references an external protocol that - * should never open in a new window. Default returns true for mailto. - */ -Graph.prototype.isExternalProtocol = function(href) -{ - return href.substring(0, 7) === 'mailto:'; -}; - -/** - * Hook for links to open in same window. Default returns true for anchors, - * links to same domain or if target == 'self' in the config. - */ -Graph.prototype.isBlankLink = function(href) -{ - return !this.isExternalProtocol(href) && - (this.linkPolicy === 'blank' || - (this.linkPolicy !== 'self' && - !this.isRelativeUrl(href) && - href.substring(0, this.domainUrl.length) !== this.domainUrl)); -}; - -/** - * - */ -Graph.prototype.isRelativeUrl = function(url) -{ - return url != null && !this.absoluteUrlPattern.test(url) && - url.substring(0, 5) !== 'data:' && - !this.isExternalProtocol(url); -}; - -/** - * Installs automatic layout via styles - */ -Graph.prototype.initLayoutManager = function() -{ - this.layoutManager = new mxLayoutManager(this); - - this.layoutManager.getLayout = function(cell) - { - var state = this.graph.view.getState(cell); - var style = (state != null) ? state.style : this.graph.getCellStyle(cell); - - if (style['childLayout'] == 'stackLayout') - { - var stackLayout = new mxStackLayout(this.graph, true); - stackLayout.resizeParentMax = mxUtils.getValue(style, 'resizeParentMax', '1') == '1'; - stackLayout.horizontal = mxUtils.getValue(style, 'horizontalStack', '1') == '1'; - stackLayout.resizeParent = mxUtils.getValue(style, 'resizeParent', '1') == '1'; - stackLayout.resizeLast = mxUtils.getValue(style, 'resizeLast', '0') == '1'; - stackLayout.spacing = style['stackSpacing'] || stackLayout.spacing; - stackLayout.border = style['stackBorder'] || stackLayout.border; - stackLayout.marginLeft = style['marginLeft'] || 0; - stackLayout.marginRight = style['marginRight'] || 0; - stackLayout.marginTop = style['marginTop'] || 0; - stackLayout.marginBottom = style['marginBottom'] || 0; - stackLayout.fill = true; - - return stackLayout; - } - else if (style['childLayout'] == 'treeLayout') - { - var treeLayout = new mxCompactTreeLayout(this.graph); - treeLayout.horizontal = mxUtils.getValue(style, 'horizontalTree', '1') == '1'; - treeLayout.resizeParent = mxUtils.getValue(style, 'resizeParent', '1') == '1'; - treeLayout.groupPadding = mxUtils.getValue(style, 'parentPadding', 20); - treeLayout.levelDistance = mxUtils.getValue(style, 'treeLevelDistance', 30); - treeLayout.maintainParentLocation = true; - treeLayout.edgeRouting = false; - treeLayout.resetEdges = false; - - return treeLayout; - } - else if (style['childLayout'] == 'flowLayout') - { - var flowLayout = new mxHierarchicalLayout(this.graph, mxUtils.getValue(style, - 'flowOrientation', mxConstants.DIRECTION_EAST)); - flowLayout.resizeParent = mxUtils.getValue(style, 'resizeParent', '1') == '1'; - flowLayout.parentBorder = mxUtils.getValue(style, 'parentPadding', 20); - flowLayout.maintainParentLocation = true; - - // Special undocumented styles for changing the hierarchical - flowLayout.intraCellSpacing = mxUtils.getValue(style, 'intraCellSpacing', mxHierarchicalLayout.prototype.intraCellSpacing); - flowLayout.interRankCellSpacing = mxUtils.getValue(style, 'interRankCellSpacing', mxHierarchicalLayout.prototype.interRankCellSpacing); - flowLayout.interHierarchySpacing = mxUtils.getValue(style, 'interHierarchySpacing', mxHierarchicalLayout.prototype.interHierarchySpacing); - flowLayout.parallelEdgeSpacing = mxUtils.getValue(style, 'parallelEdgeSpacing', mxHierarchicalLayout.prototype.parallelEdgeSpacing); - - return flowLayout; - } - - return null; - }; -}; - - /** - * Returns the size of the page format scaled with the page size. - */ -Graph.prototype.getPageSize = function() -{ - return (this.pageVisible) ? new mxRectangle(0, 0, this.pageFormat.width * this.pageScale, - this.pageFormat.height * this.pageScale) : this.scrollTileSize; -}; - -/** - * Returns a rectangle describing the position and count of the - * background pages, where x and y are the position of the top, - * left page and width and height are the vertical and horizontal - * page count. - */ -Graph.prototype.getPageLayout = function() -{ - var size = this.getPageSize(); - var bounds = this.getGraphBounds(); - - if (bounds.width == 0 || bounds.height == 0) - { - return new mxRectangle(0, 0, 1, 1); - } - else - { - // Computes untransformed graph bounds - var x = Math.ceil(bounds.x / this.view.scale - this.view.translate.x); - var y = Math.ceil(bounds.y / this.view.scale - this.view.translate.y); - var w = Math.floor(bounds.width / this.view.scale); - var h = Math.floor(bounds.height / this.view.scale); - - var x0 = Math.floor(x / size.width); - var y0 = Math.floor(y / size.height); - var w0 = Math.ceil((x + w) / size.width) - x0; - var h0 = Math.ceil((y + h) / size.height) - y0; - - return new mxRectangle(x0, y0, w0, h0); - } -}; - -/** - * Sanitizes the given HTML markup. - */ -Graph.prototype.sanitizeHtml = function(value, editing) -{ - // Uses https://code.google.com/p/google-caja/wiki/JsHtmlSanitizer - // NOTE: Original minimized sanitizer was modified to support - // data URIs for images, mailto and special data:-links. - // LATER: Add MathML to whitelisted tags - function urlX(link) - { - if (link != null && link.toString().toLowerCase().substring(0, 11) !== 'javascript:') - { - return link; - } - - return null; - }; - function idX(id) { return id }; - - return html_sanitize(value, urlX, idX); -}; - -/** - * Revalidates all cells with placeholders in the current graph model. - */ -Graph.prototype.updatePlaceholders = function() -{ - var model = this.model; - var validate = false; - - for (var key in this.model.cells) - { - var cell = this.model.cells[key]; - - if (this.isReplacePlaceholders(cell)) - { - this.view.invalidate(cell, false, false); - validate = true; - } - } - - if (validate) - { - this.view.validate(); - } -}; - -/** - * Adds support for placeholders in labels. - */ -Graph.prototype.isReplacePlaceholders = function(cell) -{ - return cell.value != null && typeof(cell.value) == 'object' && - cell.value.getAttribute('placeholders') == '1'; -}; - -/** - * Returns true if the given mouse wheel event should be used for zooming. This - * is invoked if no dialogs are showing and returns true with Alt or Control - * (except macOS) is pressed. - */ -Graph.prototype.isZoomWheelEvent = function(evt) -{ - return mxEvent.isAltDown(evt) || (mxEvent.isMetaDown(evt) && mxClient.IS_MAC) || - (mxEvent.isControlDown(evt) && !mxClient.IS_MAC); -}; - -/** - * Adds Alt+click to select cells behind cells. - */ -Graph.prototype.isTransparentClickEvent = function(evt) -{ - return mxEvent.isAltDown(evt); -}; - -/** - * Adds ctrl+shift+connect to disable connections. - */ -Graph.prototype.isIgnoreTerminalEvent = function(evt) -{ - return mxEvent.isShiftDown(evt) && mxEvent.isControlDown(evt); -}; - -/** - * Adds support for placeholders in labels. - */ -Graph.prototype.isSplitTarget = function(target, cells, evt) -{ - return !this.model.isEdge(cells[0]) && - !mxEvent.isAltDown(evt) && !mxEvent.isShiftDown(evt) && - mxGraph.prototype.isSplitTarget.apply(this, arguments); -}; - -/** - * Adds support for placeholders in labels. - */ -Graph.prototype.getLabel = function(cell) -{ - var result = mxGraph.prototype.getLabel.apply(this, arguments); - - if (result != null && this.isReplacePlaceholders(cell) && cell.getAttribute('placeholder') == null) - { - result = this.replacePlaceholders(cell, result); - } - - return result; -}; - -/** - * Adds labelMovable style. - */ -Graph.prototype.isLabelMovable = function(cell) -{ - var state = this.view.getState(cell); - var style = (state != null) ? state.style : this.getCellStyle(cell); - - return !this.isCellLocked(cell) && - ((this.model.isEdge(cell) && this.edgeLabelsMovable) || - (this.model.isVertex(cell) && (this.vertexLabelsMovable || - mxUtils.getValue(style, 'labelMovable', '0') == '1'))); -}; - -/** - * Adds event if grid size is changed. - */ -Graph.prototype.setGridSize = function(value) -{ - this.gridSize = value; - this.fireEvent(new mxEventObject('gridSizeChanged')); -}; - -/** - * Private helper method. - */ -Graph.prototype.getGlobalVariable = function(name) -{ - var val = null; - - if (name == 'date') - { - val = new Date().toLocaleDateString(); - } - else if (name == 'time') - { - val = new Date().toLocaleTimeString(); - } - else if (name == 'timestamp') - { - val = new Date().toLocaleString(); - } - else if (name.substring(0, 5) == 'date{') - { - var fmt = name.substring(5, name.length - 1); - val = this.formatDate(new Date(), fmt); - } - - return val; -}; - -/** - * Formats a date, see http://blog.stevenlevithan.com/archives/date-time-format - */ -Graph.prototype.formatDate = function(date, mask, utc) -{ - // LATER: Cache regexs - if (this.dateFormatCache == null) - { - this.dateFormatCache = { - i18n: { - dayNames: [ - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", - "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" - ], - monthNames: [ - "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", - "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" - ] - }, - - masks: { - "default": "ddd mmm dd yyyy HH:MM:ss", - shortDate: "m/d/yy", - mediumDate: "mmm d, yyyy", - longDate: "mmmm d, yyyy", - fullDate: "dddd, mmmm d, yyyy", - shortTime: "h:MM TT", - mediumTime: "h:MM:ss TT", - longTime: "h:MM:ss TT Z", - isoDate: "yyyy-mm-dd", - isoTime: "HH:MM:ss", - isoDateTime: "yyyy-mm-dd'T'HH:MM:ss", - isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'" - } - }; - } - - var dF = this.dateFormatCache; - var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g, - timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g, - timezoneClip = /[^-+\dA-Z]/g, - pad = function (val, len) { - val = String(val); - len = len || 2; - while (val.length < len) val = "0" + val; - return val; - }; - - // You can't provide utc if you skip other args (use the "UTC:" mask prefix) - if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) { - mask = date; - date = undefined; - } - - // Passing date through Date applies Date.parse, if necessary - date = date ? new Date(date) : new Date; - if (isNaN(date)) throw SyntaxError("invalid date"); - - mask = String(dF.masks[mask] || mask || dF.masks["default"]); - - // Allow setting the utc argument via the mask - if (mask.slice(0, 4) == "UTC:") { - mask = mask.slice(4); - utc = true; - } - - var _ = utc ? "getUTC" : "get", - d = date[_ + "Date"](), - D = date[_ + "Day"](), - m = date[_ + "Month"](), - y = date[_ + "FullYear"](), - H = date[_ + "Hours"](), - M = date[_ + "Minutes"](), - s = date[_ + "Seconds"](), - L = date[_ + "Milliseconds"](), - o = utc ? 0 : date.getTimezoneOffset(), - flags = { - d: d, - dd: pad(d), - ddd: dF.i18n.dayNames[D], - dddd: dF.i18n.dayNames[D + 7], - m: m + 1, - mm: pad(m + 1), - mmm: dF.i18n.monthNames[m], - mmmm: dF.i18n.monthNames[m + 12], - yy: String(y).slice(2), - yyyy: y, - h: H % 12 || 12, - hh: pad(H % 12 || 12), - H: H, - HH: pad(H), - M: M, - MM: pad(M), - s: s, - ss: pad(s), - l: pad(L, 3), - L: pad(L > 99 ? Math.round(L / 10) : L), - t: H < 12 ? "a" : "p", - tt: H < 12 ? "am" : "pm", - T: H < 12 ? "A" : "P", - TT: H < 12 ? "AM" : "PM", - Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""), - o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4), - S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10] - }; - - return mask.replace(token, function ($0) - { - return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1); - }); -}; - -/** - * - */ -Graph.prototype.createLayersDialog = function() -{ - var div = document.createElement('div'); - div.style.position = 'absolute'; - - var model = this.getModel(); - var childCount = model.getChildCount(model.root); - - for (var i = 0; i < childCount; i++) - { - (mxUtils.bind(this, function(layer) - { - var span = document.createElement('div'); - span.style.overflow = 'hidden'; - span.style.textOverflow = 'ellipsis'; - span.style.padding = '2px'; - span.style.whiteSpace = 'nowrap'; - - var cb = document.createElement('input'); - cb.style.display = 'inline-block'; - cb.setAttribute('type', 'checkbox'); - - if (model.isVisible(layer)) - { - cb.setAttribute('checked', 'checked'); - cb.defaultChecked = true; - } - - span.appendChild(cb); - - var title = this.convertValueToString(layer) || (mxResources.get('background') || 'Background'); - span.setAttribute('title', title); - mxUtils.write(span, title); - div.appendChild(span); - - mxEvent.addListener(cb, 'click', function() - { - if (cb.getAttribute('checked') != null) - { - cb.removeAttribute('checked'); - } - else - { - cb.setAttribute('checked', 'checked'); - } - - model.setVisible(layer, cb.checked); - }); - })(model.getChildAt(model.root, i))); - } - - return div; -}; - -/** - * Private helper method. - */ -Graph.prototype.replacePlaceholders = function(cell, str) -{ - var result = []; - - if (str != null) - { - var last = 0; - var math = []; - - while (match = this.placeholderPattern.exec(str)) - { - var val = match[0]; - - if (val.length > 2 && val != '%label%' && val != '%tooltip%') - { - var tmp = null; - - if (match.index > last && str.charAt(match.index - 1) == '%') - { - tmp = val.substring(1); - } - else - { - var name = val.substring(1, val.length - 1); - - // Workaround for invalid char for getting attribute in older versions of IE - if (name.indexOf('{') < 0) - { - var current = cell; - - while (tmp == null && current != null) - { - if (current.value != null && typeof(current.value) == 'object') - { - tmp = (current.hasAttribute(name)) ? ((current.getAttribute(name) != null) ? - current.getAttribute(name) : '') : null; - } - - current = this.model.getParent(current); - } - } - - if (tmp == null) - { - tmp = this.getGlobalVariable(name); - } - } - - result.push(str.substring(last, match.index) + ((tmp != null) ? tmp : val)); - last = match.index + val.length; - } - } - - result.push(str.substring(last)); - } - - return result.join(''); -}; - -/** - * Selects cells for connect vertex return value. - */ -Graph.prototype.selectCellsForConnectVertex = function(cells, evt, hoverIcons) -{ - // Selects only target vertex if one exists - if (cells.length == 2 && this.model.isVertex(cells[1])) - { - this.setSelectionCell(cells[1]); - - if (hoverIcons != null) - { - // Adds hover icons to new target vertex for touch devices - if (mxEvent.isTouchEvent(evt)) - { - hoverIcons.update(hoverIcons.getState(this.view.getState(cells[1]))); - } - else - { - // Hides hover icons after click with mouse - hoverIcons.reset(); - } - } - - this.scrollCellToVisible(cells[1]); - } - else - { - this.setSelectionCells(cells); - } -}; - -/** - * Adds a connection to the given vertex. - */ -Graph.prototype.connectVertex = function(source, direction, length, evt, forceClone, ignoreCellAt) -{ - ignoreCellAt = (ignoreCellAt) ? ignoreCellAt : false; - - var pt = (source.geometry.relative && source.parent.geometry != null) ? - new mxPoint(source.parent.geometry.width * source.geometry.x, source.parent.geometry.height * source.geometry.y) : - new mxPoint(source.geometry.x, source.geometry.y); - - if (direction == mxConstants.DIRECTION_NORTH) - { - pt.x += source.geometry.width / 2; - pt.y -= length ; - } - else if (direction == mxConstants.DIRECTION_SOUTH) - { - pt.x += source.geometry.width / 2; - pt.y += source.geometry.height + length; - } - else if (direction == mxConstants.DIRECTION_WEST) - { - pt.x -= length; - pt.y += source.geometry.height / 2; - } - else - { - pt.x += source.geometry.width + length; - pt.y += source.geometry.height / 2; - } - - var parentState = this.view.getState(this.model.getParent(source)); - var s = this.view.scale; - var t = this.view.translate; - var dx = t.x * s; - var dy = t.y * s; - - if (this.model.isVertex(parentState.cell)) - { - dx = parentState.x; - dy = parentState.y; - } - - // Workaround for relative child cells - if (this.model.isVertex(source.parent) && source.geometry.relative) - { - pt.x += source.parent.geometry.x; - pt.y += source.parent.geometry.y; - } - - // Checks actual end point of edge for target cell - var target = (ignoreCellAt || (mxEvent.isControlDown(evt) && !forceClone)) ? - null : this.getCellAt(dx + pt.x * s, dy + pt.y * s); - - if (this.model.isAncestor(target, source)) - { - target = null; - } - - // Checks if target or ancestor is locked - var temp = target; - - while (temp != null) - { - if (this.isCellLocked(temp)) - { - target = null; - break; - } - - temp = this.model.getParent(temp); - } - - // Checks if source and target intersect - if (target != null) - { - var sourceState = this.view.getState(source); - var targetState = this.view.getState(target); - - if (sourceState != null && targetState != null && mxUtils.intersects(sourceState, targetState)) - { - target = null; - } - } - - var duplicate = !mxEvent.isShiftDown(evt) || forceClone; - - if (duplicate) - { - if (direction == mxConstants.DIRECTION_NORTH) - { - pt.y -= source.geometry.height / 2; - } - else if (direction == mxConstants.DIRECTION_SOUTH) - { - pt.y += source.geometry.height / 2; - } - else if (direction == mxConstants.DIRECTION_WEST) - { - pt.x -= source.geometry.width / 2; - } - else - { - pt.x += source.geometry.width / 2; - } - } - - // Uses connectable parent vertex if one exists - if (target != null && !this.isCellConnectable(target)) - { - var parent = this.getModel().getParent(target); - - if (this.getModel().isVertex(parent) && this.isCellConnectable(parent)) - { - target = parent; - } - } - - if (target == source || this.model.isEdge(target) || !this.isCellConnectable(target)) - { - target = null; - } - - var result = []; - - this.model.beginUpdate(); - try - { - var realTarget = target; - - if (realTarget == null && duplicate) - { - // Handles relative children - var cellToClone = source; - var geo = this.getCellGeometry(source); - - while (geo != null && geo.relative) - { - cellToClone = this.getModel().getParent(cellToClone); - geo = this.getCellGeometry(cellToClone); - } - - // Handle consistuents for cloning - var state = this.view.getState(cellToClone); - var style = (state != null) ? state.style : this.getCellStyle(cellToClone); - - if (mxUtils.getValue(style, 'part', false)) - { - var tmpParent = this.model.getParent(cellToClone); - - if (this.model.isVertex(tmpParent)) - { - cellToClone = tmpParent; - } - } - - realTarget = this.duplicateCells([cellToClone], false)[0]; - - var geo = this.getCellGeometry(realTarget); - - if (geo != null) - { - geo.x = pt.x - geo.width / 2; - geo.y = pt.y - geo.height / 2; - } - } - - // Never connects children in stack layouts - var layout = null; - - if (this.layoutManager != null) - { - layout = this.layoutManager.getLayout(this.model.getParent(source)); - } - - var edge = ((mxEvent.isControlDown(evt) && duplicate) || (target == null && layout != null && layout.constructor == mxStackLayout)) ? null : - this.insertEdge(this.model.getParent(source), null, '', source, realTarget, this.createCurrentEdgeStyle()); - - // Inserts edge before source - if (edge != null && this.connectionHandler.insertBeforeSource) - { - var index = null; - var tmp = source; - - while (tmp.parent != null && tmp.geometry != null && - tmp.geometry.relative && tmp.parent != edge.parent) - { - tmp = this.model.getParent(tmp); - } - - if (tmp != null && tmp.parent != null && tmp.parent == edge.parent) - { - var index = tmp.parent.getIndex(tmp); - this.model.add(tmp.parent, edge, index); - } - } - - // Special case: Click on west icon puts clone before cell - if (target == null && realTarget != null && layout != null && source.parent != null && - layout.constructor == mxStackLayout && direction == mxConstants.DIRECTION_WEST) - { - var index = source.parent.getIndex(source); - this.model.add(source.parent, realTarget, index); - } - - if (edge != null) - { - // Uses elbow edges with vertical or horizontal direction -// var elbowValue = (direction == mxConstants.DIRECTION_NORTH || direction == mxConstants.DIRECTION_SOUTH) ? 'vertical' : 'horizontal'; -// edge.style = mxUtils.setStyle(edge.style, 'edgeStyle', 'elbowEdgeStyle'); -// edge.style = mxUtils.setStyle(edge.style, 'elbow', elbowValue); -// edge.style = mxUtils.setStyle(edge.style, 'sourcePortConstraint', direction); - result.push(edge); - } - - if (target == null && realTarget != null) - { - result.push(realTarget); - } - - if (realTarget == null && edge != null) - { - edge.geometry.setTerminalPoint(pt, false); - } - - if (edge != null) - { - this.fireEvent(new mxEventObject('cellsInserted', 'cells', [edge])); - } - } - finally - { - this.model.endUpdate(); - } - - return result; -}; - -/** - * Returns all labels in the diagram as a string. - */ -Graph.prototype.getIndexableText = function() -{ - var tmp = document.createElement('div'); - var labels = []; - var label = ''; - - for (var key in this.model.cells) - { - var cell = this.model.cells[key]; - - if (this.model.isVertex(cell) || this.model.isEdge(cell)) - { - if (this.isHtmlLabel(cell)) - { - tmp.innerHTML = this.getLabel(cell); - label = mxUtils.extractTextWithWhitespace([tmp]); - } - else - { - label = this.getLabel(cell); - } - - label = mxUtils.trim(label.replace(/[\x00-\x1F\x7F-\x9F]|\s+/g, ' ')); - - if (label.length > 0) - { - labels.push(label); - } - } - } - - return labels.join(' '); -}; - -/** - * Returns the label for the given cell. - */ -Graph.prototype.convertValueToString = function(cell) -{ - if (cell.value != null && typeof(cell.value) == 'object') - { - if (this.isReplacePlaceholders(cell) && cell.getAttribute('placeholder') != null) - { - var name = cell.getAttribute('placeholder'); - var current = cell; - var result = null; - - while (result == null && current != null) - { - if (current.value != null && typeof(current.value) == 'object') - { - result = (current.hasAttribute(name)) ? ((current.getAttribute(name) != null) ? - current.getAttribute(name) : '') : null; - } - - current = this.model.getParent(current); - } - - return result || ''; - } - else - { - return cell.value.getAttribute('label'); - } - } - - return mxGraph.prototype.convertValueToString.apply(this, arguments); -}; - -/** - * Returns the link for the given cell. - */ -Graph.prototype.getLinksForState = function(state) -{ - if (state != null && state.text != null && state.text.node != null) - { - return state.text.node.getElementsByTagName('a'); - } - - return null; -}; - -/** - * Returns the link for the given cell. - */ -Graph.prototype.getLinkForCell = function(cell) -{ - if (cell.value != null && typeof(cell.value) == 'object') - { - var link = cell.value.getAttribute('link'); - - // Removes links with leading javascript: protocol - // TODO: Check more possible attack vectors - if (link != null && link.toLowerCase().substring(0, 11) === 'javascript:') - { - link = link.substring(11); - } - - return link; - } - - return null; -}; - -/** - * Overrides label orientation for collapsed swimlanes inside stack. - */ -Graph.prototype.getCellStyle = function(cell) -{ - var style = mxGraph.prototype.getCellStyle.apply(this, arguments); - - if (cell != null && this.layoutManager != null) - { - var parent = this.model.getParent(cell); - - if (this.model.isVertex(parent) && this.isCellCollapsed(cell)) - { - var layout = this.layoutManager.getLayout(parent); - - if (layout != null && layout.constructor == mxStackLayout) - { - style[mxConstants.STYLE_HORIZONTAL] = !layout.horizontal; - } - } - } - - return style; -}; - -/** - * Disables alternate width persistence for stack layout parents - */ -Graph.prototype.updateAlternateBounds = function(cell, geo, willCollapse) -{ - if (cell != null && geo != null && this.layoutManager != null && geo.alternateBounds != null) - { - var layout = this.layoutManager.getLayout(this.model.getParent(cell)); - - if (layout != null && layout.constructor == mxStackLayout) - { - if (layout.horizontal) - { - geo.alternateBounds.height = 0; - } - else - { - geo.alternateBounds.width = 0; - } - } - } - - mxGraph.prototype.updateAlternateBounds.apply(this, arguments); -}; - -/** - * Adds Shift+collapse/expand and size management for folding inside stack - */ -Graph.prototype.isMoveCellsEvent = function(evt) -{ - return mxEvent.isShiftDown(evt); -}; - -/** - * Adds Shift+collapse/expand and size management for folding inside stack - */ -Graph.prototype.foldCells = function(collapse, recurse, cells, checkFoldable, evt) -{ - recurse = (recurse != null) ? recurse : false; - - if (cells == null) - { - cells = this.getFoldableCells(this.getSelectionCells(), collapse); - } - - if (cells != null) - { - this.model.beginUpdate(); - - try - { - mxGraph.prototype.foldCells.apply(this, arguments); - - // Resizes all parent stacks if alt is not pressed - if (this.layoutManager != null) - { - for (var i = 0; i < cells.length; i++) - { - var state = this.view.getState(cells[i]); - var geo = this.getCellGeometry(cells[i]); - - if (state != null && geo != null) - { - var dx = Math.round(geo.width - state.width / this.view.scale); - var dy = Math.round(geo.height - state.height / this.view.scale); - - if (dy != 0 || dx != 0) - { - var parent = this.model.getParent(cells[i]); - var layout = this.layoutManager.getLayout(parent); - - if (layout == null) - { - // Moves cells to the right and down after collapse/expand - if (evt != null && this.isMoveCellsEvent(evt)) - { - this.moveSiblings(state, parent, dx, dy); - } - } - else if ((evt == null || !mxEvent.isAltDown(evt)) && layout.constructor == mxStackLayout && !layout.resizeLast) - { - this.resizeParentStacks(parent, layout, dx, dy); - } - } - } - } - } - } - finally - { - this.model.endUpdate(); - } - - // Selects cells after folding - if (this.isEnabled()) - { - this.setSelectionCells(cells); - } - } -}; - -/** - * Overrides label orientation for collapsed swimlanes inside stack. - */ -Graph.prototype.moveSiblings = function(state, parent, dx, dy) -{ - this.model.beginUpdate(); - try - { - var cells = this.getCellsBeyond(state.x, state.y, parent, true, true); - - for (var i = 0; i < cells.length; i++) - { - if (cells[i] != state.cell) - { - var tmp = this.view.getState(cells[i]); - var geo = this.getCellGeometry(cells[i]); - - if (tmp != null && geo != null) - { - geo = geo.clone(); - geo.translate(Math.round(dx * Math.max(0, Math.min(1, (tmp.x - state.x) / state.width))), - Math.round(dy * Math.max(0, Math.min(1, (tmp.y - state.y) / state.height)))); - this.model.setGeometry(cells[i], geo); - } - } - } - } - finally - { - this.model.endUpdate(); - } -}; - -/** - * Overrides label orientation for collapsed swimlanes inside stack. - */ -Graph.prototype.resizeParentStacks = function(parent, layout, dx, dy) -{ - if (this.layoutManager != null && layout != null && layout.constructor == mxStackLayout && !layout.resizeLast) - { - this.model.beginUpdate(); - try - { - var dir = layout.horizontal; - - // Bubble resize up for all parent stack layouts with same orientation - while (parent != null && layout != null && layout.constructor == mxStackLayout && - layout.horizontal == dir && !layout.resizeLast) - { - var pgeo = this.getCellGeometry(parent); - var pstate = this.view.getState(parent); - - if (pstate != null && pgeo != null) - { - pgeo = pgeo.clone(); - - if (layout.horizontal) - { - pgeo.width += dx + Math.min(0, pstate.width / this.view.scale - pgeo.width); - } - else - { - pgeo.height += dy + Math.min(0, pstate.height / this.view.scale - pgeo.height); - } - - this.model.setGeometry(parent, pgeo); - } - - parent = this.model.getParent(parent); - layout = this.layoutManager.getLayout(parent); - } - } - finally - { - this.model.endUpdate(); - } - } -}; - -/** - * Disables drill-down for non-swimlanes. - */ -Graph.prototype.isContainer = function(cell) -{ - var state = this.view.getState(cell); - var style = (state != null) ? state.style : this.getCellStyle(cell); - - if (this.isSwimlane(cell)) - { - return style['container'] != '0'; - } - else - { - return style['container'] == '1'; - } -}; - -/** - * Adds a connectable style. - */ -Graph.prototype.isCellConnectable = function(cell) -{ - var state = this.view.getState(cell); - var style = (state != null) ? state.style : this.getCellStyle(cell); - - return (style['connectable'] != null) ? style['connectable'] != '0' : - mxGraph.prototype.isCellConnectable.apply(this, arguments); -}; - -/** - * Function: selectAll - * - * Selects all children of the given parent cell or the children of the - * default parent if no parent is specified. To select leaf vertices and/or - * edges use . - * - * Parameters: - * - * parent - Optional whose children should be selected. - * Default is . - */ -Graph.prototype.selectAll = function(parent) -{ - parent = parent || this.getDefaultParent(); - - if (!this.isCellLocked(parent)) - { - mxGraph.prototype.selectAll.apply(this, arguments); - } -}; - -/** - * Function: selectCells - * - * Selects all vertices and/or edges depending on the given boolean - * arguments recursively, starting at the given parent or the default - * parent if no parent is specified. Use to select all cells. - * For vertices, only cells with no children are selected. - * - * Parameters: - * - * vertices - Boolean indicating if vertices should be selected. - * edges - Boolean indicating if edges should be selected. - * parent - Optional that acts as the root of the recursion. - * Default is . - */ -Graph.prototype.selectCells = function(vertices, edges, parent) -{ - parent = parent || this.getDefaultParent(); - - if (!this.isCellLocked(parent)) - { - mxGraph.prototype.selectCells.apply(this, arguments); - } -}; - -/** - * Function: getSwimlaneAt - * - * Returns the bottom-most swimlane that intersects the given point (x, y) - * in the cell hierarchy that starts at the given parent. - * - * Parameters: - * - * x - X-coordinate of the location to be checked. - * y - Y-coordinate of the location to be checked. - * parent - that should be used as the root of the recursion. - * Default is . - */ -Graph.prototype.getSwimlaneAt = function (x, y, parent) -{ - parent = parent || this.getDefaultParent(); - - if (!this.isCellLocked(parent)) - { - return mxGraph.prototype.getSwimlaneAt.apply(this, arguments); - } - - return null; -}; - -/** - * Disables folding for non-swimlanes. - */ -Graph.prototype.isCellFoldable = function(cell) -{ - var state = this.view.getState(cell); - var style = (state != null) ? state.style : this.getCellStyle(cell); - - return this.foldingEnabled && !this.isCellLocked(cell) && - ((this.isContainer(cell) && style['collapsible'] != '0') || - (!this.isContainer(cell) && style['collapsible'] == '1')); -}; - -/** - * Stops all interactions and clears the selection. - */ -Graph.prototype.reset = function() -{ - if (this.isEditing()) - { - this.stopEditing(true); - } - - this.escape(); - - if (!this.isSelectionEmpty()) - { - this.clearSelection(); - } -}; - -/** - * Overridden to limit zoom to 1% - 16.000%. - */ -Graph.prototype.zoom = function(factor, center) -{ - factor = Math.max(0.01, Math.min(this.view.scale * factor, 160)) / this.view.scale; - - mxGraph.prototype.zoom.apply(this, arguments); -}; - -/** - * Function: zoomIn - * - * Zooms into the graph by . - */ -Graph.prototype.zoomIn = function() -{ - // Switches to 1% zoom steps below 15% - if (this.view.scale < 0.15) - { - this.zoom((this.view.scale + 0.01) / this.view.scale); - } - else - { - // Uses to 5% zoom steps for better grid rendering in webkit - // and to avoid rounding errors for zoom steps - this.zoom((Math.round(this.view.scale * this.zoomFactor * 20) / 20) / this.view.scale); - } -}; - -/** - * Function: zoomOut - * - * Zooms out of the graph by . - */ -Graph.prototype.zoomOut = function() -{ - // Switches to 1% zoom steps below 15% - if (this.view.scale <= 0.15) - { - this.zoom((this.view.scale - 0.01) / this.view.scale); - } - else - { - // Uses to 5% zoom steps for better grid rendering in webkit - // and to avoid rounding errors for zoom steps - this.zoom((Math.round(this.view.scale * (1 / this.zoomFactor) * 20) / 20) / this.view.scale); - } -}; - -/** - * Overrides tooltips to show custom tooltip or metadata. - */ -Graph.prototype.getTooltipForCell = function(cell) -{ - var tip = ''; - - if (mxUtils.isNode(cell.value)) - { - var tmp = cell.value.getAttribute('tooltip'); - - if (tmp != null) - { - if (tmp != null && this.isReplacePlaceholders(cell)) - { - tmp = this.replacePlaceholders(cell, tmp); - } - - tip = this.sanitizeHtml(tmp); - } - else - { - var ignored = ['label', 'tooltip', 'placeholders', 'placeholder']; - var attrs = cell.value.attributes; - var temp = []; - - // Hides links in edit mode - if (this.isEnabled()) - { - ignored.push('link'); - } - - for (var i = 0; i < attrs.length; i++) - { - if (mxUtils.indexOf(ignored, attrs[i].nodeName) < 0 && attrs[i].nodeValue.length > 0) - { - temp.push({name: attrs[i].nodeName, value: attrs[i].nodeValue}); - } - } - - // Sorts by name - temp.sort(function(a, b) - { - if (a.name < b.name) - { - return -1; - } - else if (a.name > b.name) - { - return 1; - } - else - { - return 0; - } - }); - - for (var i = 0; i < temp.length; i++) - { - if (temp[i].name != 'link' || !this.isCustomLink(temp[i].value)) - { - tip += ((temp[i].name != 'link') ? '' + temp[i].name + ': ' : '') + - mxUtils.htmlEntities(temp[i].value) + '\n'; - } - } - - if (tip.length > 0) - { - tip = tip.substring(0, tip.length - 1); - - if (mxClient.IS_SVG) - { - tip = '
' + tip + '
'; - } - } - } - } - - return tip; -}; - -/** - * Turns the given string into an array. - */ -Graph.prototype.stringToBytes = function(str) -{ - var arr = new Array(str.length); - - for (var i = 0; i < str.length; i++) - { - arr[i] = str.charCodeAt(i); - } - - return arr; -}; - -/** - * Turns the given array into a string. - */ -Graph.prototype.bytesToString = function(arr) -{ - var result = new Array(arr.length); - - for (var i = 0; i < arr.length; i++) - { - result[i] = String.fromCharCode(arr[i]); - } - - return result.join(''); -}; - -/** - * Returns a base64 encoded version of the compressed string. - */ -Graph.prototype.compress = function(data) -{ - if (data == null || data.length == 0 || typeof(pako) === 'undefined') - { - return data; - } - else - { - var tmp = this.bytesToString(pako.deflateRaw(encodeURIComponent(data))); - - return (window.btoa) ? btoa(tmp) : Base64.encode(tmp, true); - } -}; - -/** - * Returns a decompressed version of the base64 encoded string. - */ -Graph.prototype.decompress = function(data) -{ - if (data == null || data.length == 0 || typeof(pako) === 'undefined') - { - return data; - } - else - { - var tmp = (window.atob) ? atob(data) : Base64.decode(data, true); - - return this.zapGremlins(decodeURIComponent( - this.bytesToString(pako.inflateRaw(tmp)))); - } -}; - -/** - * Removes all illegal control characters with ASCII code <32 except TAB, LF - * and CR. - */ -Graph.prototype.zapGremlins = function(text) -{ - var checked = []; - - for (var i = 0; i < text.length; i++) - { - var code = text.charCodeAt(i); - - // Removes all control chars except TAB, LF and CR - if (code >= 32 || code == 9 || code == 10 || code == 13) - { - checked.push(text.charAt(i)); - } - } - - return checked.join(''); -}; - -/** - * Hover icons are used for hover, vertex handler and drag from sidebar. - */ -HoverIcons = function(graph) -{ - this.graph = graph; - this.init(); -}; - -/** - * Up arrow. - */ -HoverIcons.prototype.arrowSpacing = 6; - -/** - * Delay to switch to another state for overlapping bbox. Default is 500ms. - */ -HoverIcons.prototype.updateDelay = 500; - -/** - * Delay to switch between states. Default is 140ms. - */ -HoverIcons.prototype.activationDelay = 140; - -/** - * Up arrow. - */ -HoverIcons.prototype.currentState = null; - -/** - * Up arrow. - */ -HoverIcons.prototype.activeArrow = null; - -/** - * Up arrow. - */ -HoverIcons.prototype.inactiveOpacity = 15; - -/** - * Up arrow. - */ -HoverIcons.prototype.cssCursor = 'copy'; - -/** - * Whether to hide arrows that collide with vertices. - * LATER: Add keyboard override, touch support. - */ -HoverIcons.prototype.checkCollisions = true; - -/** - * Up arrow. - */ -HoverIcons.prototype.triangleUp = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/triangle-up.png', 26, 14) : - Graph.createSvgImage(26, 14, ''); - -/** - * Right arrow. - */ -HoverIcons.prototype.triangleRight = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/triangle-right.png', 14, 26) : - Graph.createSvgImage(14, 26, ''); - -/** - * Down arrow. - */ -HoverIcons.prototype.triangleDown = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/triangle-down.png', 26, 14) : - Graph.createSvgImage(26, 14, ''); - -/** - * Left arrow. - */ -HoverIcons.prototype.triangleLeft = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/triangle-left.png', 14, 26) : - Graph.createSvgImage(14, 26, ''); - -/** - * Round target. - */ -HoverIcons.prototype.roundDrop = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/round-drop.png', 26, 26) : - Graph.createSvgImage(26, 26, ''); - -/** - * Refresh target. - */ -HoverIcons.prototype.refreshTarget = new mxImage((mxClient.IS_SVG) ? 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAmCAYAAACoPemuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDQxNERDRTU1QjY1MTFFNDkzNTRFQTVEMTdGMTdBQjciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDQxNERDRTY1QjY1MTFFNDkzNTRFQTVEMTdGMTdBQjciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NDE0RENFMzVCNjUxMUU0OTM1NEVBNUQxN0YxN0FCNyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0NDE0RENFNDVCNjUxMUU0OTM1NEVBNUQxN0YxN0FCNyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsvuX50AAANaSURBVHja7FjRZ1tRGD9ZJ1NCyIQSwrivI4Q8hCpjlFDyFEoYfSp9Ko1QWnmo0If+BSXkIfo0QirTMUpeGo2EPfWllFYjZMLKLDJn53d3biU337m5J223bPbxk5t7v+/c3/2+73znO8fDOWezKM/YjMpz68Lj8ejY+QTeCCwLxOS9qPxtyN+6wAeBTwJ31CCO0cJDjXBGBN4LfIepSwykTUT1bgpuib0SONIgo8KRHOtRiCFcvUcgZeGrHPNBxLIyFPyRgTGz0xLbegJCdmzpElue5KlAIMDX19d5uVzm5+fnfDAYmMA17uEZdOx2Yvb/sHlu2S0xwymn5ufneTab5b1ej08S6EAXNrDd2dnhiUTim21MvMtwQ6yiIrWwsMDPzs64rsBmf3/fvM7n89TYlUnEllSkQqEQv7q64g+Vk5MTVXosORErU0Zer5f0FEIlw2N6MxwO82QyaXql2+2SxDqdjopYWUUsqEp45IldqtWq6UWVh/1+P7+8vCTJ4QMUJSRIEXuneoH96w8PDyeWAnhSJfCqwm6NIlaklFdXV0cGhRcQ2mlJQXK5nMq2YPEZbnteU1U2lUqN/D84OGD9fl+5fgnSrFarsUwmw0qlEru4uBjTicViTk3Cr27HSnxR+Doyz0ZE1CAWiUTusbu7y9rttlZv5fP5WDQavYfIMba4uEipfhF8XtqJoZXx/uH+sC/4vPg7OljZZQbsCmLtYzc3N6zRaJhotVrmfx0xDINtbm6athYUeXpHdbBNaqZUKpWxWXV7e2vex+xaWVnhc3NzjrPUXgexyCt0m67LBV7uJMITjqRE4o8tZeg8FPpFitgapYxiOC0poFgsji1jKNo6BZZckrAGUtJsNk1vqAihCBcKhTE7hNWhqw2qFnGy5UFOUYJVIJ1OjzSE+BCEilon0URavRmBqnbbQ00AXbm+vnZc9O1tj72OnQoc2+cwygRkb2+P1et17ZoEm3g87lRmjgWZ00kbXkNuse6/Bu2wlegIxfb2tuvWGroO4bO2c4bbzUh60mxDXm1sbJhhxkQYnhS4h2fUZoRAWnf7lv8N27f8P7Xhnekjgpk+VKGOoQbsiY+hhhtF3YO7twIJ+ULvUGv+GQ2fQEvWxI/THNx5/p/BaspPAQYAqStgiSQwCDoAAAAASUVORK5CYII=' : - IMAGE_PATH + '/refresh.png', 38, 38); - -/** - * Tolerance for hover icon clicks. - */ -HoverIcons.prototype.tolerance = (mxClient.IS_TOUCH) ? 6 : 0; - -/** - * - */ -HoverIcons.prototype.init = function() -{ - this.arrowUp = this.createArrow(this.triangleUp, mxResources.get('plusTooltip')); - this.arrowRight = this.createArrow(this.triangleRight, mxResources.get('plusTooltip')); - this.arrowDown = this.createArrow(this.triangleDown, mxResources.get('plusTooltip')); - this.arrowLeft = this.createArrow(this.triangleLeft, mxResources.get('plusTooltip')); - - this.elts = [this.arrowUp, this.arrowRight, this.arrowDown, this.arrowLeft]; - - this.repaintHandler = mxUtils.bind(this, function() - { - this.repaint(); - }); - - this.graph.selectionModel.addListener(mxEvent.CHANGE, this.repaintHandler); - this.graph.model.addListener(mxEvent.CHANGE, this.repaintHandler); - this.graph.view.addListener(mxEvent.SCALE_AND_TRANSLATE, this.repaintHandler); - this.graph.view.addListener(mxEvent.TRANSLATE, this.repaintHandler); - this.graph.view.addListener(mxEvent.SCALE, this.repaintHandler); - this.graph.view.addListener(mxEvent.DOWN, this.repaintHandler); - this.graph.view.addListener(mxEvent.UP, this.repaintHandler); - this.graph.addListener(mxEvent.ROOT, this.repaintHandler); - - // Resets the mouse point on escape - this.graph.addListener(mxEvent.ESCAPE, mxUtils.bind(this, function() - { - this.mouseDownPoint = null; - })); - - // Removes hover icons if mouse leaves the container - mxEvent.addListener(this.graph.container, 'mouseleave', mxUtils.bind(this, function(evt) - { - // Workaround for IE11 firing mouseleave for touch in diagram - if (evt.relatedTarget != null && mxEvent.getSource(evt) == this.graph.container) - { - this.setDisplay('none'); - } - })); - - // Resets current state when in-place editor starts - this.graph.addListener(mxEvent.START_EDITING, mxUtils.bind(this, function(evt) - { - this.reset(); - })); - - // Resets current state after update of selection state for touch events - var graphClick = this.graph.click; - this.graph.click = mxUtils.bind(this, function(me) - { - graphClick.apply(this.graph, arguments); - - if (this.currentState != null && !this.graph.isCellSelected(this.currentState.cell) && - mxEvent.isTouchEvent(me.getEvent()) && !this.graph.model.isVertex(me.getCell())) - { - this.reset(); - } - }); - - // Checks if connection handler was active in mouse move - // as workaround for possible double connection inserted - var connectionHandlerActive = false; - - // Implements a listener for hover and click handling - this.graph.addMouseListener( - { - mouseDown: mxUtils.bind(this, function(sender, me) - { - connectionHandlerActive = false; - var evt = me.getEvent(); - - if (this.isResetEvent(evt)) - { - this.reset(); - } - else if (!this.isActive()) - { - var state = this.getState(me.getState()); - - if (state != null || !mxEvent.isTouchEvent(evt)) - { - this.update(state); - } - } - - this.setDisplay('none'); - }), - mouseMove: mxUtils.bind(this, function(sender, me) - { - var evt = me.getEvent(); - - if (this.isResetEvent(evt)) - { - this.reset(); - } - else if (!this.graph.isMouseDown && !mxEvent.isTouchEvent(evt)) - { - this.update(this.getState(me.getState()), me.getGraphX(), me.getGraphY()); - } - - if (this.graph.connectionHandler != null && this.graph.connectionHandler.shape != null) - { - connectionHandlerActive = true; - } - }), - mouseUp: mxUtils.bind(this, function(sender, me) - { - var evt = me.getEvent(); - - if (this.isResetEvent(evt)) - { - this.reset(); - } - else if (this.isActive() && this.mouseDownPoint != null && - Math.abs(me.getGraphX() - this.mouseDownPoint.x) < this.graph.tolerance && - Math.abs(me.getGraphY() - this.mouseDownPoint.y) < this.graph.tolerance) - { - // Executes click event on highlighted arrow - if (!connectionHandlerActive) - { - this.click(this.currentState, this.getDirection(), me); - } - } - else if (this.isActive()) - { - // Selects target vertex after drag and clone if not only new edge was inserted - if (this.graph.getSelectionCount() != 1 || !this.graph.model.isEdge(this.graph.getSelectionCell())) - { - this.update(this.getState(this.graph.view.getState(this.graph.getCellAt(me.getGraphX(), me.getGraphY())))); - } - else - { - this.reset(); - } - } - else if (mxEvent.isTouchEvent(evt) || (this.bbox != null && mxUtils.contains(this.bbox, me.getGraphX(), me.getGraphY()))) - { - // Shows existing hover icons if inside bounding box - this.setDisplay(''); - this.repaint(); - } - else if (!mxEvent.isTouchEvent(evt)) - { - this.reset(); - } - - connectionHandlerActive = false; - this.resetActiveArrow(); - }) - }); -}; - -/** - * - */ -HoverIcons.prototype.isResetEvent = function(evt, allowShift) -{ - return mxEvent.isAltDown(evt) || (this.activeArrow == null && mxEvent.isShiftDown(evt)) || - mxEvent.isMetaDown(evt) || (mxEvent.isPopupTrigger(evt) && !mxEvent.isControlDown(evt)); -}; - -/** - * - */ -HoverIcons.prototype.createArrow = function(img, tooltip) -{ - var arrow = null; - - if (mxClient.IS_IE && !mxClient.IS_SVG) - { - // Workaround for PNG images in IE6 - if (mxClient.IS_IE6 && document.compatMode != 'CSS1Compat') - { - arrow = document.createElement(mxClient.VML_PREFIX + ':image'); - arrow.setAttribute('src', img.src); - arrow.style.borderStyle = 'none'; - } - else - { - arrow = document.createElement('div'); - arrow.style.backgroundImage = 'url(' + img.src + ')'; - arrow.style.backgroundPosition = 'center'; - arrow.style.backgroundRepeat = 'no-repeat'; - } - - arrow.style.width = (img.width + 4) + 'px'; - arrow.style.height = (img.height + 4) + 'px'; - arrow.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; - } - else - { - arrow = mxUtils.createImage(img.src); - arrow.style.width = img.width + 'px'; - arrow.style.height = img.height + 'px'; - arrow.style.padding = this.tolerance + 'px'; - } - - if (tooltip != null) - { - arrow.setAttribute('title', tooltip); - } - - arrow.style.position = 'absolute'; - arrow.style.cursor = this.cssCursor; - - mxEvent.addGestureListeners(arrow, mxUtils.bind(this, function(evt) - { - if (this.currentState != null && !this.isResetEvent(evt)) - { - this.mouseDownPoint = mxUtils.convertPoint(this.graph.container, - mxEvent.getClientX(evt), mxEvent.getClientY(evt)); - this.drag(evt, this.mouseDownPoint.x, this.mouseDownPoint.y); - this.activeArrow = arrow; - this.setDisplay('none'); - mxEvent.consume(evt); - } - })); - - // Captures mouse events as events on graph - mxEvent.redirectMouseEvents(arrow, this.graph, this.currentState); - - mxEvent.addListener(arrow, 'mouseenter', mxUtils.bind(this, function(evt) - { - // Workaround for Firefox firing mouseenter on touchend - if (mxEvent.isMouseEvent(evt)) - { - if (this.activeArrow != null && this.activeArrow != arrow) - { - mxUtils.setOpacity(this.activeArrow, this.inactiveOpacity); - } - - this.graph.connectionHandler.constraintHandler.reset(); - mxUtils.setOpacity(arrow, 100); - this.activeArrow = arrow; - } - })); - - mxEvent.addListener(arrow, 'mouseleave', mxUtils.bind(this, function(evt) - { - // Workaround for IE11 firing this event on touch - if (!this.graph.isMouseDown) - { - this.resetActiveArrow(); - } - })); - - return arrow; -}; - -/** - * - */ -HoverIcons.prototype.resetActiveArrow = function() -{ - if (this.activeArrow != null) - { - mxUtils.setOpacity(this.activeArrow, this.inactiveOpacity); - this.activeArrow = null; - } -}; - -/** - * - */ -HoverIcons.prototype.getDirection = function() -{ - var dir = mxConstants.DIRECTION_EAST; - - if (this.activeArrow == this.arrowUp) - { - dir = mxConstants.DIRECTION_NORTH; - } - else if (this.activeArrow == this.arrowDown) - { - dir = mxConstants.DIRECTION_SOUTH; - } - else if (this.activeArrow == this.arrowLeft) - { - dir = mxConstants.DIRECTION_WEST; - } - - return dir; -}; - -/** - * - */ -HoverIcons.prototype.visitNodes = function(visitor) -{ - for (var i = 0; i < this.elts.length; i++) - { - if (this.elts[i] != null) - { - visitor(this.elts[i]); - } - } -}; - -/** - * - */ -HoverIcons.prototype.removeNodes = function() -{ - this.visitNodes(function(elt) - { - if (elt.parentNode != null) - { - elt.parentNode.removeChild(elt); - } - }); -}; - -/** - * - */ -HoverIcons.prototype.setDisplay = function(display) -{ - this.visitNodes(function(elt) - { - elt.style.display = display; - }); -}; - -/** - * - */ -HoverIcons.prototype.isActive = function() -{ - return this.activeArrow != null && this.currentState != null; -}; - -/** - * - */ -HoverIcons.prototype.drag = function(evt, x, y) -{ - this.graph.popupMenuHandler.hideMenu(); - this.graph.stopEditing(false); - - // Checks if state was removed in call to stopEditing above - if (this.currentState != null) - { - this.graph.connectionHandler.start(this.currentState, x, y); - this.graph.isMouseTrigger = mxEvent.isMouseEvent(evt); - this.graph.isMouseDown = true; - - // Hides handles for selection cell - var handler = this.graph.selectionCellsHandler.getHandler(this.currentState.cell); - - if (handler != null) - { - handler.setHandlesVisible(false); - } - - // Uses elbow edges with vertical or horizontal direction -// var direction = this.getDirection(); -// var es = this.graph.connectionHandler.edgeState; -// es.cell.style = mxUtils.setStyle(es.cell.style, 'sourcePortConstraint', direction); -// es.style['sourcePortConstraint'] = direction; -// var elbowValue = (direction == mxConstants.DIRECTION_NORTH || direction == mxConstants.DIRECTION_SOUTH) ? 'vertical' : 'horizontal'; -// -// var es = this.graph.connectionHandler.edgeState; -// es.style['edgeStyle'] = 'elbowEdgeStyle'; -// es.style['elbow'] = elbowValue; -// es.cell.style = mxUtils.setStyle(es.cell.style, 'edgeStyle', es.style['edgeStyle']); -// es.cell.style = mxUtils.setStyle(es.cell.style, 'elbow', es.style['elbow']); - } -}; - -/** - * - */ -HoverIcons.prototype.getStateAt = function(state, x, y) -{ - return this.graph.view.getState(this.graph.getCellAt(x, y)); -}; - -/** - * - */ -HoverIcons.prototype.click = function(state, dir, me) -{ - var evt = me.getEvent(); - var x = me.getGraphX(); - var y = me.getGraphY(); - - var tmp = this.getStateAt(state, x, y); - - if (tmp != null && this.graph.model.isEdge(tmp.cell) && !mxEvent.isControlDown(evt) && - (tmp.getVisibleTerminalState(true) == state || tmp.getVisibleTerminalState(false) == state)) - { - this.graph.setSelectionCell(tmp.cell); - this.reset(); - } - else if (state != null) - { - var cells = this.graph.connectVertex(state.cell, dir, this.graph.defaultEdgeLength, evt); - this.graph.selectCellsForConnectVertex(cells, evt, this); - - // Selects only target vertex if one exists - if (cells.length == 2 && this.graph.model.isVertex(cells[1])) - { - this.graph.setSelectionCell(cells[1]); - - // Adds hover icons to new target vertex for touch devices - if (mxEvent.isTouchEvent(evt)) - { - this.update(this.getState(this.graph.view.getState(cells[1]))); - } - else - { - // Hides hover icons after click with mouse - this.reset(); - } - - this.graph.scrollCellToVisible(cells[1]); - } - else - { - this.graph.setSelectionCells(cells); - } - } - - me.consume(); -}; - -/** - * - */ -HoverIcons.prototype.reset = function(clearTimeout) -{ - clearTimeout = (clearTimeout == null) ? true : clearTimeout; - - if (clearTimeout && this.updateThread != null) - { - window.clearTimeout(this.updateThread); - } - - this.mouseDownPoint = null; - this.currentState = null; - this.activeArrow = null; - this.removeNodes(); - this.bbox = null; -}; - -/** - * - */ -HoverIcons.prototype.repaint = function() -{ - this.bbox = null; - - if (this.currentState != null) - { - // Checks if cell was deleted - this.currentState = this.getState(this.currentState); - - // Cell was deleted - if (this.currentState != null && - this.graph.model.isVertex(this.currentState.cell) && - this.graph.isCellConnectable(this.currentState.cell)) - { - var bds = mxRectangle.fromRectangle(this.currentState); - - // Uses outer bounding box to take rotation into account - if (this.currentState.shape != null && this.currentState.shape.boundingBox != null) - { - bds = mxRectangle.fromRectangle(this.currentState.shape.boundingBox); - } - - bds.grow(this.graph.tolerance); - bds.grow(this.arrowSpacing); - - var handler = this.graph.selectionCellsHandler.getHandler(this.currentState.cell); - - if (handler != null) - { - bds.x -= handler.horizontalOffset / 2; - bds.y -= handler.verticalOffset / 2; - bds.width += handler.horizontalOffset; - bds.height += handler.verticalOffset; - - // Adds bounding box of rotation handle to avoid overlap - if (handler.rotationShape != null && handler.rotationShape.node != null && - handler.rotationShape.node.style.visibility != 'hidden' && - handler.rotationShape.node.style.display != 'none' && - handler.rotationShape.boundingBox != null) - { - bds.add(handler.rotationShape.boundingBox); - } - } - - this.arrowUp.style.left = Math.round(this.currentState.getCenterX() - this.triangleUp.width / 2 - this.tolerance) + 'px'; - this.arrowUp.style.top = Math.round(bds.y - this.triangleUp.height - this.tolerance) + 'px'; - mxUtils.setOpacity(this.arrowUp, this.inactiveOpacity); - - this.arrowRight.style.left = Math.round(bds.x + bds.width - this.tolerance) + 'px'; - this.arrowRight.style.top = Math.round(this.currentState.getCenterY() - this.triangleRight.height / 2 - this.tolerance) + 'px'; - mxUtils.setOpacity(this.arrowRight, this.inactiveOpacity); - - this.arrowDown.style.left = this.arrowUp.style.left; - this.arrowDown.style.top = Math.round(bds.y + bds.height - this.tolerance) + 'px'; - mxUtils.setOpacity(this.arrowDown, this.inactiveOpacity); - - this.arrowLeft.style.left = Math.round(bds.x - this.triangleLeft.width - this.tolerance) + 'px'; - this.arrowLeft.style.top = this.arrowRight.style.top; - mxUtils.setOpacity(this.arrowLeft, this.inactiveOpacity); - - if (this.checkCollisions) - { - var right = this.graph.getCellAt(bds.x + bds.width + - this.triangleRight.width / 2, this.currentState.getCenterY()); - var left = this.graph.getCellAt(bds.x - this.triangleLeft.width / 2, this.currentState.getCenterY()); - var top = this.graph.getCellAt(this.currentState.getCenterX(), bds.y - this.triangleUp.height / 2); - var bottom = this.graph.getCellAt(this.currentState.getCenterX(), bds.y + bds.height + this.triangleDown.height / 2); - - // Shows hover icons large cell is behind all directions of current cell - if (right != null && right == left && left == top && top == bottom) - { - right = null; - left = null; - top = null; - bottom = null; - } - - var currentGeo = this.graph.getCellGeometry(this.currentState.cell); - - var checkCollision = mxUtils.bind(this, function(cell, arrow) - { - var geo = this.graph.model.isVertex(cell) && this.graph.getCellGeometry(cell); - - // Ignores collision if vertex is more than 3 times the size of this vertex - if (cell != null && !this.graph.model.isAncestor(cell, this.currentState.cell) && - (geo == null || currentGeo == null || (geo.height < 6 * currentGeo.height && - geo.width < 6 * currentGeo.width))) - { - arrow.style.visibility = 'hidden'; - } - else - { - arrow.style.visibility = 'visible'; - } - }); - - checkCollision(right, this.arrowRight); - checkCollision(left, this.arrowLeft); - checkCollision(top, this.arrowUp); - checkCollision(bottom, this.arrowDown); - } - else - { - this.arrowLeft.style.visibility = 'visible'; - this.arrowRight.style.visibility = 'visible'; - this.arrowUp.style.visibility = 'visible'; - this.arrowDown.style.visibility = 'visible'; - } - - if (this.graph.tooltipHandler.isEnabled()) - { - this.arrowLeft.setAttribute('title', mxResources.get('plusTooltip')); - this.arrowRight.setAttribute('title', mxResources.get('plusTooltip')); - this.arrowUp.setAttribute('title', mxResources.get('plusTooltip')); - this.arrowDown.setAttribute('title', mxResources.get('plusTooltip')); - } - else - { - this.arrowLeft.removeAttribute('title'); - this.arrowRight.removeAttribute('title'); - this.arrowUp.removeAttribute('title'); - this.arrowDown.removeAttribute('title'); - } - } - else - { - this.reset(); - } - - // Updates bounding box - if (this.currentState != null) - { - this.bbox = this.computeBoundingBox(); - - // Adds tolerance for hover - if (this.bbox != null) - { - this.bbox.grow(10); - } - } - } -}; - -/** - * - */ -HoverIcons.prototype.computeBoundingBox = function() -{ - var bbox = (!this.graph.model.isEdge(this.currentState.cell)) ? mxRectangle.fromRectangle(this.currentState) : null; - - this.visitNodes(function(elt) - { - if (elt.parentNode != null) - { - var tmp = new mxRectangle(elt.offsetLeft, elt.offsetTop, elt.offsetWidth, elt.offsetHeight); - - if (bbox == null) - { - bbox = tmp; - } - else - { - bbox.add(tmp); - } - } - }); - - return bbox; -}; - -/** - * - */ -HoverIcons.prototype.getState = function(state) -{ - if (state != null) - { - var cell = state.cell; - - // Uses connectable parent vertex if child is not connectable - if (this.graph.getModel().isVertex(cell) && !this.graph.isCellConnectable(cell)) - { - var parent = this.graph.getModel().getParent(cell); - - if (this.graph.getModel().isVertex(parent) && this.graph.isCellConnectable(parent)) - { - cell = parent; - } - } - - // Ignores locked cells and edges - if (this.graph.isCellLocked(cell) || this.graph.model.isEdge(cell)) - { - cell = null; - } - - state = this.graph.view.getState(cell); - } - - return state; -}; - -/** - * - */ -HoverIcons.prototype.update = function(state, x, y) -{ - if (!this.graph.connectionArrowsEnabled) - { - this.reset(); - } - else - { - var timeOnTarget = null; - - // Time on target - if (this.prev != state || this.isActive()) - { - this.startTime = new Date().getTime(); - this.prev = state; - timeOnTarget = 0; - - if (this.updateThread != null) - { - window.clearTimeout(this.updateThread); - } - - if (state != null) - { - // Starts timer to update current state with no mouse events - this.updateThread = window.setTimeout(mxUtils.bind(this, function() - { - if (!this.isActive() && !this.graph.isMouseDown && - !this.graph.panningHandler.isActive()) - { - this.prev = state; - this.update(state, x, y); - } - }), this.updateDelay + 10); - } - } - else if (this.startTime != null) - { - timeOnTarget = new Date().getTime() - this.startTime; - } - - this.setDisplay(''); - - if (this.currentState != null && this.currentState != state && timeOnTarget < this.activationDelay && - this.bbox != null && !mxUtils.contains(this.bbox, x, y)) - { - this.reset(false); - } - else if (this.currentState != null || timeOnTarget > this.activationDelay) - { - if (this.currentState != state && ((timeOnTarget > this.updateDelay && state != null) || - this.bbox == null || x == null || y == null || !mxUtils.contains(this.bbox, x, y))) - { - if (state != null && this.graph.isEnabled()) - { - this.removeNodes(); - this.setCurrentState(state); - this.repaint(); - - // Resets connection points on other focused cells - if (this.graph.connectionHandler.constraintHandler.currentFocus != state) - { - this.graph.connectionHandler.constraintHandler.reset(); - } - } - else - { - this.reset(); - } - } - } - } -}; - -/** - * - */ -HoverIcons.prototype.setCurrentState = function(state) -{ - if (state.style['portConstraint'] != 'eastwest') - { - this.graph.container.appendChild(this.arrowUp); - this.graph.container.appendChild(this.arrowDown); - } - - this.graph.container.appendChild(this.arrowRight); - this.graph.container.appendChild(this.arrowLeft); - this.currentState = state; -}; - -(function() -{ - - /** - * Reset the list of processed edges. - */ - var mxGraphViewResetValidationState = mxGraphView.prototype.resetValidationState; - - mxGraphView.prototype.resetValidationState = function() - { - mxGraphViewResetValidationState.apply(this, arguments); - - this.validEdges = []; - }; - - /** - * Updates jumps for valid edges and repaints if needed. - */ - var mxGraphViewValidateCellState = mxGraphView.prototype.validateCellState; - - mxGraphView.prototype.validateCellState = function(cell, recurse) - { - var state = this.getState(cell); - - // Forces repaint if jumps change on a valid edge - if (state != null && this.graph.model.isEdge(state.cell) && - state.style != null && state.style[mxConstants.STYLE_CURVED] != 1 && - !state.invalid && this.updateLineJumps(state)) - { - this.graph.cellRenderer.redraw(state, false, this.isRendering()); - } - - state = mxGraphViewValidateCellState.apply(this, arguments); - - // Adds to the list of edges that may intersect with later edges - if (state != null && this.graph.model.isEdge(state.cell) && - state.style[mxConstants.STYLE_CURVED] != 1) - { - // LATER: Reuse jumps for valid edges - this.validEdges.push(state); - } - - return state; - }; - - /** - * Forces repaint if routed points have changed. - */ - var mxCellRendererIsShapeInvalid = mxCellRenderer.prototype.isShapeInvalid; - - mxCellRenderer.prototype.isShapeInvalid = function(state, shape) - { - return mxCellRendererIsShapeInvalid.apply(this, arguments) || - (state.routedPoints != null && shape.routedPoints != null && - !mxUtils.equalPoints(shape.routedPoints, state.routedPoints)) - }; - - - /** - * Updates jumps for invalid edges. - */ - var mxGraphViewUpdateCellState = mxGraphView.prototype.updateCellState; - - mxGraphView.prototype.updateCellState = function(state) - { - mxGraphViewUpdateCellState.apply(this, arguments); - - // Updates jumps on invalid edge before repaint - if (this.graph.model.isEdge(state.cell) && - state.style[mxConstants.STYLE_CURVED] != 1) - { - this.updateLineJumps(state); - } - }; - - /** - * Updates the jumps between given state and processed edges. - */ - mxGraphView.prototype.updateLineJumps = function(state) - { - var pts = state.absolutePoints; - - if (Graph.lineJumpsEnabled) - { - var changed = state.routedPoints != null; - var actual = null; - - if (pts != null && this.validEdges != null && - mxUtils.getValue(state.style, 'jumpStyle', 'none') !== 'none') - { - var thresh = 0.5 * this.scale; - changed = false; - actual = []; - - // Type 0 means normal waypoint, 1 means jump - function addPoint(type, x, y) - { - var rpt = new mxPoint(x, y); - rpt.type = type; - - actual.push(rpt); - var curr = (state.routedPoints != null) ? state.routedPoints[actual.length - 1] : null; - - return curr == null || curr.type != type || curr.x != x || curr.y != y; - }; - - for (var i = 0; i < pts.length - 1; i++) - { - var p1 = pts[i + 1]; - var p0 = pts[i]; - var list = []; - - // Ignores waypoints on straight segments - var pn = pts[i + 2]; - - while (i < pts.length - 2 && - mxUtils.ptSegDistSq(p0.x, p0.y, pn.x, pn.y, - p1.x, p1.y) < 1 * this.scale * this.scale) - { - p1 = pn; - i++; - pn = pts[i + 2]; - } - - changed = addPoint(0, p0.x, p0.y) || changed; - - // Processes all previous edges - for (var e = 0; e < this.validEdges.length; e++) - { - var state2 = this.validEdges[e]; - var pts2 = state2.absolutePoints; - - if (pts2 != null && mxUtils.intersects(state, state2) && state2.style['noJump'] != '1') - { - // Compares each segment of the edge with the current segment - for (var j = 0; j < pts2.length - 1; j++) - { - var p3 = pts2[j + 1]; - var p2 = pts2[j]; - - // Ignores waypoints on straight segments - pn = pts2[j + 2]; - - while (j < pts2.length - 2 && - mxUtils.ptSegDistSq(p2.x, p2.y, pn.x, pn.y, - p3.x, p3.y) < 1 * this.scale * this.scale) - { - p3 = pn; - j++; - pn = pts2[j + 2]; - } - - var pt = mxUtils.intersection(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y); - - // Handles intersection between two segments - if (pt != null && (Math.abs(pt.x - p2.x) > thresh || - Math.abs(pt.y - p2.y) > thresh) && - (Math.abs(pt.x - p3.x) > thresh || - Math.abs(pt.y - p3.y) > thresh)) - { - var dx = pt.x - p0.x; - var dy = pt.y - p0.y; - var temp = {distSq: dx * dx + dy * dy, x: pt.x, y: pt.y}; - - // Intersections must be ordered by distance from start of segment - for (var t = 0; t < list.length; t++) - { - if (list[t].distSq > temp.distSq) - { - list.splice(t, 0, temp); - temp = null; - - break; - } - } - - // Ignores multiple intersections at segment joint - if (temp != null && (list.length == 0 || - list[list.length - 1].x !== temp.x || - list[list.length - 1].y !== temp.y)) - { - list.push(temp); - } - } - } - } - } - - // Adds ordered intersections to routed points - for (var j = 0; j < list.length; j++) - { - changed = addPoint(1, list[j].x, list[j].y) || changed; - } - } - - var pt = pts[pts.length - 1]; - changed = addPoint(0, pt.x, pt.y) || changed; - } - - state.routedPoints = actual; - - return changed; - } - else - { - return false; - } - }; - - /** - * Overrides painting the actual shape for taking into account jump style. - */ - var mxConnectorPaintLine = mxConnector.prototype.paintLine; - - mxConnector.prototype.paintLine = function (c, absPts, rounded) - { - // Required for checking dirty state - this.routedPoints = (this.state != null) ? this.state.routedPoints : null; - - if (this.outline || this.state == null || this.style == null || - this.state.routedPoints == null || this.state.routedPoints.length == 0) - { - mxConnectorPaintLine.apply(this, arguments); - } - else - { - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, - mxConstants.LINE_ARCSIZE) / 2; - var size = (parseInt(mxUtils.getValue(this.style, 'jumpSize', - Graph.defaultJumpSize)) - 2) / 2 + this.strokewidth; - var style = mxUtils.getValue(this.style, 'jumpStyle', 'none'); - var f = Editor.jumpSizeRatio; - var moveTo = true; - var last = null; - var len = null; - var pts = []; - var n = null; - c.begin(); - - for (var i = 0; i < this.state.routedPoints.length; i++) - { - var rpt = this.state.routedPoints[i]; - var pt = new mxPoint(rpt.x / this.scale, rpt.y / this.scale); - - // Takes first and last point from passed-in array - if (i == 0) - { - pt = absPts[0]; - } - else if (i == this.state.routedPoints.length - 1) - { - pt = absPts[absPts.length - 1]; - } - - var done = false; - - // Type 1 is an intersection - if (last != null && rpt.type == 1) - { - // Checks if next/previous points are too close - var next = this.state.routedPoints[i + 1]; - var dx = next.x / this.scale - pt.x; - var dy = next.y / this.scale - pt.y; - var dist = dx * dx + dy * dy; - - if (n == null) - { - n = new mxPoint(pt.x - last.x, pt.y - last.y); - len = Math.sqrt(n.x * n.x + n.y * n.y); - n.x = n.x * size / len; - n.y = n.y * size / len; - } - - if (dist > size * size && len > 0) - { - var dx = last.x - pt.x; - var dy = last.y - pt.y; - var dist = dx * dx + dy * dy; - - if (dist > size * size) - { - var p0 = new mxPoint(pt.x - n.x, pt.y - n.y); - var p1 = new mxPoint(pt.x + n.x, pt.y + n.y); - pts.push(p0); - - this.addPoints(c, pts, rounded, arcSize, false, null, moveTo); - - var f = (Math.round(n.x) < 0 || (Math.round(n.x) == 0 - && Math.round(n.y) <= 0)) ? 1 : -1; - moveTo = false; - - if (style == 'sharp') - { - c.lineTo(p0.x - n.y * f, p0.y + n.x * f); - c.lineTo(p1.x - n.y * f, p1.y + n.x * f); - c.lineTo(p1.x, p1.y); - } - else if (style == 'arc') - { - f *= 1.3; - c.curveTo(p0.x - n.y * f, p0.y + n.x * f, - p1.x - n.y * f, p1.y + n.x * f, - p1.x, p1.y); - } - else - { - c.moveTo(p1.x, p1.y); - moveTo = true; - } - - pts = [p1]; - done = true; - } - } - } - else - { - n = null; - } - - if (!done) - { - pts.push(pt); - last = pt; - } - } - - this.addPoints(c, pts, rounded, arcSize, false, null, moveTo); - c.stroke(); - } - }; - - /** - * Adds support for snapToPoint style. - */ - var mxGraphViewUpdateFloatingTerminalPoint = mxGraphView.prototype.updateFloatingTerminalPoint; - - mxGraphView.prototype.updateFloatingTerminalPoint = function(edge, start, end, source) - { - if (start != null && edge != null && - (start.style['snapToPoint'] == '1' || - edge.style['snapToPoint'] == '1')) - { - start = this.getTerminalPort(edge, start, source); - var next = this.getNextPoint(edge, end, source); - - var orth = this.graph.isOrthogonal(edge); - var alpha = mxUtils.toRadians(Number(start.style[mxConstants.STYLE_ROTATION] || '0')); - var center = new mxPoint(start.getCenterX(), start.getCenterY()); - - if (alpha != 0) - { - var cos = Math.cos(-alpha); - var sin = Math.sin(-alpha); - next = mxUtils.getRotatedPoint(next, cos, sin, center); - } - - var border = parseFloat(edge.style[mxConstants.STYLE_PERIMETER_SPACING] || 0); - border += parseFloat(edge.style[(source) ? - mxConstants.STYLE_SOURCE_PERIMETER_SPACING : - mxConstants.STYLE_TARGET_PERIMETER_SPACING] || 0); - var pt = this.getPerimeterPoint(start, next, alpha == 0 && orth, border); - - if (alpha != 0) - { - var cos = Math.cos(alpha); - var sin = Math.sin(alpha); - pt = mxUtils.getRotatedPoint(pt, cos, sin, center); - } - - edge.setAbsoluteTerminalPoint(this.snapToAnchorPoint(edge, start, end, source, pt), source); - } - else - { - mxGraphViewUpdateFloatingTerminalPoint.apply(this, arguments); - } - }; - - mxGraphView.prototype.snapToAnchorPoint = function(edge, start, end, source, pt) - { - if (start != null && edge != null) - { - var constraints = this.graph.getAllConnectionConstraints(start) - var nearest = null; - var dist = null; - - if (constraints != null) - { - for (var i = 0; i < constraints.length; i++) - { - var cp = this.graph.getConnectionPoint(start, constraints[i]); - - if (cp != null) - { - var tmp = (cp.x - pt.x) * (cp.x - pt.x) + (cp.y - pt.y) * (cp.y - pt.y); - - if (dist == null || tmp < dist) - { - nearest = cp; - dist = tmp; - } - } - } - } - - if (nearest != null) - { - pt = nearest; - } - } - - return pt; - }; - - /** - * Adds support for placeholders in text elements of shapes. - */ - var mxStencilEvaluateTextAttribute = mxStencil.prototype.evaluateTextAttribute; - - mxStencil.prototype.evaluateTextAttribute = function(node, attribute, shape) - { - var result = mxStencilEvaluateTextAttribute.apply(this, arguments); - var placeholders = node.getAttribute('placeholders'); - - if (placeholders == '1' && shape.state != null) - { - result = shape.state.view.graph.replacePlaceholders(shape.state.cell, result); - } - - return result; - }; - - /** - * Adds custom stencils defined via shape=stencil(value) style. The value is a base64 encoded, compressed and - * URL encoded XML definition of the shape according to the stencil definition language of mxGraph. - * - * Needs to be in this file to make sure its part of the embed client code. Also the check for ZLib is - * different than for the Editor code. - */ - var mxCellRendererCreateShape = mxCellRenderer.prototype.createShape; - mxCellRenderer.prototype.createShape = function(state) - { - if (state.style != null && typeof(pako) !== 'undefined') - { - var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - - // Extracts and decodes stencil XML if shape has the form shape=stencil(value) - if (shape != null && shape.substring(0, 8) == 'stencil(') - { - try - { - var stencil = shape.substring(8, shape.length - 1); - var doc = mxUtils.parseXml(state.view.graph.decompress(stencil)); - - return new mxShape(new mxStencil(doc.documentElement)); - } - catch (e) - { - if (window.console != null) - { - console.log('Error in shape: ' + e); - } - } - } - } - - return mxCellRendererCreateShape.apply(this, arguments); - }; -})(); - -/** - * Overrides stencil registry for dynamic loading of stencils. - */ -/** - * Maps from library names to an array of Javascript filenames, - * which are synchronously loaded. Currently only stencil files - * (.xml) and JS files (.js) are supported. - * IMPORTANT: For embedded diagrams to work entries must also - * be added in EmbedServlet.java. - */ -mxStencilRegistry.libraries = {}; - -/** - * Global switch to disable dynamic loading. - */ -mxStencilRegistry.dynamicLoading = true; - -/** - * Global switch to disable eval for JS (preload all JS instead). - */ -mxStencilRegistry.allowEval = true; - -/** - * Stores all package names that have been dynamically loaded. - * Each package is only loaded once. - */ -mxStencilRegistry.packages = []; - -// Extends the default stencil registry to add dynamic loading -mxStencilRegistry.getStencil = function(name) -{ - var result = mxStencilRegistry.stencils[name]; - - if (result == null && mxCellRenderer.defaultShapes[name] == null && mxStencilRegistry.dynamicLoading) - { - var basename = mxStencilRegistry.getBasenameForStencil(name); - - // Loads stencil files and tries again - if (basename != null) - { - var libs = mxStencilRegistry.libraries[basename]; - - if (libs != null) - { - if (mxStencilRegistry.packages[basename] == null) - { - for (var i = 0; i < libs.length; i++) - { - var fname = libs[i]; - - if (fname.toLowerCase().substring(fname.length - 4, fname.length) == '.xml') - { - mxStencilRegistry.loadStencilSet(fname, null); - } - else if (fname.toLowerCase().substring(fname.length - 3, fname.length) == '.js') - { - try - { - if (mxStencilRegistry.allowEval) - { - var req = mxUtils.load(fname); - - if (req != null && req.getStatus() >= 200 && req.getStatus() <= 299) - { - eval.call(window, req.getText()); - } - } - } - catch (e) - { - if (window.console != null) - { - console.log('error in getStencil:', fname, e); - } - } - } - else - { - // FIXME: This does not yet work as the loading is triggered after - // the shape was used in the graph, at which point the keys have - // typically been translated in the calling method. - //mxResources.add(fname); - } - } - - mxStencilRegistry.packages[basename] = 1; - } - } - else - { - // Replaces '_-_' with '_' - basename = basename.replace('_-_', '_'); - mxStencilRegistry.loadStencilSet(STENCIL_PATH + '/' + basename + '.xml', null); - } - - result = mxStencilRegistry.stencils[name]; - } - } - - return result; -}; - -// Returns the basename for the given stencil or null if no file must be -// loaded to render the given stencil. -mxStencilRegistry.getBasenameForStencil = function(name) -{ - var tmp = null; - - if (name != null) - { - var parts = name.split('.'); - - if (parts.length > 0 && parts[0] == 'mxgraph') - { - tmp = parts[1]; - - for (var i = 2; i < parts.length - 1; i++) - { - tmp += '/' + parts[i]; - } - } - } - - return tmp; -}; - -// Loads the given stencil set -mxStencilRegistry.loadStencilSet = function(stencilFile, postStencilLoad, force, async) -{ - force = (force != null) ? force : false; - - // Uses additional cache for detecting previous load attempts - var xmlDoc = mxStencilRegistry.packages[stencilFile]; - - if (force || xmlDoc == null) - { - var install = false; - - if (xmlDoc == null) - { - try - { - if (async) - { - mxStencilRegistry.loadStencil(stencilFile, mxUtils.bind(this, function(xmlDoc2) - { - if (xmlDoc2 != null && xmlDoc2.documentElement != null) - { - mxStencilRegistry.packages[stencilFile] = xmlDoc2; - install = true; - mxStencilRegistry.parseStencilSet(xmlDoc2.documentElement, postStencilLoad, install); - } - })); - - return; - } - else - { - xmlDoc = mxStencilRegistry.loadStencil(stencilFile); - mxStencilRegistry.packages[stencilFile] = xmlDoc; - install = true; - } - } - catch (e) - { - if (window.console != null) - { - console.log('error in loadStencilSet:', stencilFile, e); - } - } - } - - if (xmlDoc != null && xmlDoc.documentElement != null) - { - mxStencilRegistry.parseStencilSet(xmlDoc.documentElement, postStencilLoad, install); - } - } -}; - -// Loads the given stencil XML file. -mxStencilRegistry.loadStencil = function(filename, fn) -{ - if (fn != null) - { - var req = mxUtils.get(filename, mxUtils.bind(this, function(req) - { - fn((req.getStatus() >= 200 && req.getStatus() <= 299) ? req.getXml() : null); - })); - } - else - { - return mxUtils.load(filename).getXml(); - } -}; - -// Takes array of strings -mxStencilRegistry.parseStencilSets = function(stencils) -{ - for (var i = 0; i < stencils.length; i++) - { - mxStencilRegistry.parseStencilSet(mxUtils.parseXml(stencils[i]).documentElement); - } -}; - -// Parses the given stencil set -mxStencilRegistry.parseStencilSet = function(root, postStencilLoad, install) -{ - if (root.nodeName == 'stencils') - { - var shapes = root.firstChild; - - while (shapes != null) - { - if (shapes.nodeName == 'shapes') - { - mxStencilRegistry.parseStencilSet(shapes, postStencilLoad, install); - } - - shapes = shapes.nextSibling; - } - } - else - { - install = (install != null) ? install : true; - var shape = root.firstChild; - var packageName = ''; - var name = root.getAttribute('name'); - - if (name != null) - { - packageName = name + '.'; - } - - while (shape != null) - { - if (shape.nodeType == mxConstants.NODETYPE_ELEMENT) - { - name = shape.getAttribute('name'); - - if (name != null) - { - packageName = packageName.toLowerCase(); - var stencilName = name.replace(/ /g,"_"); - - if (install) - { - mxStencilRegistry.addStencil(packageName + stencilName.toLowerCase(), new mxStencil(shape)); - } - - if (postStencilLoad != null) - { - var w = shape.getAttribute('w'); - var h = shape.getAttribute('h'); - - w = (w == null) ? 80 : parseInt(w, 10); - h = (h == null) ? 80 : parseInt(h, 10); - - postStencilLoad(packageName, stencilName, name, w, h); - } - } - } - - shape = shape.nextSibling; - } - } -}; - -/** - * These overrides are only added if mxVertexHandler is defined (ie. not in embedded graph) - */ -if (typeof mxVertexHandler != 'undefined') -{ - (function() - { - // Sets colors for handles - mxConstants.HANDLE_FILLCOLOR = '#99ccff'; - mxConstants.HANDLE_STROKECOLOR = '#0088cf'; - mxConstants.VERTEX_SELECTION_COLOR = '#00a8ff'; - mxConstants.OUTLINE_COLOR = '#00a8ff'; - mxConstants.OUTLINE_HANDLE_FILLCOLOR = '#99ccff'; - mxConstants.OUTLINE_HANDLE_STROKECOLOR = '#00a8ff'; - mxConstants.CONNECT_HANDLE_FILLCOLOR = '#cee7ff'; - mxConstants.EDGE_SELECTION_COLOR = '#00a8ff'; - mxConstants.DEFAULT_VALID_COLOR = '#00a8ff'; - mxConstants.LABEL_HANDLE_FILLCOLOR = '#cee7ff'; - mxConstants.GUIDE_COLOR = '#0088cf'; - mxConstants.HIGHLIGHT_OPACITY = 30; - mxConstants.HIGHLIGHT_SIZE = 8; - - // Enables snapping to off-grid terminals for edge waypoints - mxEdgeHandler.prototype.snapToTerminals = true; - - // Enables guides - mxGraphHandler.prototype.guidesEnabled = true; - - // Enables fading of rubberband - mxRubberband.prototype.fadeOut = true; - - // Alt-move disables guides - mxGuide.prototype.isEnabledForEvent = function(evt) - { - return !mxEvent.isAltDown(evt); - }; - - // Extends connection handler to enable ctrl+drag for cloning source cell - // since copyOnConnect is now disabled by default - var mxConnectionHandlerCreateTarget = mxConnectionHandler.prototype.isCreateTarget; - mxConnectionHandler.prototype.isCreateTarget = function(evt) - { - return mxEvent.isControlDown(evt) || mxConnectionHandlerCreateTarget.apply(this, arguments); - }; - - // Overrides highlight shape for connection points - mxConstraintHandler.prototype.createHighlightShape = function() - { - var hl = new mxEllipse(null, this.highlightColor, this.highlightColor, 0); - hl.opacity = mxConstants.HIGHLIGHT_OPACITY; - - return hl; - }; - - // Overrides edge preview to use current edge shape and default style - mxConnectionHandler.prototype.livePreview = true; - mxConnectionHandler.prototype.cursor = 'crosshair'; - - // Uses current edge style for connect preview - mxConnectionHandler.prototype.createEdgeState = function(me) - { - var style = this.graph.createCurrentEdgeStyle(); - var edge = this.graph.createEdge(null, null, null, null, null, style); - var state = new mxCellState(this.graph.view, edge, this.graph.getCellStyle(edge)); - - for (var key in this.graph.currentEdgeStyle) - { - state.style[key] = this.graph.currentEdgeStyle[key]; - } - - return state; - }; - - // Overrides dashed state with current edge style - var connectionHandlerCreateShape = mxConnectionHandler.prototype.createShape; - mxConnectionHandler.prototype.createShape = function() - { - var shape = connectionHandlerCreateShape.apply(this, arguments); - - shape.isDashed = this.graph.currentEdgeStyle[mxConstants.STYLE_DASHED] == '1'; - - return shape; - } - - // Overrides live preview to keep current style - mxConnectionHandler.prototype.updatePreview = function(valid) - { - // do not change color of preview - }; - - // Overrides connection handler to ignore edges instead of not allowing connections - var mxConnectionHandlerCreateMarker = mxConnectionHandler.prototype.createMarker; - mxConnectionHandler.prototype.createMarker = function() - { - var marker = mxConnectionHandlerCreateMarker.apply(this, arguments); - - var markerGetCell = marker.getCell; - marker.getCell = mxUtils.bind(this, function(me) - { - var result = markerGetCell.apply(this, arguments); - - this.error = null; - - return result; - }); - - return marker; - }; - - /** - * Function: isCellLocked - * - * Returns true if the given cell does not allow new connections to be created. - * This implementation returns false. - */ - mxConnectionHandler.prototype.isCellEnabled = function(cell) - { - return !this.graph.isCellLocked(cell); - }; - - /** - * - */ - Graph.prototype.defaultVertexStyle = {}; - - /** - * Contains the default style for edges. - */ - Graph.prototype.defaultEdgeStyle = {'edgeStyle': 'orthogonalEdgeStyle', 'rounded': '0', - 'jettySize': 'auto', 'orthogonalLoop': '1'}; - - /** - * Returns the current edge style as a string. - */ - Graph.prototype.createCurrentEdgeStyle = function() - { - var style = 'edgeStyle=' + (this.currentEdgeStyle['edgeStyle'] || 'none') + ';'; - - if (this.currentEdgeStyle['shape'] != null) - { - style += 'shape=' + this.currentEdgeStyle['shape'] + ';'; - } - - if (this.currentEdgeStyle['curved'] != null) - { - style += 'curved=' + this.currentEdgeStyle['curved'] + ';'; - } - - if (this.currentEdgeStyle['rounded'] != null) - { - style += 'rounded=' + this.currentEdgeStyle['rounded'] + ';'; - } - - if (this.currentEdgeStyle['comic'] != null) - { - style += 'comic=' + this.currentEdgeStyle['comic'] + ';'; - } - - if (this.currentEdgeStyle['jumpStyle'] != null) - { - style += 'jumpStyle=' + this.currentEdgeStyle['jumpStyle'] + ';'; - } - - if (this.currentEdgeStyle['jumpSize'] != null) - { - style += 'jumpSize=' + this.currentEdgeStyle['jumpSize'] + ';'; - } - - // Special logic for custom property of elbowEdgeStyle - if (this.currentEdgeStyle['edgeStyle'] == 'elbowEdgeStyle' && this.currentEdgeStyle['elbow'] != null) - { - style += 'elbow=' + this.currentEdgeStyle['elbow'] + ';'; - } - - if (this.currentEdgeStyle['html'] != null) - { - style += 'html=' + this.currentEdgeStyle['html'] + ';'; - } - else - { - style += 'html=1;'; - } - - return style; - }; - - /** - * Hook for subclassers. - */ - Graph.prototype.getPagePadding = function() - { - return new mxPoint(0, 0); - }; - - /** - * Loads the stylesheet for this graph. - */ - Graph.prototype.loadStylesheet = function() - { - var node = (this.themes != null) ? this.themes[this.defaultThemeName] : - (!mxStyleRegistry.dynamicLoading) ? null : - mxUtils.load(STYLE_PATH + '/default.xml').getDocumentElement(); - - if (node != null) - { - var dec = new mxCodec(node.ownerDocument); - dec.decode(node, this.getStylesheet()); - } - }; - - /** - * - */ - Graph.prototype.importGraphModel = function(node, dx, dy, crop) - { - dx = (dx != null) ? dx : 0; - dy = (dy != null) ? dy : 0; - - var cells = [] - var model = new mxGraphModel(); - var codec = new mxCodec(node.ownerDocument); - codec.decode(node, model); - - var childCount = model.getChildCount(model.getRoot()); - var targetChildCount = this.model.getChildCount(this.model.getRoot()); - - // Merges into active layer if one layer is pasted - this.model.beginUpdate(); - try - { - // Mapping for multiple calls to cloneCells with the same set of cells - var mapping = new Object(); - - for (var i = 0; i < childCount; i++) - { - var parent = model.getChildAt(model.getRoot(), i); - - // Adds cells to existing layer if not locked - if (childCount == 1 && !this.isCellLocked(this.getDefaultParent())) - { - var children = model.getChildren(parent); - cells = cells.concat(this.importCells(children, dx, dy, this.getDefaultParent(), null, mapping)); - } - else - { - // Delta is non cascading, needs separate move for layers - parent = this.importCells([parent], 0, 0, this.model.getRoot(), null, mapping)[0]; - var children = this.model.getChildren(parent); - this.moveCells(children, dx, dy); - cells = cells.concat(children); - } - } - - if (crop) - { - if (this.isGridEnabled()) - { - dx = this.snap(dx); - dy = this.snap(dy); - } - - var bounds = this.getBoundingBoxFromGeometry(cells, true); - - if (bounds != null) - { - this.moveCells(cells, dx - bounds.x, dy - bounds.y); - } - } - } - finally - { - this.model.endUpdate(); - } - - return cells; - } - - /** - * Overrides method to provide connection constraints for shapes. - */ - Graph.prototype.getAllConnectionConstraints = function(terminal, source) - { - if (terminal != null) - { - var constraints = mxUtils.getValue(terminal.style, 'points', null); - - if (constraints != null) - { - // Requires an array of arrays with x, y (0..1) and an optional - // perimeter (0 or 1), eg. points=[[0,0,1],[0,1,0],[1,1]] - var result = []; - - try - { - var c = JSON.parse(constraints); - - for (var i = 0; i < c.length; i++) - { - var tmp = c[i]; - result.push(new mxConnectionConstraint(new mxPoint(tmp[0], tmp[1]), (tmp.length > 2) ? tmp[2] != '0' : true)); - } - } - catch (e) - { - // ignore - } - - return result; - } - else - { - if (terminal.shape != null) - { - if (terminal.shape.stencil != null) - { - if (terminal.shape.stencil != null) - { - return terminal.shape.stencil.constraints; - } - } - else if (terminal.shape.constraints != null) - { - return terminal.shape.constraints; - } - } - } - } - - return null; - }; - - /** - * Inverts the elbow edge style without removing existing styles. - */ - Graph.prototype.flipEdge = function(edge) - { - if (edge != null) - { - var state = this.view.getState(edge); - var style = (state != null) ? state.style : this.getCellStyle(edge); - - if (style != null) - { - var elbow = mxUtils.getValue(style, mxConstants.STYLE_ELBOW, - mxConstants.ELBOW_HORIZONTAL); - var value = (elbow == mxConstants.ELBOW_HORIZONTAL) ? - mxConstants.ELBOW_VERTICAL : mxConstants.ELBOW_HORIZONTAL; - this.setCellStyles(mxConstants.STYLE_ELBOW, value, [edge]); - } - } - }; - - /** - * Disables drill-down for non-swimlanes. - */ - Graph.prototype.isValidRoot = function(cell) - { - // Counts non-relative children - var childCount = this.model.getChildCount(cell); - var realChildCount = 0; - - for (var i = 0; i < childCount; i++) - { - var child = this.model.getChildAt(cell, i); - - if (this.model.isVertex(child)) - { - var geometry = this.getCellGeometry(child); - - if (geometry != null && !geometry.relative) - { - realChildCount++; - } - } - } - - return realChildCount > 0 || this.isContainer(cell); - }; - - /** - * Disables drill-down for non-swimlanes. - */ - Graph.prototype.isValidDropTarget = function(cell) - { - var state = this.view.getState(cell); - var style = (state != null) ? state.style : this.getCellStyle(cell); - - return mxUtils.getValue(style, 'part', '0') != '1' && (this.isContainer(cell) || - (mxGraph.prototype.isValidDropTarget.apply(this, arguments) && - mxUtils.getValue(style, 'dropTarget', '1') != '0')); - }; - - /** - * Overrides createGroupCell to set the group style for new groups to 'group'. - */ - Graph.prototype.createGroupCell = function() - { - var group = mxGraph.prototype.createGroupCell.apply(this, arguments); - group.setStyle('group'); - - return group; - }; - - /** - * Disables extending parents with stack layouts on add - */ - Graph.prototype.isExtendParentsOnAdd = function(cell) - { - var result = mxGraph.prototype.isExtendParentsOnAdd.apply(this, arguments); - - if (result && cell != null && this.layoutManager != null) - { - var parent = this.model.getParent(cell); - - if (parent != null) - { - var layout = this.layoutManager.getLayout(parent); - - if (layout != null && layout.constructor == mxStackLayout) - { - result = false; - } - } - } - - return result; - }; - - /** - * Overrides autosize to add a border. - */ - Graph.prototype.getPreferredSizeForCell = function(cell) - { - var result = mxGraph.prototype.getPreferredSizeForCell.apply(this, arguments); - - // Adds buffer - if (result != null) - { - result.width += 10; - result.height += 4; - - if (this.gridEnabled) - { - result.width = this.snap(result.width); - result.height = this.snap(result.height); - } - } - - return result; - } - - /** - * Turns the given cells and returns the changed cells. - */ - Graph.prototype.turnShapes = function(cells) - { - var model = this.getModel(); - var select = []; - - model.beginUpdate(); - try - { - for (var i = 0; i < cells.length; i++) - { - var cell = cells[i]; - - if (model.isEdge(cell)) - { - var src = model.getTerminal(cell, true); - var trg = model.getTerminal(cell, false); - - model.setTerminal(cell, trg, true); - model.setTerminal(cell, src, false); - - var geo = model.getGeometry(cell); - - if (geo != null) - { - geo = geo.clone(); - - if (geo.points != null) - { - geo.points.reverse(); - } - - var sp = geo.getTerminalPoint(true); - var tp = geo.getTerminalPoint(false) - - geo.setTerminalPoint(sp, false); - geo.setTerminalPoint(tp, true); - model.setGeometry(cell, geo); - - // Inverts constraints - var edgeState = this.view.getState(cell); - var sourceState = this.view.getState(src); - var targetState = this.view.getState(trg); - - if (edgeState != null) - { - var sc = (sourceState != null) ? this.getConnectionConstraint(edgeState, sourceState, true) : null; - var tc = (targetState != null) ? this.getConnectionConstraint(edgeState, targetState, false) : null; - - this.setConnectionConstraint(cell, src, true, tc); - this.setConnectionConstraint(cell, trg, false, sc); - } - - select.push(cell); - } - } - else if (model.isVertex(cell)) - { - var geo = this.getCellGeometry(cell); - - if (geo != null) - { - // Rotates the size and position in the geometry - geo = geo.clone(); - geo.x += geo.width / 2 - geo.height / 2; - geo.y += geo.height / 2 - geo.width / 2; - var tmp = geo.width; - geo.width = geo.height; - geo.height = tmp; - model.setGeometry(cell, geo); - - // Reads the current direction and advances by 90 degrees - var state = this.view.getState(cell); - - if (state != null) - { - var dir = state.style[mxConstants.STYLE_DIRECTION] || 'east'/*default*/; - - if (dir == 'east') - { - dir = 'south'; - } - else if (dir == 'south') - { - dir = 'west'; - } - else if (dir == 'west') - { - dir = 'north'; - } - else if (dir == 'north') - { - dir = 'east'; - } - - this.setCellStyles(mxConstants.STYLE_DIRECTION, dir, [cell]); - } - - select.push(cell); - } - } - } - } - finally - { - model.endUpdate(); - } - - return select; - }; - - /** - * Updates the child cells with placeholders if metadata of a cell has changed. - */ - Graph.prototype.processChange = function(change) - { - mxGraph.prototype.processChange.apply(this, arguments); - - if (change instanceof mxValueChange && change.cell != null && - change.cell.value != null && typeof(change.cell.value) == 'object') - { - // Invalidates all descendants with placeholders - var desc = this.model.getDescendants(change.cell); - - // LATER: Check if only label or tooltip have changed - if (desc.length > 0) - { - for (var i = 0; i < desc.length; i++) - { - if (this.isReplacePlaceholders(desc[i])) - { - this.view.invalidate(desc[i], false, false); - } - } - } - } - }; - - /** - * Replaces the given element with a span. - */ - Graph.prototype.replaceElement = function(elt, tagName) - { - var span = elt.ownerDocument.createElement((tagName != null) ? tagName : 'span'); - var attributes = Array.prototype.slice.call(elt.attributes); - - while (attr = attributes.pop()) - { - span.setAttribute(attr.nodeName, attr.nodeValue); - } - - span.innerHTML = elt.innerHTML; - elt.parentNode.replaceChild(span, elt); - }; - - /** - * Handles label changes for XML user objects. - */ - Graph.prototype.updateLabelElements = function(cells, fn, tagName) - { - cells = (cells != null) ? cells : this.getSelectionCells(); - var div = document.createElement('div'); - - for (var i = 0; i < cells.length; i++) - { - // Changes font tags inside HTML labels - if (this.isHtmlLabel(cells[i])) - { - var label = this.convertValueToString(cells[i]); - - if (label != null && label.length > 0) - { - div.innerHTML = label; - var elts = div.getElementsByTagName((tagName != null) ? tagName : '*'); - - for (var j = 0; j < elts.length; j++) - { - fn(elts[j]); - } - - if (div.innerHTML != label) - { - this.cellLabelChanged(cells[i], div.innerHTML); - } - } - } - } - }; - - /** - * Handles label changes for XML user objects. - */ - Graph.prototype.cellLabelChanged = function(cell, value, autoSize) - { - // Removes all illegal control characters in user input - value = this.zapGremlins(value); - - this.model.beginUpdate(); - try - { - if (cell.value != null && typeof cell.value == 'object') - { - if (this.isReplacePlaceholders(cell) && - cell.getAttribute('placeholder') != null) - { - // LATER: Handle delete, name change - var name = cell.getAttribute('placeholder'); - var current = cell; - - while (current != null) - { - if (current == this.model.getRoot() || (current.value != null && - typeof(current.value) == 'object' && current.hasAttribute(name))) - { - this.setAttributeForCell(current, name, value); - - break; - } - - current = this.model.getParent(current); - } - } - - var tmp = cell.value.cloneNode(true); - tmp.setAttribute('label', value); - value = tmp; - } - - mxGraph.prototype.cellLabelChanged.apply(this, arguments); - } - finally - { - this.model.endUpdate(); - } - }; - - /** - * Removes transparent empty groups if all children are removed. - */ - Graph.prototype.cellsRemoved = function(cells) - { - if (cells != null) - { - var dict = new mxDictionary(); - - for (var i = 0; i < cells.length; i++) - { - dict.put(cells[i], true); - } - - // LATER: Recurse up the cell hierarchy - var parents = []; - - for (var i = 0; i < cells.length; i++) - { - var parent = this.model.getParent(cells[i]); - - if (parent != null && !dict.get(parent)) - { - dict.put(parent, true); - parents.push(parent); - } - } - - for (var i = 0; i < parents.length; i++) - { - var state = this.view.getState(parents[i]); - - if (state != null && (this.model.isEdge(state.cell) || this.model.isVertex(state.cell)) && this.isCellDeletable(state.cell)) - { - var stroke = mxUtils.getValue(state.style, mxConstants.STYLE_STROKECOLOR, mxConstants.NONE); - var fill = mxUtils.getValue(state.style, mxConstants.STYLE_FILLCOLOR, mxConstants.NONE); - - if (stroke == mxConstants.NONE && fill == mxConstants.NONE) - { - var allChildren = true; - - for (var j = 0; j < this.model.getChildCount(state.cell) && allChildren; j++) - { - if (!dict.get(this.model.getChildAt(state.cell, j))) - { - allChildren = false; - } - } - - if (allChildren) - { - cells.push(state.cell); - } - } - } - } - } - - mxGraph.prototype.cellsRemoved.apply(this, arguments); - }; - - /** - * Overrides ungroup to check if group should be removed. - */ - Graph.prototype.removeCellsAfterUngroup = function(cells) - { - var cellsToRemove = []; - - for (var i = 0; i < cells.length; i++) - { - if (this.isCellDeletable(cells[i])) - { - var state = this.view.getState(cells[i]); - - if (state != null) - { - var stroke = mxUtils.getValue(state.style, mxConstants.STYLE_STROKECOLOR, mxConstants.NONE); - var fill = mxUtils.getValue(state.style, mxConstants.STYLE_FILLCOLOR, mxConstants.NONE); - - if (stroke == mxConstants.NONE && fill == mxConstants.NONE) - { - cellsToRemove.push(cells[i]); - } - } - } - } - - cells = cellsToRemove; - - mxGraph.prototype.removeCellsAfterUngroup.apply(this, arguments); - }; - - /** - * Sets the link for the given cell. - */ - Graph.prototype.setLinkForCell = function(cell, link) - { - this.setAttributeForCell(cell, 'link', link); - }; - - /** - * Sets the link for the given cell. - */ - Graph.prototype.setTooltipForCell = function(cell, link) - { - this.setAttributeForCell(cell, 'tooltip', link); - }; - - /** - * Sets the link for the given cell. - */ - Graph.prototype.setAttributeForCell = function(cell, attributeName, attributeValue) - { - var value = null; - - if (cell.value != null && typeof(cell.value) == 'object') - { - value = cell.value.cloneNode(true); - } - else - { - var doc = mxUtils.createXmlDocument(); - - value = doc.createElement('UserObject'); - value.setAttribute('label', cell.value || ''); - } - - if (attributeValue != null && attributeValue.length > 0) - { - value.setAttribute(attributeName, attributeValue); - } - else - { - value.removeAttribute(attributeName); - } - - this.model.setValue(cell, value); - }; - - /** - * Overridden to stop moving edge labels between cells. - */ - Graph.prototype.getDropTarget = function(cells, evt, cell, clone) - { - var model = this.getModel(); - - // Disables drop into group if alt is pressed - if (mxEvent.isAltDown(evt)) - { - return null; - } - - // Disables dragging edge labels out of edges - for (var i = 0; i < cells.length; i++) - { - if (this.model.isEdge(this.model.getParent(cells[i]))) - { - return null; - } - } - - return mxGraph.prototype.getDropTarget.apply(this, arguments); - }; - - /** - * Overrides double click handling to avoid accidental inserts of new labels in dblClick below. - */ - Graph.prototype.click = function(me) - { - mxGraph.prototype.click.call(this, me); - - // Stores state and source for checking in dblClick - this.firstClickState = me.getState(); - this.firstClickSource = me.getSource(); - }; - - /** - * Overrides double click handling to add the tolerance and inserting text. - */ - Graph.prototype.dblClick = function(evt, cell) - { - if (this.isEnabled()) - { - var pt = mxUtils.convertPoint(this.container, mxEvent.getClientX(evt), mxEvent.getClientY(evt)); - - // Automatically adds new child cells to edges on double click - if (evt != null && !this.model.isVertex(cell)) - { - var state = (this.model.isEdge(cell)) ? this.view.getState(cell) : null; - var src = mxEvent.getSource(evt); - - if (this.firstClickState == state && this.firstClickSource == src) - { - if (state == null || (state.text == null || state.text.node == null || - (!mxUtils.contains(state.text.boundingBox, pt.x, pt.y) && - !mxUtils.isAncestorNode(state.text.node, mxEvent.getSource(evt))))) - { - if ((state == null && !this.isCellLocked(this.getDefaultParent())) || - (state != null && !this.isCellLocked(state.cell))) - { - // Avoids accidental inserts on background - if (state != null || (mxClient.IS_VML && src == this.view.getCanvas()) || - (mxClient.IS_SVG && src == this.view.getCanvas().ownerSVGElement)) - { - cell = this.addText(pt.x, pt.y, state); - } - } - } - } - } - - mxGraph.prototype.dblClick.call(this, evt, cell); - } - }; - - /** - * Returns a point that specifies the location for inserting cells. - */ - Graph.prototype.getInsertPoint = function() - { - var gs = this.getGridSize(); - var dx = this.container.scrollLeft / this.view.scale - this.view.translate.x; - var dy = this.container.scrollTop / this.view.scale - this.view.translate.y; - - if (this.pageVisible) - { - var layout = this.getPageLayout(); - var page = this.getPageSize(); - dx = Math.max(dx, layout.x * page.width); - dy = Math.max(dy, layout.y * page.height); - } - - return new mxPoint(this.snap(dx + gs), this.snap(dy + gs)); - }; - - /** - * - */ - Graph.prototype.getFreeInsertPoint = function() - { - var view = this.view; - var bds = this.getGraphBounds(); - var pt = this.getInsertPoint(); - - // Places at same x-coord and 2 grid sizes below existing graph - var x = this.snap(Math.round(Math.max(pt.x, bds.x / view.scale - view.translate.x + - ((bds.width == 0) ? 2 * this.gridSize : 0)))); - var y = this.snap(Math.round(Math.max(pt.y, (bds.y + bds.height) / view.scale - view.translate.y + - 2 * this.gridSize))); - - return new mxPoint(x, y); - }; - - /** - * Hook for subclassers to return true if the current insert point was defined - * using a mouse hover event. - */ - Graph.prototype.isMouseInsertPoint = function() - { - return false; - }; - - /** - * Adds a new label at the given position and returns the new cell. State is - * an optional edge state to be used as the parent for the label. Vertices - * are not allowed currently as states. - */ - Graph.prototype.addText = function(x, y, state) - { - // Creates a new edge label with a predefined text - var label = new mxCell(); - label.value = 'Text'; - label.style = 'text;html=1;resizable=0;points=[];' - label.geometry = new mxGeometry(0, 0, 0, 0); - label.vertex = true; - - if (state != null) - { - label.style += 'align=center;verticalAlign=middle;labelBackgroundColor=#ffffff;' - label.geometry.relative = true; - label.connectable = false; - - // Resets the relative location stored inside the geometry - var pt2 = this.view.getRelativePoint(state, x, y); - label.geometry.x = Math.round(pt2.x * 10000) / 10000; - label.geometry.y = Math.round(pt2.y); - - // Resets the offset inside the geometry to find the offset from the resulting point - label.geometry.offset = new mxPoint(0, 0); - pt2 = this.view.getPoint(state, label.geometry); - - var scale = this.view.scale; - label.geometry.offset = new mxPoint(Math.round((x - pt2.x) / scale), Math.round((y - pt2.y) / scale)); - } - else - { - label.style += 'autosize=1;align=left;verticalAlign=top;spacingTop=-4;' - - var tr = this.view.translate; - label.geometry.width = 40; - label.geometry.height = 20; - label.geometry.x = Math.round(x / this.view.scale) - tr.x; - label.geometry.y = Math.round(y / this.view.scale) - tr.y; - } - - this.getModel().beginUpdate(); - try - { - this.addCells([label], (state != null) ? state.cell : null); - this.fireEvent(new mxEventObject('textInserted', 'cells', [label])); - // Updates size of text after possible change of style via event - this.autoSizeCell(label); - } - finally - { - this.getModel().endUpdate(); - } - - return label; - }; - - /** - * - */ - Graph.prototype.getAbsoluteUrl = function(url) - { - if (url != null && this.isRelativeUrl(url)) - { - if (url.charAt(0) == '#') - { - url = this.baseUrl + url; - } - else if (url.charAt(0) == '/') - { - url = this.domainUrl + url; - } - else - { - url = this.domainPathUrl + url; - } - } - - return url; - }; - - /** - * Adds a handler for clicking on shapes with links. This replaces all links in labels. - */ - Graph.prototype.addClickHandler = function(highlight, beforeClick, onClick) - { - // Replaces links in labels for consistent right-clicks - var checkLinks = mxUtils.bind(this, function() - { - var links = this.container.getElementsByTagName('a'); - - if (links != null) - { - for (var i = 0; i < links.length; i++) - { - var href = this.getAbsoluteUrl(links[i].getAttribute('href')); - - if (href != null) - { - links[i].setAttribute('href', href); - - if (beforeClick != null) - { - mxEvent.addGestureListeners(links[i], null, null, beforeClick); - } - } - } - } - }); - - this.model.addListener(mxEvent.CHANGE, checkLinks); - checkLinks(); - - var cursor = this.container.style.cursor; - var tol = this.getTolerance(); - var graph = this; - - var mouseListener = - { - currentState: null, - currentLink: null, - highlight: (highlight != null && highlight != '' && highlight != mxConstants.NONE) ? - new mxCellHighlight(graph, highlight, 4) : null, - startX: 0, - startY: 0, - scrollLeft: 0, - scrollTop: 0, - updateCurrentState: function(me) - { - var tmp = me.sourceState; - - // Gets topmost intersecting cell with link - if (tmp == null || graph.getLinkForCell(tmp.cell) == null) - { - var cell = graph.getCellAt(me.getGraphX(), me.getGraphY(), null, null, null, function(state, x, y) - { - return graph.getLinkForCell(state.cell) == null; - }); - - tmp = graph.view.getState(cell); - } - - if (tmp != this.currentState) - { - if (this.currentState != null) - { - this.clear(); - } - - this.currentState = tmp; - - if (this.currentState != null) - { - this.activate(this.currentState); - } - } - }, - mouseDown: function(sender, me) - { - this.startX = me.getGraphX(); - this.startY = me.getGraphY(); - this.scrollLeft = graph.container.scrollLeft; - this.scrollTop = graph.container.scrollTop; - - if (this.currentLink == null && graph.container.style.overflow == 'auto') - { - graph.container.style.cursor = 'move'; - } - - this.updateCurrentState(me); - }, - mouseMove: function(sender, me) - { - if (graph.isMouseDown) - { - if (this.currentLink != null) - { - var dx = Math.abs(this.startX - me.getGraphX()); - var dy = Math.abs(this.startY - me.getGraphY()); - - if (dx > tol || dy > tol) - { - this.clear(); - } - } - } - else - { - // Checks for parent link - var linkNode = me.getSource(); - - while (linkNode != null && linkNode.nodeName.toLowerCase() != 'a') - { - linkNode = linkNode.parentNode; - } - - if (linkNode != null) - { - this.clear(); - } - else - { - if (graph.tooltipHandler != null && this.currentLink != null && this.currentState != null) - { - graph.tooltipHandler.reset(me, true, this.currentState); - } - - if (this.currentState != null && (me.getState() == this.currentState || me.sourceState == null) && - graph.intersects(this.currentState, me.getGraphX(), me.getGraphY())) - { - return; - } - - this.updateCurrentState(me); - } - } - }, - mouseUp: function(sender, me) - { - var source = me.getSource(); - var evt = me.getEvent(); - - // Checks for parent link - var linkNode = source; - - while (linkNode != null && linkNode.nodeName.toLowerCase() != 'a') - { - linkNode = linkNode.parentNode; - } - - // Ignores clicks on links and collapse/expand icon - if (linkNode == null && - (((Math.abs(this.scrollLeft - graph.container.scrollLeft) < tol && - Math.abs(this.scrollTop - graph.container.scrollTop) < tol) && - (me.sourceState == null || !me.isSource(me.sourceState.control))) && - (((mxEvent.isLeftMouseButton(evt) || mxEvent.isMiddleMouseButton(evt)) && - !mxEvent.isPopupTrigger(evt)) || mxEvent.isTouchEvent(evt)))) - { - if (this.currentLink != null) - { - var blank = graph.isBlankLink(this.currentLink); - - if ((this.currentLink.substring(0, 5) === 'data:' || - !blank) && beforeClick != null) - { - beforeClick(evt, this.currentLink); - } - - if (!mxEvent.isConsumed(evt)) - { - var target = (mxEvent.isMiddleMouseButton(evt)) ? '_blank' : - ((blank) ? graph.linkTarget : '_top'); - graph.openLink(this.currentLink, target); - me.consume(); - } - } - else if (onClick != null && !me.isConsumed() && - (Math.abs(this.scrollLeft - graph.container.scrollLeft) < tol && - Math.abs(this.scrollTop - graph.container.scrollTop) < tol) && - (Math.abs(this.startX - me.getGraphX()) < tol && - Math.abs(this.startY - me.getGraphY()) < tol)) - { - onClick(me.getEvent()); - } - } - - this.clear(); - }, - activate: function(state) - { - this.currentLink = graph.getAbsoluteUrl(graph.getLinkForCell(state.cell)); - - if (this.currentLink != null) - { - graph.container.style.cursor = 'pointer'; - - if (this.highlight != null) - { - this.highlight.highlight(state); - } - } - }, - clear: function() - { - if (graph.container != null) - { - graph.container.style.cursor = cursor; - } - - this.currentState = null; - this.currentLink = null; - - if (this.highlight != null) - { - this.highlight.hide(); - } - - if (graph.tooltipHandler != null) - { - graph.tooltipHandler.hide(); - } - } - }; - - // Ignores built-in click handling - graph.click = function(me) {}; - graph.addMouseListener(mouseListener); - - mxEvent.addListener(document, 'mouseleave', function(evt) - { - mouseListener.clear(); - }); - }; - - /** - * Duplicates the given cells and returns the duplicates. - */ - Graph.prototype.duplicateCells = function(cells, append) - { - cells = (cells != null) ? cells : this.getSelectionCells(); - append = (append != null) ? append : true; - - cells = this.model.getTopmostCells(cells); - - var model = this.getModel(); - var s = this.gridSize; - var select = []; - - model.beginUpdate(); - try - { - var clones = this.cloneCells(cells, false); - - for (var i = 0; i < cells.length; i++) - { - var parent = model.getParent(cells[i]); - var child = this.moveCells([clones[i]], s, s, false)[0]; - select.push(child); - - if (append) - { - model.add(parent, clones[i]); - } - else - { - // Maintains child index by inserting after clone in parent - var index = parent.getIndex(cells[i]); - model.add(parent, clones[i], index + 1); - } - } - } - finally - { - model.endUpdate(); - } - - return select; - }; - - /** - * Inserts the given image at the cursor in a content editable text box using - * the insertimage command on the document instance. - */ - Graph.prototype.insertImage = function(newValue, w, h) - { - // To find the new image, we create a list of all existing links first - if (newValue != null) - { - var tmp = this.cellEditor.textarea.getElementsByTagName('img'); - var oldImages = []; - - for (var i = 0; i < tmp.length; i++) - { - oldImages.push(tmp[i]); - } - - // LATER: Fix inserting link/image in IE8/quirks after focus lost - document.execCommand('insertimage', false, newValue); - - // Sets size of new image - var newImages = this.cellEditor.textarea.getElementsByTagName('img'); - - if (newImages.length == oldImages.length + 1) - { - // Inverse order in favor of appended images - for (var i = newImages.length - 1; i >= 0; i--) - { - if (i == 0 || newImages[i] != oldImages[i - 1]) - { - // Workaround for lost styles during undo and redo is using attributes - newImages[i].setAttribute('width', w); - newImages[i].setAttribute('height', h); - - break; - } - } - } - } - }; - - /** - * Inserts the given image at the cursor in a content editable text box using - * the insertimage command on the document instance. - */ - Graph.prototype.insertLink = function(value) - { - if (value.length == 0) - { - document.execCommand('unlink', false); - } - else - { - // LATER: Fix inserting link/image in IE8/quirks after focus lost - document.execCommand('createlink', false, mxUtils.trim(value)); - } - }; - - /** - * - * @param cell - * @returns {Boolean} - */ - Graph.prototype.isCellResizable = function(cell) - { - var result = mxGraph.prototype.isCellResizable.apply(this, arguments); - - var state = this.view.getState(cell); - var style = (state != null) ? state.style : this.getCellStyle(cell); - - return result || (mxUtils.getValue(style, mxConstants.STYLE_RESIZABLE, '1') != '0' && - style[mxConstants.STYLE_WHITE_SPACE] == 'wrap'); - }; - - /** - * Function: distributeCells - * - * Distribuets the centers of the given cells equally along the available - * horizontal or vertical space. - * - * Parameters: - * - * horizontal - Boolean that specifies the direction of the distribution. - * cells - Optional array of to be distributed. Edges are ignored. - */ - Graph.prototype.distributeCells = function(horizontal, cells) - { - if (cells == null) - { - cells = this.getSelectionCells(); - } - - if (cells != null && cells.length > 1) - { - var vertices = []; - var max = null; - var min = null; - - for (var i = 0; i < cells.length; i++) - { - if (this.getModel().isVertex(cells[i])) - { - var state = this.view.getState(cells[i]); - - if (state != null) - { - var tmp = (horizontal) ? state.getCenterX() : state.getCenterY(); - max = (max != null) ? Math.max(max, tmp) : tmp; - min = (min != null) ? Math.min(min, tmp) : tmp; - - vertices.push(state); - } - } - } - - if (vertices.length > 2) - { - vertices.sort(function(a, b) - { - return (horizontal) ? a.x - b.x : a.y - b.y; - }); - - var t = this.view.translate; - var s = this.view.scale; - - min = min / s - ((horizontal) ? t.x : t.y); - max = max / s - ((horizontal) ? t.x : t.y); - - this.getModel().beginUpdate(); - try - { - var dt = (max - min) / (vertices.length - 1); - var t0 = min; - - for (var i = 1; i < vertices.length - 1; i++) - { - var pstate = this.view.getState(this.model.getParent(vertices[i].cell)); - var geo = this.getCellGeometry(vertices[i].cell); - t0 += dt; - - if (geo != null && pstate != null) - { - geo = geo.clone(); - - if (horizontal) - { - geo.x = Math.round(t0 - geo.width / 2) - pstate.origin.x; - } - else - { - geo.y = Math.round(t0 - geo.height / 2) - pstate.origin.y; - } - - this.getModel().setGeometry(vertices[i].cell, geo); - } - } - } - finally - { - this.getModel().endUpdate(); - } - } - } - - return cells; - }; - - /** - * Adds meta-drag an Mac. - * @param evt - * @returns - */ - Graph.prototype.isCloneEvent = function(evt) - { - return (mxClient.IS_MAC && mxEvent.isMetaDown(evt)) || mxEvent.isControlDown(evt); - }; - - /** - * Translates this point by the given vector. - * - * @param {number} dx X-coordinate of the translation. - * @param {number} dy Y-coordinate of the translation. - */ - Graph.prototype.encodeCells = function(cells) - { - var clones = this.cloneCells(cells); - - // Creates a dictionary for fast lookups - var dict = new mxDictionary(); - - for (var i = 0; i < cells.length; i++) - { - dict.put(cells[i], true); - } - - // Checks for orphaned relative children and makes absolute - for (var i = 0; i < clones.length; i++) - { - var state = this.view.getState(cells[i]); - - if (state != null) - { - var geo = this.getCellGeometry(clones[i]); - - if (geo != null && geo.relative && !this.model.isEdge(cells[i]) && - !dict.get(this.model.getParent(cells[i]))) - { - geo.relative = false; - geo.x = state.x / state.view.scale - state.view.translate.x; - geo.y = state.y / state.view.scale - state.view.translate.y; - } - } - } - - var codec = new mxCodec(); - var model = new mxGraphModel(); - var parent = model.getChildAt(model.getRoot(), 0); - - for (var i = 0; i < cells.length; i++) - { - model.add(parent, clones[i]); - } - - return codec.encode(model); - }; - - /** - * Translates this point by the given vector. - * - * @param {number} dx X-coordinate of the translation. - * @param {number} dy Y-coordinate of the translation. - */ - Graph.prototype.createSvgImageExport = function() - { - var exp = new mxImageExport(); - - // Adds hyperlinks (experimental) - exp.getLinkForCellState = mxUtils.bind(this, function(state, canvas) - { - return this.getLinkForCell(state.cell); - }); - - return exp; - }; - - /** - * Translates this point by the given vector. - * - * @param {number} dx X-coordinate of the translation. - * @param {number} dy Y-coordinate of the translation. - */ - Graph.prototype.getSvg = function(background, scale, border, nocrop, crisp, ignoreSelection, showText, imgExport) - { - //Disable Css Transforms if it is used - var origUseCssTrans = this.useCssTransforms; - - if (origUseCssTrans) - { - this.useCssTransforms = false; - this.view.revalidate(); - this.sizeDidChange(); - } - - try - { - scale = (scale != null) ? scale : 1; - border = (border != null) ? border : 0; - crisp = (crisp != null) ? crisp : true; - ignoreSelection = (ignoreSelection != null) ? ignoreSelection : true; - showText = (showText != null) ? showText : true; - - var bounds = (ignoreSelection || nocrop) ? - this.getGraphBounds() : this.getBoundingBox(this.getSelectionCells()); - - if (bounds == null) - { - throw Error(mxResources.get('drawingEmpty')); - } - - var vs = this.view.scale; - - // Prepares SVG document that holds the output - var svgDoc = mxUtils.createXmlDocument(); - var root = (svgDoc.createElementNS != null) ? - svgDoc.createElementNS(mxConstants.NS_SVG, 'svg') : svgDoc.createElement('svg'); - - if (background != null) - { - if (root.style != null) - { - root.style.backgroundColor = background; - } - else - { - root.setAttribute('style', 'background-color:' + background); - } - } - - if (svgDoc.createElementNS == null) - { - root.setAttribute('xmlns', mxConstants.NS_SVG); - root.setAttribute('xmlns:xlink', mxConstants.NS_XLINK); - } - else - { - // KNOWN: Ignored in IE9-11, adds namespace for each image element instead. No workaround. - root.setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xlink', mxConstants.NS_XLINK); - } - - var s = scale / vs; - root.setAttribute('width', Math.max(1, Math.ceil(bounds.width * s) + 2 * border) + 'px'); - root.setAttribute('height', Math.max(1, Math.ceil(bounds.height * s) + 2 * border) + 'px'); - root.setAttribute('version', '1.1'); - - // Adds group for anti-aliasing via transform - var node = root; - - if (crisp) - { - var group = (svgDoc.createElementNS != null) ? - svgDoc.createElementNS(mxConstants.NS_SVG, 'g') : svgDoc.createElement('g'); - group.setAttribute('transform', 'translate(0.5,0.5)'); - root.appendChild(group); - svgDoc.appendChild(root); - node = group; - } - else - { - svgDoc.appendChild(root); - } - - // Renders graph. Offset will be multiplied with state's scale when painting state. - // TextOffset only seems to affect FF output but used everywhere for consistency. - var svgCanvas = this.createSvgCanvas(node); - svgCanvas.foOffset = (crisp) ? -0.5 : 0; - svgCanvas.textOffset = (crisp) ? -0.5 : 0; - svgCanvas.imageOffset = (crisp) ? -0.5 : 0; - svgCanvas.translate(Math.floor((border / scale - bounds.x) / vs), Math.floor((border / scale - bounds.y) / vs)); - - // Convert HTML entities - var htmlConverter = document.createElement('textarea'); - - // Adds simple text fallback for viewers with no support for foreignObjects - var createAlternateContent = svgCanvas.createAlternateContent; - svgCanvas.createAlternateContent = function(fo, x, y, w, h, str, align, valign, wrap, format, overflow, clip, rotation) - { - var s = this.state; - - // Assumes a max character width of 0.2em - if (this.foAltText != null && (w == 0 || (s.fontSize != 0 && str.length < (w * 5) / s.fontSize))) - { - var alt = this.createElement('text'); - alt.setAttribute('x', Math.round(w / 2)); - alt.setAttribute('y', Math.round((h + s.fontSize) / 2)); - alt.setAttribute('fill', s.fontColor || 'black'); - alt.setAttribute('text-anchor', 'middle'); - alt.setAttribute('font-size', Math.round(s.fontSize) + 'px'); - alt.setAttribute('font-family', s.fontFamily); - - if ((s.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD) - { - alt.setAttribute('font-weight', 'bold'); - } - - if ((s.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC) - { - alt.setAttribute('font-style', 'italic'); - } - - if ((s.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE) - { - alt.setAttribute('text-decoration', 'underline'); - } - - try - { - htmlConverter.innerHTML = str; - alt.textContent = htmlConverter.value; - - return alt; - } - catch (e) - { - return createAlternateContent.apply(this, arguments); - } - } - else - { - return createAlternateContent.apply(this, arguments); - } - }; - - // Paints background image - var bgImg = this.backgroundImage; - - if (bgImg != null) - { - var s2 = vs / scale; - var tr = this.view.translate; - var tmp = new mxRectangle(tr.x * s2, tr.y * s2, bgImg.width * s2, bgImg.height * s2); - - // Checks if visible - if (mxUtils.intersects(bounds, tmp)) - { - svgCanvas.image(tr.x, tr.y, bgImg.width, bgImg.height, bgImg.src, true); - } - } - - svgCanvas.scale(s); - svgCanvas.textEnabled = showText; - - imgExport = (imgExport != null) ? imgExport : this.createSvgImageExport(); - var imgExportDrawCellState = imgExport.drawCellState; - - // Implements ignoreSelection flag - imgExport.drawCellState = function(state, canvas) - { - var graph = state.view.graph; - var selected = graph.isCellSelected(state.cell); - var parent = graph.model.getParent(state.cell); - - // Checks if parent cell is selected - while (!ignoreSelection && !selected && parent != null) - { - selected = graph.isCellSelected(parent); - parent = graph.model.getParent(parent); - } - - if (ignoreSelection || selected) - { - imgExportDrawCellState.apply(this, arguments); - } - }; - - imgExport.drawState(this.getView().getState(this.model.root), svgCanvas); - - return root; - } - finally - { - if (origUseCssTrans) - { - this.useCssTransforms = true; - this.view.revalidate(); - this.sizeDidChange(); - } - } - }; - - /** - * Hook for creating the canvas used in getSvg. - */ - Graph.prototype.createSvgCanvas = function(node) - { - return new mxSvgCanvas2D(node); - }; - - /** - * Returns the first ancestor of the current selection with the given name. - */ - Graph.prototype.getSelectedElement = function() - { - var node = null; - - if (window.getSelection) - { - var sel = window.getSelection(); - - if (sel.getRangeAt && sel.rangeCount) - { - var range = sel.getRangeAt(0); - node = range.commonAncestorContainer; - } - } - else if (document.selection) - { - node = document.selection.createRange().parentElement(); - } - - return node; - }; - - /** - * Returns the first ancestor of the current selection with the given name. - */ - Graph.prototype.getParentByName = function(node, name, stopAt) - { - while (node != null) - { - if (node.nodeName == name) - { - return node; - } - - if (node == stopAt) - { - return null; - } - - node = node.parentNode; - } - - return node; - }; - - /** - * Selects the given node. - */ - Graph.prototype.selectNode = function(node) - { - var sel = null; - - // IE9 and non-IE - if (window.getSelection) - { - sel = window.getSelection(); - - if (sel.getRangeAt && sel.rangeCount) - { - var range = document.createRange(); - range.selectNode(node); - sel.removeAllRanges(); - sel.addRange(range); - } - } - // IE < 9 - else if ((sel = document.selection) && sel.type != 'Control') - { - var originalRange = sel.createRange(); - originalRange.collapse(true); - var range = sel.createRange(); - range.setEndPoint('StartToStart', originalRange); - range.select(); - } - }; - - /** - * Inserts a new row into the given table. - */ - Graph.prototype.insertRow = function(table, index) - { - var bd = table.tBodies[0]; - var cells = bd.rows[0].cells; - var cols = 0; - - // Counts columns including colspans - for (var i = 0; i < cells.length; i++) - { - var colspan = cells[i].getAttribute('colspan'); - cols = (colspan != null) ? parseInt(colspan) : 1; - } - - var row = bd.insertRow(index); - - for (var i = 0; i < cols; i++) - { - mxUtils.br(row.insertCell(-1)); - } - - return row.cells[0]; - }; - - /** - * Deletes the given column. - */ - Graph.prototype.deleteRow = function(table, index) - { - table.tBodies[0].deleteRow(index); - }; - - /** - * Deletes the given column. - */ - Graph.prototype.insertColumn = function(table, index) - { - var hd = table.tHead; - - if (hd != null) - { - // TODO: use colIndex - for (var h = 0; h < hd.rows.length; h++) - { - var th = document.createElement('th'); - hd.rows[h].appendChild(th); - mxUtils.br(th); - } - } - - var bd = table.tBodies[0]; - - for (var i = 0; i < bd.rows.length; i++) - { - var cell = bd.rows[i].insertCell(index); - mxUtils.br(cell); - } - - return bd.rows[0].cells[(index >= 0) ? index : bd.rows[0].cells.length - 1]; - }; - - /** - * Deletes the given column. - */ - Graph.prototype.deleteColumn = function(table, index) - { - if (index >= 0) - { - var bd = table.tBodies[0]; - var rows = bd.rows; - - for (var i = 0; i < rows.length; i++) - { - if (rows[i].cells.length > index) - { - rows[i].deleteCell(index); - } - } - } - }; - - /** - * Inserts the given HTML at the caret position (no undo). - */ - Graph.prototype.pasteHtmlAtCaret = function(html) - { - var sel, range; - - // IE9 and non-IE - if (window.getSelection) - { - sel = window.getSelection(); - - if (sel.getRangeAt && sel.rangeCount) - { - range = sel.getRangeAt(0); - range.deleteContents(); - - // Range.createContextualFragment() would be useful here but is - // only relatively recently standardized and is not supported in - // some browsers (IE9, for one) - var el = document.createElement("div"); - el.innerHTML = html; - var frag = document.createDocumentFragment(), node; - - while ((node = el.firstChild)) - { - lastNode = frag.appendChild(node); - } - - range.insertNode(frag); - } - } - // IE < 9 - else if ((sel = document.selection) && sel.type != "Control") - { - // FIXME: Does not work if selection is empty - sel.createRange().pasteHTML(html); - } - }; - - /** - * Creates an anchor elements for handling the given link in the - * hint that is shown when the cell is selected. - */ - Graph.prototype.createLinkForHint = function(link, label) - { - label = (label != null) ? label : link; - - var a = document.createElement('a'); - a.setAttribute('href', this.getAbsoluteUrl(link)); - - if (link != null && !this.isCustomLink(link)) - { - a.setAttribute('title', link); - } - - if (this.linkTarget != null) - { - a.setAttribute('target', this.linkTarget); - } - - // Adds shortened label to link - var max = 40; - var head = 26; - var tail = 10; - - if (label.length > max) - { - label = label.substring(0, head) + '...' + label.substring(label.length - tail); - } - - mxUtils.write(a, label); - - return a; - }; - - /** - * Customized graph for touch devices. - */ - Graph.prototype.initTouch = function() - { - // Disables new connections via "hotspot" - this.connectionHandler.marker.isEnabled = function() - { - return this.graph.connectionHandler.first != null; - }; - - // Hides menu when editing starts - this.addListener(mxEvent.START_EDITING, function(sender, evt) - { - this.popupMenuHandler.hideMenu(); - }); - - // Adds custom hit detection if native hit detection found no cell - var graphUpdateMouseEvent = this.updateMouseEvent; - this.updateMouseEvent = function(me) - { - me = graphUpdateMouseEvent.apply(this, arguments); - - if (mxEvent.isTouchEvent(me.getEvent()) && me.getState() == null) - { - var cell = this.getCellAt(me.graphX, me.graphY); - - if (cell != null && this.isSwimlane(cell) && this.hitsSwimlaneContent(cell, me.graphX, me.graphY)) - { - cell = null; - } - else - { - me.state = this.view.getState(cell); - - if (me.state != null && me.state.shape != null) - { - this.container.style.cursor = me.state.shape.node.style.cursor; - } - } - } - - if (me.getState() == null && this.isEnabled()) - { - this.container.style.cursor = 'default'; - } - - return me; - }; - - // Context menu trigger implementation depending on current selection state - // combined with support for normal popup trigger. - var cellSelected = false; - var selectionEmpty = false; - var menuShowing = false; - - var oldFireMouseEvent = this.fireMouseEvent; - - this.fireMouseEvent = function(evtName, me, sender) - { - if (evtName == mxEvent.MOUSE_DOWN) - { - // For hit detection on edges - me = this.updateMouseEvent(me); - - cellSelected = this.isCellSelected(me.getCell()); - selectionEmpty = this.isSelectionEmpty(); - menuShowing = this.popupMenuHandler.isMenuShowing(); - } - - oldFireMouseEvent.apply(this, arguments); - }; - - // Shows popup menu if cell was selected or selection was empty and background was clicked - // FIXME: Conflicts with mxPopupMenuHandler.prototype.getCellForPopupEvent in Editor.js by - // selecting parent for selected children in groups before this check can be made. - this.popupMenuHandler.mouseUp = mxUtils.bind(this, function(sender, me) - { - this.popupMenuHandler.popupTrigger = !this.isEditing() && this.isEnabled() && - (me.getState() == null || !me.isSource(me.getState().control)) && - (this.popupMenuHandler.popupTrigger || (!menuShowing && !mxEvent.isMouseEvent(me.getEvent()) && - ((selectionEmpty && me.getCell() == null && this.isSelectionEmpty()) || - (cellSelected && this.isCellSelected(me.getCell()))))); - mxPopupMenuHandler.prototype.mouseUp.apply(this.popupMenuHandler, arguments); - }); - }; - - /** - * HTML in-place editor - */ - mxCellEditor.prototype.isContentEditing = function() - { - var state = this.graph.view.getState(this.editingCell); - - return state != null && state.style['html'] == 1; - }; - - /** - * Creates the keyboard event handler for the current graph and history. - */ - mxCellEditor.prototype.saveSelection = function() - { - if (window.getSelection) - { - var sel = window.getSelection(); - - if (sel.getRangeAt && sel.rangeCount) - { - var ranges = []; - - for (var i = 0, len = sel.rangeCount; i < len; ++i) - { - ranges.push(sel.getRangeAt(i)); - } - - return ranges; - } - } - else if (document.selection && document.selection.createRange) - { - return document.selection.createRange(); - } - - return null; - }; - - /** - * Creates the keyboard event handler for the current graph and history. - */ - mxCellEditor.prototype.restoreSelection = function(savedSel) - { - try - { - if (savedSel) - { - if (window.getSelection) - { - sel = window.getSelection(); - sel.removeAllRanges(); - - for (var i = 0, len = savedSel.length; i < len; ++i) - { - sel.addRange(savedSel[i]); - } - } - else if (document.selection && savedSel.select) - { - savedSel.select(); - } - } - } - catch (e) - { - // ignore - } - }; - - /** - * Handling of special nl2Br style for not converting newlines to breaks in HTML labels. - * NOTE: Since it's easier to set this when the label is created we assume that it does - * not change during the lifetime of the mxText instance. - */ - var mxCellRendererInitializeLabel = mxCellRenderer.prototype.initializeLabel; - mxCellRenderer.prototype.initializeLabel = function(state) - { - if (state.text != null) - { - state.text.replaceLinefeeds = mxUtils.getValue(state.style, 'nl2Br', '1') != '0'; - } - - mxCellRendererInitializeLabel.apply(this, arguments); - }; - - var mxConstraintHandlerUpdate = mxConstraintHandler.prototype.update; - mxConstraintHandler.prototype.update = function(me, source) - { - if (this.isKeepFocusEvent(me) || !mxEvent.isAltDown(me.getEvent())) - { - mxConstraintHandlerUpdate.apply(this, arguments); - } - else - { - this.reset(); - } - }; - - /** - * No dashed shapes. - */ - mxGuide.prototype.createGuideShape = function(horizontal) - { - var guide = new mxPolyline([], mxConstants.GUIDE_COLOR, mxConstants.GUIDE_STROKEWIDTH); - - return guide; - }; - - /** - * HTML in-place editor - */ - mxCellEditor.prototype.escapeCancelsEditing = false; - - var mxCellEditorStartEditing = mxCellEditor.prototype.startEditing; - mxCellEditor.prototype.startEditing = function(cell, trigger) - { - mxCellEditorStartEditing.apply(this, arguments); - - // Overrides class in case of HTML content to add - // dashed borders for divs and table cells - var state = this.graph.view.getState(cell); - - if (state != null && state.style['html'] == 1) - { - this.textarea.className = 'mxCellEditor geContentEditable'; - } - else - { - this.textarea.className = 'mxCellEditor mxPlainTextEditor'; - } - - // Toggles markup vs wysiwyg mode - this.codeViewMode = false; - - // Stores current selection range when switching between markup and code - this.switchSelectionState = null; - - // Selects editing cell - this.graph.setSelectionCell(cell); - - // Enables focus outline for edges and edge labels - var parent = this.graph.getModel().getParent(cell); - var geo = this.graph.getCellGeometry(cell); - - if ((this.graph.getModel().isEdge(parent) && geo != null && geo.relative) || - this.graph.getModel().isEdge(cell)) - { - // Quirks does not support outline at all so use border instead - if (mxClient.IS_QUIRKS) - { - this.textarea.style.border = 'gray dotted 1px'; - } - // IE>8 and FF on Windows uses outline default of none - else if (mxClient.IS_IE || mxClient.IS_IE11 || (mxClient.IS_FF && mxClient.IS_WIN)) - { - this.textarea.style.outline = 'gray dotted 1px'; - } - else - { - this.textarea.style.outline = ''; - } - } - else if (mxClient.IS_QUIRKS) - { - this.textarea.style.outline = 'none'; - this.textarea.style.border = ''; - } - } - - /** - * HTML in-place editor - */ - var cellEditorInstallListeners = mxCellEditor.prototype.installListeners; - mxCellEditor.prototype.installListeners = function(elt) - { - cellEditorInstallListeners.apply(this, arguments); - - // Adds a reference from the clone to the original node, recursively - function reference(node, clone) - { - clone.originalNode = node; - - node = node.firstChild; - var child = clone.firstChild; - - while (node != null && child != null) - { - reference(node, child); - node = node.nextSibling; - child = child.nextSibling; - } - - return clone; - }; - - // Checks the given node for new nodes, recursively - function checkNode(node, clone) - { - if (node != null) - { - if (clone.originalNode != node) - { - cleanNode(node); - } - else - { - node = node.firstChild; - clone = clone.firstChild; - - while (node != null) - { - var nextNode = node.nextSibling; - - if (clone == null) - { - cleanNode(node); - } - else - { - checkNode(node, clone); - clone = clone.nextSibling; - } - - node = nextNode; - } - } - } - }; - - // Removes unused DOM nodes and attributes, recursively - function cleanNode(node) - { - var child = node.firstChild; - - while (child != null) - { - var next = child.nextSibling; - cleanNode(child); - child = next; - } - - if ((node.nodeType != 1 || (node.nodeName !== 'BR' && node.firstChild == null)) && - (node.nodeType != 3 || mxUtils.trim(mxUtils.getTextContent(node)).length == 0)) - { - node.parentNode.removeChild(node); - } - else - { - // Removes linefeeds - if (node.nodeType == 3) - { - mxUtils.setTextContent(node, mxUtils.getTextContent(node).replace(/\n|\r/g, '')); - } - - // Removes CSS classes and styles (for Word and Excel) - if (node.nodeType == 1) - { - node.removeAttribute('style'); - node.removeAttribute('class'); - node.removeAttribute('width'); - node.removeAttribute('cellpadding'); - node.removeAttribute('cellspacing'); - node.removeAttribute('border'); - } - } - }; - - // Handles paste from Word, Excel etc by removing styles, classnames and unused nodes - // LATER: Fix undo/redo for paste - if (!mxClient.IS_QUIRKS && document.documentMode !== 7 && document.documentMode !== 8) - { - mxEvent.addListener(this.textarea, 'paste', mxUtils.bind(this, function(evt) - { - var clone = reference(this.textarea, this.textarea.cloneNode(true)); - - window.setTimeout(mxUtils.bind(this, function() - { - checkNode(this.textarea, clone); - }), 0); - })); - } - }; - - mxCellEditor.prototype.toggleViewMode = function() - { - var state = this.graph.view.getState(this.editingCell); - var nl2Br = state != null && mxUtils.getValue(state.style, 'nl2Br', '1') != '0'; - var tmp = this.saveSelection(); - - if (!this.codeViewMode) - { - // Clears the initial empty label on the first keystroke - if (this.clearOnChange && this.textarea.innerHTML == this.getEmptyLabelText()) - { - this.clearOnChange = false; - this.textarea.innerHTML = ''; - } - - // Removes newlines from HTML and converts breaks to newlines - // to match the HTML output in plain text - var content = mxUtils.htmlEntities(this.textarea.innerHTML); - - // Workaround for trailing line breaks being ignored in the editor - if (!mxClient.IS_QUIRKS && document.documentMode != 8) - { - content = mxUtils.replaceTrailingNewlines(content, '

'); - } - - content = this.graph.sanitizeHtml((nl2Br) ? content.replace(/\n/g, '').replace(/<br\s*.?>/g, '
') : content, true); - this.textarea.className = 'mxCellEditor mxPlainTextEditor'; - - var size = mxConstants.DEFAULT_FONTSIZE; - - this.textarea.style.lineHeight = (mxConstants.ABSOLUTE_LINE_HEIGHT) ? Math.round(size * mxConstants.LINE_HEIGHT) + 'px' : mxConstants.LINE_HEIGHT; - this.textarea.style.fontSize = Math.round(size) + 'px'; - this.textarea.style.textDecoration = ''; - this.textarea.style.fontWeight = 'normal'; - this.textarea.style.fontStyle = ''; - this.textarea.style.fontFamily = mxConstants.DEFAULT_FONTFAMILY; - this.textarea.style.textAlign = 'left'; - - // Adds padding to make cursor visible with borders - this.textarea.style.padding = '2px'; - - if (this.textarea.innerHTML != content) - { - this.textarea.innerHTML = content; - } - - this.codeViewMode = true; - } - else - { - var content = mxUtils.extractTextWithWhitespace(this.textarea.childNodes); - - // Strips trailing line break - if (content.length > 0 && content.charAt(content.length - 1) == '\n') - { - content = content.substring(0, content.length - 1); - } - - content = this.graph.sanitizeHtml((nl2Br) ? content.replace(/\n/g, '
') : content, true) - this.textarea.className = 'mxCellEditor geContentEditable'; - - var size = mxUtils.getValue(state.style, mxConstants.STYLE_FONTSIZE, mxConstants.DEFAULT_FONTSIZE); - var family = mxUtils.getValue(state.style, mxConstants.STYLE_FONTFAMILY, mxConstants.DEFAULT_FONTFAMILY); - var align = mxUtils.getValue(state.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_LEFT); - var bold = (mxUtils.getValue(state.style, mxConstants.STYLE_FONTSTYLE, 0) & - mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD; - var italic = (mxUtils.getValue(state.style, mxConstants.STYLE_FONTSTYLE, 0) & - mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC; - var uline = (mxUtils.getValue(state.style, mxConstants.STYLE_FONTSTYLE, 0) & - mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE; - - this.textarea.style.lineHeight = (mxConstants.ABSOLUTE_LINE_HEIGHT) ? Math.round(size * mxConstants.LINE_HEIGHT) + 'px' : mxConstants.LINE_HEIGHT; - this.textarea.style.fontSize = Math.round(size) + 'px'; - this.textarea.style.textDecoration = (uline) ? 'underline' : ''; - this.textarea.style.fontWeight = (bold) ? 'bold' : 'normal'; - this.textarea.style.fontStyle = (italic) ? 'italic' : ''; - this.textarea.style.fontFamily = family; - this.textarea.style.textAlign = align; - this.textarea.style.padding = '0px'; - - if (this.textarea.innerHTML != content) - { - this.textarea.innerHTML = content; - - if (this.textarea.innerHTML.length == 0) - { - this.textarea.innerHTML = this.getEmptyLabelText(); - this.clearOnChange = this.textarea.innerHTML.length > 0; - } - } - - this.codeViewMode = false; - } - - this.textarea.focus(); - - if (this.switchSelectionState != null) - { - this.restoreSelection(this.switchSelectionState); - } - - this.switchSelectionState = tmp; - this.resize(); - }; - - var mxCellEditorResize = mxCellEditor.prototype.resize; - mxCellEditor.prototype.resize = function(state, trigger) - { - if (this.textarea != null) - { - var state = this.graph.getView().getState(this.editingCell); - - if (this.codeViewMode && state != null) - { - var scale = state.view.scale; - this.bounds = mxRectangle.fromRectangle(state); - - // General placement of code editor if cell has no size - // LATER: Fix HTML editor bounds for edge labels - if (this.bounds.width == 0 && this.bounds.height == 0) - { - this.bounds.width = 160 * scale; - this.bounds.height = 60 * scale; - - var m = (state.text != null) ? state.text.margin : null; - - if (m == null) - { - m = mxUtils.getAlignmentAsPoint(mxUtils.getValue(state.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_CENTER), - mxUtils.getValue(state.style, mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE)); - } - - this.bounds.x += m.x * this.bounds.width; - this.bounds.y += m.y * this.bounds.height; - } - - this.textarea.style.width = Math.round((this.bounds.width - 4) / scale) + 'px'; - this.textarea.style.height = Math.round((this.bounds.height - 4) / scale) + 'px'; - this.textarea.style.overflow = 'auto'; - - // Adds scrollbar offset if visible - if (this.textarea.clientHeight < this.textarea.offsetHeight) - { - this.textarea.style.height = Math.round((this.bounds.height / scale)) + (this.textarea.offsetHeight - this.textarea.clientHeight) + 'px'; - this.bounds.height = parseInt(this.textarea.style.height) * scale; - } - - if (this.textarea.clientWidth < this.textarea.offsetWidth) - { - this.textarea.style.width = Math.round((this.bounds.width / scale)) + (this.textarea.offsetWidth - this.textarea.clientWidth) + 'px'; - this.bounds.width = parseInt(this.textarea.style.width) * scale; - } - - this.textarea.style.left = Math.round(this.bounds.x) + 'px'; - this.textarea.style.top = Math.round(this.bounds.y) + 'px'; - - if (mxClient.IS_VML) - { - this.textarea.style.zoom = scale; - } - else - { - mxUtils.setPrefixedStyle(this.textarea.style, 'transform', 'scale(' + scale + ',' + scale + ')'); - } - } - else - { - this.textarea.style.height = ''; - this.textarea.style.overflow = ''; - mxCellEditorResize.apply(this, arguments); - } - } - }; - - mxCellEditorGetInitialValue = mxCellEditor.prototype.getInitialValue; - mxCellEditor.prototype.getInitialValue = function(state, trigger) - { - if (mxUtils.getValue(state.style, 'html', '0') == '0') - { - return mxCellEditorGetInitialValue.apply(this, arguments); - } - else - { - var result = this.graph.getEditingValue(state.cell, trigger) - - if (mxUtils.getValue(state.style, 'nl2Br', '1') == '1') - { - result = result.replace(/\n/g, '
'); - } - - result = this.graph.sanitizeHtml(result, true); - - return result; - } - }; - - mxCellEditorGetCurrentValue = mxCellEditor.prototype.getCurrentValue; - mxCellEditor.prototype.getCurrentValue = function(state) - { - if (mxUtils.getValue(state.style, 'html', '0') == '0') - { - return mxCellEditorGetCurrentValue.apply(this, arguments); - } - else - { - var result = this.graph.sanitizeHtml(this.textarea.innerHTML, true); - - if (mxUtils.getValue(state.style, 'nl2Br', '1') == '1') - { - result = result.replace(/\r\n/g, '
').replace(/\n/g, '
'); - } - else - { - result = result.replace(/\r\n/g, '').replace(/\n/g, ''); - } - - return result; - } - }; - - var mxCellEditorStopEditing = mxCellEditor.prototype.stopEditing; - mxCellEditor.prototype.stopEditing = function(cancel) - { - // Restores default view mode before applying value - if (this.codeViewMode) - { - this.toggleViewMode(); - } - - mxCellEditorStopEditing.apply(this, arguments); - - // Tries to move focus back to container after editing if possible - this.focusContainer(); - }; - - mxCellEditor.prototype.focusContainer = function() - { - try - { - this.graph.container.focus(); - } - catch (e) - { - // ignore - } - }; - - var mxCellEditorApplyValue = mxCellEditor.prototype.applyValue; - mxCellEditor.prototype.applyValue = function(state, value) - { - // Removes empty relative child labels in edges - this.graph.getModel().beginUpdate(); - - try - { - mxCellEditorApplyValue.apply(this, arguments); - - if (this.graph.isCellDeletable(state.cell) && this.graph.model.getChildCount(state.cell) == 0) - { - var stroke = mxUtils.getValue(state.style, mxConstants.STYLE_STROKECOLOR, mxConstants.NONE); - var fill = mxUtils.getValue(state.style, mxConstants.STYLE_FILLCOLOR, mxConstants.NONE); - - if (value == '' && stroke == mxConstants.NONE && fill == mxConstants.NONE) - { - this.graph.removeCells([state.cell], false); - } - } - } - finally - { - this.graph.getModel().endUpdate(); - } - }; - - /** - * Returns the background color to be used for the editing box. This returns - * the label background for edge labels and null for all other cases. - */ - mxCellEditor.prototype.getBackgroundColor = function(state) - { - var color = null; - - if (this.graph.getModel().isEdge(state.cell) || this.graph.getModel().isEdge(this.graph.getModel().getParent(state.cell))) - { - var color = mxUtils.getValue(state.style, mxConstants.STYLE_LABEL_BACKGROUNDCOLOR, null); - - if (color == mxConstants.NONE) - { - color = null; - } - } - - return color; - }; - - mxCellEditor.prototype.getMinimumSize = function(state) - { - var scale = this.graph.getView().scale; - - return new mxRectangle(0, 0, (state.text == null) ? 30 : state.text.size * scale + 20, 30); - }; - - // Hold alt to ignore drop target - var mxGraphHandlerMoveCells = mxGraphHandler.prototype.moveCells; - - mxGraphHandler.prototype.moveCells = function(cells, dx, dy, clone, target, evt) - { - if (mxEvent.isAltDown(evt)) - { - target = null; - } - - mxGraphHandlerMoveCells.apply(this, arguments); - }; - - /** - * Hints on handlers - */ - function createHint() - { - var hint = document.createElement('div'); - hint.className = 'geHint'; - hint.style.whiteSpace = 'nowrap'; - hint.style.position = 'absolute'; - - return hint; - }; - - /** - * Updates the hint for the current operation. - */ - mxGraphHandler.prototype.updateHint = function(me) - { - if (this.shape != null) - { - if (this.hint == null) - { - this.hint = createHint(); - this.graph.container.appendChild(this.hint); - } - - var t = this.graph.view.translate; - var s = this.graph.view.scale; - var x = this.roundLength((this.bounds.x + this.currentDx) / s - t.x); - var y = this.roundLength((this.bounds.y + this.currentDy) / s - t.y); - - this.hint.innerHTML = x + ', ' + y; - - this.hint.style.left = (this.shape.bounds.x + Math.round((this.shape.bounds.width - this.hint.clientWidth) / 2)) + 'px'; - this.hint.style.top = (this.shape.bounds.y + this.shape.bounds.height + 12) + 'px'; - } - }; - - /** - * Updates the hint for the current operation. - */ - mxGraphHandler.prototype.removeHint = function() - { - if (this.hint != null) - { - this.hint.parentNode.removeChild(this.hint); - this.hint = null; - } - }; - - /** - * Enables recursive resize for groups. - */ - mxVertexHandler.prototype.isRecursiveResize = function(state, me) - { - return !this.graph.isSwimlane(state.cell) && this.graph.model.getChildCount(state.cell) > 0 && - !mxEvent.isControlDown(me.getEvent()) && !this.graph.isCellCollapsed(state.cell) && - mxUtils.getValue(state.style, 'recursiveResize', '1') == '1' && - mxUtils.getValue(state.style, 'childLayout', null) == null; - }; - - /** - * Enables centered resize events. - */ - mxVertexHandler.prototype.isCenteredEvent = function(state, me) - { - return (!(!this.graph.isSwimlane(state.cell) && this.graph.model.getChildCount(state.cell) > 0 && - !this.graph.isCellCollapsed(state.cell) && - mxUtils.getValue(state.style, 'recursiveResize', '1') == '1' && - mxUtils.getValue(state.style, 'childLayout', null) == null) && - mxEvent.isControlDown(me.getEvent())) || - mxEvent.isMetaDown(me.getEvent()); - }; - - var vertexHandlerGetHandlePadding = mxVertexHandler.prototype.getHandlePadding; - mxVertexHandler.prototype.getHandlePadding = function() - { - var result = new mxPoint(0, 0); - var tol = this.tolerance; - - if (this.graph.cellEditor.getEditingCell() == this.state.cell && - this.sizers != null && this.sizers.length > 0 && this.sizers[0] != null) - { - tol /= 2; - - result.x = this.sizers[0].bounds.width + tol; - result.y = this.sizers[0].bounds.height + tol; - } - else - { - result = vertexHandlerGetHandlePadding.apply(this, arguments); - } - - return result; - }; - - /** - * Updates the hint for the current operation. - */ - mxVertexHandler.prototype.updateHint = function(me) - { - if (this.index != mxEvent.LABEL_HANDLE) - { - if (this.hint == null) - { - this.hint = createHint(); - this.state.view.graph.container.appendChild(this.hint); - } - - if (this.index == mxEvent.ROTATION_HANDLE) - { - this.hint.innerHTML = this.currentAlpha + '°'; - } - else - { - var s = this.state.view.scale; - this.hint.innerHTML = this.roundLength(this.bounds.width / s) + ' x ' + this.roundLength(this.bounds.height / s); - } - - var rot = (this.currentAlpha != null) ? this.currentAlpha : this.state.style[mxConstants.STYLE_ROTATION] || '0'; - var bb = mxUtils.getBoundingBox(this.bounds, rot); - - if (bb == null) - { - bb = this.bounds; - } - - this.hint.style.left = bb.x + Math.round((bb.width - this.hint.clientWidth) / 2) + 'px'; - this.hint.style.top = (bb.y + bb.height + 12) + 'px'; - - if (this.linkHint != null) - { - this.linkHint.style.display = 'none'; - } - } - }; - - /** - * Updates the hint for the current operation. - */ - mxVertexHandler.prototype.removeHint = function() - { - mxGraphHandler.prototype.removeHint.apply(this, arguments); - - if (this.linkHint != null) - { - this.linkHint.style.display = ''; - } - }; - - /** - * Updates the hint for the current operation. - */ - mxEdgeHandler.prototype.updateHint = function(me, point) - { - if (this.hint == null) - { - this.hint = createHint(); - this.state.view.graph.container.appendChild(this.hint); - } - - var t = this.graph.view.translate; - var s = this.graph.view.scale; - var x = this.roundLength(point.x / s - t.x); - var y = this.roundLength(point.y / s - t.y); - - this.hint.innerHTML = x + ', ' + y; - this.hint.style.visibility = 'visible'; - - if (this.isSource || this.isTarget) - { - if (this.constraintHandler.currentConstraint != null && - this.constraintHandler.currentFocus != null) - { - var pt = this.constraintHandler.currentConstraint.point; - this.hint.innerHTML = '[' + Math.round(pt.x * 100) + '%, '+ Math.round(pt.y * 100) + '%]'; - } - else if (this.marker.hasValidState()) - { - this.hint.style.visibility = 'hidden'; - } - } - - this.hint.style.left = Math.round(me.getGraphX() - this.hint.clientWidth / 2) + 'px'; - this.hint.style.top = (Math.max(me.getGraphY(), point.y) + this.state.view.graph.gridSize) + 'px'; - - if (this.linkHint != null) - { - this.linkHint.style.display = 'none'; - } - }; - - /** - * Updates the hint for the current operation. - */ - mxEdgeHandler.prototype.removeHint = mxVertexHandler.prototype.removeHint; - - /** - * Defines the handles for the UI. Uses data-URIs to speed-up loading time where supported. - */ - // TODO: Increase handle padding - HoverIcons.prototype.mainHandle = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/handle-main.png', 17, 17) : - Graph.createSvgImage(18, 18, ''); - HoverIcons.prototype.secondaryHandle = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/handle-secondary.png', 17, 17) : - Graph.createSvgImage(16, 16, ''); - HoverIcons.prototype.fixedHandle = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/handle-fixed.png', 17, 17) : - Graph.createSvgImage(18, 18, ''); - HoverIcons.prototype.terminalHandle = (!mxClient.IS_SVG) ? new mxImage(IMAGE_PATH + '/handle-terminal.png', 17, 17) : - Graph.createSvgImage(18, 18, ''); - HoverIcons.prototype.rotationHandle = new mxImage((mxClient.IS_SVG) ? 'data:image/png;base64,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' : - IMAGE_PATH + '/handle-rotate.png', 19, 21); - - if (mxClient.IS_SVG) - { - mxConstraintHandler.prototype.pointImage = Graph.createSvgImage(5, 5, ''); - } - - mxVertexHandler.prototype.handleImage = HoverIcons.prototype.mainHandle; - mxVertexHandler.prototype.secondaryHandleImage = HoverIcons.prototype.secondaryHandle; - mxEdgeHandler.prototype.handleImage = HoverIcons.prototype.mainHandle; - mxEdgeHandler.prototype.terminalHandleImage = HoverIcons.prototype.terminalHandle; - mxEdgeHandler.prototype.fixedHandleImage = HoverIcons.prototype.fixedHandle; - mxEdgeHandler.prototype.labelHandleImage = HoverIcons.prototype.secondaryHandle; - mxOutline.prototype.sizerImage = HoverIcons.prototype.mainHandle; - - if (window.Sidebar != null) - { - Sidebar.prototype.triangleUp = HoverIcons.prototype.triangleUp; - Sidebar.prototype.triangleRight = HoverIcons.prototype.triangleRight; - Sidebar.prototype.triangleDown = HoverIcons.prototype.triangleDown; - Sidebar.prototype.triangleLeft = HoverIcons.prototype.triangleLeft; - Sidebar.prototype.refreshTarget = HoverIcons.prototype.refreshTarget; - Sidebar.prototype.roundDrop = HoverIcons.prototype.roundDrop; - } - - // Pre-fetches images (only needed for non data-uris) - if (!mxClient.IS_SVG) - { - new Image().src = HoverIcons.prototype.mainHandle.src; - new Image().src = HoverIcons.prototype.fixedHandle.src; - new Image().src = HoverIcons.prototype.terminalHandle.src; - new Image().src = HoverIcons.prototype.secondaryHandle.src; - new Image().src = HoverIcons.prototype.rotationHandle.src; - - new Image().src = HoverIcons.prototype.triangleUp.src; - new Image().src = HoverIcons.prototype.triangleRight.src; - new Image().src = HoverIcons.prototype.triangleDown.src; - new Image().src = HoverIcons.prototype.triangleLeft.src; - new Image().src = HoverIcons.prototype.refreshTarget.src; - new Image().src = HoverIcons.prototype.roundDrop.src; - } - - // Adds rotation handle and live preview - mxVertexHandler.prototype.rotationEnabled = true; - mxVertexHandler.prototype.manageSizers = true; - mxVertexHandler.prototype.livePreview = true; - - // Increases default rubberband opacity (default is 20) - mxRubberband.prototype.defaultOpacity = 30; - - // Enables connections along the outline, virtual waypoints, parent highlight etc - mxConnectionHandler.prototype.outlineConnect = true; - mxCellHighlight.prototype.keepOnTop = true; - mxVertexHandler.prototype.parentHighlightEnabled = true; - mxVertexHandler.prototype.rotationHandleVSpacing = -20; - - mxEdgeHandler.prototype.parentHighlightEnabled = true; - mxEdgeHandler.prototype.dblClickRemoveEnabled = true; - mxEdgeHandler.prototype.straightRemoveEnabled = true; - mxEdgeHandler.prototype.virtualBendsEnabled = true; - mxEdgeHandler.prototype.mergeRemoveEnabled = true; - mxEdgeHandler.prototype.manageLabelHandle = true; - mxEdgeHandler.prototype.outlineConnect = true; - - // Disables adding waypoints if shift is pressed - mxEdgeHandler.prototype.isAddVirtualBendEvent = function(me) - { - return !mxEvent.isShiftDown(me.getEvent()); - }; - - // Disables custom handles if shift is pressed - mxEdgeHandler.prototype.isCustomHandleEvent = function(me) - { - return !mxEvent.isShiftDown(me.getEvent()); - }; - - /** - * Implements touch style - */ - if (Graph.touchStyle) - { - // Larger tolerance for real touch devices - if (mxClient.IS_TOUCH || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0) - { - mxShape.prototype.svgStrokeTolerance = 18; - mxVertexHandler.prototype.tolerance = 12; - mxEdgeHandler.prototype.tolerance = 12; - Graph.prototype.tolerance = 12; - - mxVertexHandler.prototype.rotationHandleVSpacing = -24; - - // Implements a smaller tolerance for mouse events and a larger tolerance for touch - // events on touch devices. The default tolerance (4px) is used for mouse events. - mxConstraintHandler.prototype.getTolerance = function(me) - { - return (mxEvent.isMouseEvent(me.getEvent())) ? 4 : this.graph.getTolerance(); - }; - } - - // One finger pans (no rubberband selection) must start regardless of mouse button - mxPanningHandler.prototype.isPanningTrigger = function(me) - { - var evt = me.getEvent(); - - return (me.getState() == null && !mxEvent.isMouseEvent(evt)) || - (mxEvent.isPopupTrigger(evt) && (me.getState() == null || - mxEvent.isControlDown(evt) || mxEvent.isShiftDown(evt))); - }; - - // Don't clear selection if multiple cells selected - var graphHandlerMouseDown = mxGraphHandler.prototype.mouseDown; - mxGraphHandler.prototype.mouseDown = function(sender, me) - { - graphHandlerMouseDown.apply(this, arguments); - - if (mxEvent.isTouchEvent(me.getEvent()) && this.graph.isCellSelected(me.getCell()) && - this.graph.getSelectionCount() > 1) - { - this.delayedSelection = false; - } - }; - } - else - { - // Removes ctrl+shift as panning trigger for space splitting - mxPanningHandler.prototype.isPanningTrigger = function(me) - { - var evt = me.getEvent(); - - return (mxEvent.isLeftMouseButton(evt) && ((this.useLeftButtonForPanning && - me.getState() == null) || (mxEvent.isControlDown(evt) && - !mxEvent.isShiftDown(evt)))) || (this.usePopupTrigger && - mxEvent.isPopupTrigger(evt)); - }; - } - - // Overrides/extends rubberband for space handling with Ctrl+Shift(+Alt) drag ("scissors tool") - mxRubberband.prototype.isSpaceEvent = function(me) - { - return this.graph.isEnabled() && !this.graph.isCellLocked(this.graph.getDefaultParent()) && - mxEvent.isControlDown(me.getEvent()) && mxEvent.isShiftDown(me.getEvent()); - }; - - // Handles moving of cells in both half panes - mxRubberband.prototype.mouseUp = function(sender, me) - { - var execute = this.div != null && this.div.style.display != 'none'; - - var x0 = null; - var y0 = null; - var dx = null; - var dy = null; - - if (this.first != null && this.currentX != null && this.currentY != null) - { - x0 = this.first.x; - y0 = this.first.y; - dx = (this.currentX - x0) / this.graph.view.scale; - dy = (this.currentY - y0) / this.graph.view.scale; - - if (!mxEvent.isAltDown(me.getEvent())) - { - dx = this.graph.snap(dx); - dy = this.graph.snap(dy); - - if (!this.graph.isGridEnabled()) - { - if (Math.abs(dx) < this.graph.tolerance) - { - dx = 0; - } - - if (Math.abs(dy) < this.graph.tolerance) - { - dy = 0; - } - } - } - } - - this.reset(); - - if (execute) - { - if (mxEvent.isAltDown(me.getEvent()) && this.graph.isToggleEvent(me.getEvent())) - { - var rect = new mxRectangle(this.x, this.y, this.width, this.height); - var cells = this.graph.getCells(rect.x, rect.y, rect.width, rect.height); - - this.graph.removeSelectionCells(cells); - } - else if (this.isSpaceEvent(me)) - { - this.graph.model.beginUpdate(); - try - { - var cells = this.graph.getCellsBeyond(x0, y0, this.graph.getDefaultParent(), true, true); - - for (var i = 0; i < cells.length; i++) - { - if (this.graph.isCellMovable(cells[i])) - { - var tmp = this.graph.view.getState(cells[i]); - var geo = this.graph.getCellGeometry(cells[i]); - - if (tmp != null && geo != null) - { - geo = geo.clone(); - geo.translate(dx, dy); - this.graph.model.setGeometry(cells[i], geo); - } - } - } - } - finally - { - this.graph.model.endUpdate(); - } - } - else - { - var rect = new mxRectangle(this.x, this.y, this.width, this.height); - this.graph.selectRegion(rect, me.getEvent()); - } - - me.consume(); - } - }; - - // Handles preview for creating/removing space in diagram - mxRubberband.prototype.mouseMove = function(sender, me) - { - if (!me.isConsumed() && this.first != null) - { - var origin = mxUtils.getScrollOrigin(this.graph.container); - var offset = mxUtils.getOffset(this.graph.container); - origin.x -= offset.x; - origin.y -= offset.y; - var x = me.getX() + origin.x; - var y = me.getY() + origin.y; - var dx = this.first.x - x; - var dy = this.first.y - y; - var tol = this.graph.tolerance; - - if (this.div != null || Math.abs(dx) > tol || Math.abs(dy) > tol) - { - if (this.div == null) - { - this.div = this.createShape(); - } - - // Clears selection while rubberbanding. This is required because - // the event is not consumed in mouseDown. - mxUtils.clearSelection(); - this.update(x, y); - - if (this.isSpaceEvent(me)) - { - var right = this.x + this.width; - var bottom = this.y + this.height; - var scale = this.graph.view.scale; - - if (!mxEvent.isAltDown(me.getEvent())) - { - this.width = this.graph.snap(this.width / scale) * scale; - this.height = this.graph.snap(this.height / scale) * scale; - - if (!this.graph.isGridEnabled()) - { - if (this.width < this.graph.tolerance) - { - this.width = 0; - } - - if (this.height < this.graph.tolerance) - { - this.height = 0; - } - } - - if (this.x < this.first.x) - { - this.x = right - this.width; - } - - if (this.y < this.first.y) - { - this.y = bottom - this.height; - } - } - - this.div.style.borderStyle = 'dashed'; - this.div.style.backgroundColor = 'white'; - this.div.style.left = this.x + 'px'; - this.div.style.top = this.y + 'px'; - this.div.style.width = Math.max(0, this.width) + 'px'; - this.div.style.height = this.graph.container.clientHeight + 'px'; - this.div.style.borderWidth = (this.width <= 0) ? '0px 1px 0px 0px' : '0px 1px 0px 1px'; - - if (this.secondDiv == null) - { - this.secondDiv = this.div.cloneNode(true); - this.div.parentNode.appendChild(this.secondDiv); - } - - this.secondDiv.style.left = this.x + 'px'; - this.secondDiv.style.top = this.y + 'px'; - this.secondDiv.style.width = this.graph.container.clientWidth + 'px'; - this.secondDiv.style.height = Math.max(0, this.height) + 'px'; - this.secondDiv.style.borderWidth = (this.height <= 0) ? '1px 0px 0px 0px' : '1px 0px 1px 0px'; - } - else - { - // Hides second div and restores style - this.div.style.backgroundColor = ''; - this.div.style.borderWidth = ''; - this.div.style.borderStyle = ''; - - if (this.secondDiv != null) - { - this.secondDiv.parentNode.removeChild(this.secondDiv); - this.secondDiv = null; - } - } - - me.consume(); - } - } - }; - - // Removes preview - var mxRubberbandReset = mxRubberband.prototype.reset; - mxRubberband.prototype.reset = function() - { - if (this.secondDiv != null) - { - this.secondDiv.parentNode.removeChild(this.secondDiv); - this.secondDiv = null; - } - - mxRubberbandReset.apply(this, arguments); - }; - - // Timer-based activation of outline connect in connection handler - var startTime = new Date().getTime(); - var timeOnTarget = 0; - - var mxEdgeHandlerUpdatePreviewState = mxEdgeHandler.prototype.updatePreviewState; - - mxEdgeHandler.prototype.updatePreviewState = function(edge, point, terminalState, me) - { - mxEdgeHandlerUpdatePreviewState.apply(this, arguments); - - if (terminalState != this.currentTerminalState) - { - startTime = new Date().getTime(); - timeOnTarget = 0; - } - else - { - timeOnTarget = new Date().getTime() - startTime; - } - - this.currentTerminalState = terminalState; - }; - - // Timer-based outline connect - var mxEdgeHandlerIsOutlineConnectEvent = mxEdgeHandler.prototype.isOutlineConnectEvent; - - mxEdgeHandler.prototype.isOutlineConnectEvent = function(me) - { - return (this.currentTerminalState != null && me.getState() == this.currentTerminalState && timeOnTarget > 2000) || - ((this.currentTerminalState == null || mxUtils.getValue(this.currentTerminalState.style, 'outlineConnect', '1') != '0') && - mxEdgeHandlerIsOutlineConnectEvent.apply(this, arguments)); - }; - - // Disables custom handles if shift is pressed - mxVertexHandler.prototype.isCustomHandleEvent = function(me) - { - return !mxEvent.isShiftDown(me.getEvent()); - }; - - // Shows secondary handle for fixed connection points - mxEdgeHandler.prototype.createHandleShape = function(index, virtual) - { - var source = index != null && index == 0; - var terminalState = this.state.getVisibleTerminalState(source); - var c = (index != null && (index == 0 || index >= this.state.absolutePoints.length - 1 || - (this.constructor == mxElbowEdgeHandler && index == 2))) ? - this.graph.getConnectionConstraint(this.state, terminalState, source) : null; - var pt = (c != null) ? this.graph.getConnectionPoint(this.state.getVisibleTerminalState(source), c) : null; - var img = (pt != null) ? this.fixedHandleImage : ((c != null && terminalState != null) ? - this.terminalHandleImage : this.handleImage); - - if (img != null) - { - var shape = new mxImageShape(new mxRectangle(0, 0, img.width, img.height), img.src); - - // Allows HTML rendering of the images - shape.preserveImageAspect = false; - - return shape; - } - else - { - var s = mxConstants.HANDLE_SIZE; - - if (this.preferHtml) - { - s -= 1; - } - - return new mxRectangleShape(new mxRectangle(0, 0, s, s), mxConstants.HANDLE_FILLCOLOR, mxConstants.HANDLE_STROKECOLOR); - } - }; - - var vertexHandlerCreateSizerShape = mxVertexHandler.prototype.createSizerShape; - mxVertexHandler.prototype.createSizerShape = function(bounds, index, fillColor) - { - this.handleImage = (index == mxEvent.ROTATION_HANDLE) ? HoverIcons.prototype.rotationHandle : (index == mxEvent.LABEL_HANDLE) ? this.secondaryHandleImage : this.handleImage; - - return vertexHandlerCreateSizerShape.apply(this, arguments); - }; - - // Special case for single edge label handle moving in which case the text bounding box is used - var mxGraphHandlerGetBoundingBox = mxGraphHandler.prototype.getBoundingBox; - mxGraphHandler.prototype.getBoundingBox = function(cells) - { - if (cells != null && cells.length == 1) - { - var model = this.graph.getModel(); - var parent = model.getParent(cells[0]); - var geo = this.graph.getCellGeometry(cells[0]); - - if (model.isEdge(parent) && geo != null && geo.relative) - { - var state = this.graph.view.getState(cells[0]); - - if (state != null && state.width < 2 && state.height < 2 && state.text != null && state.text.boundingBox != null) - { - return mxRectangle.fromRectangle(state.text.boundingBox); - } - } - } - - return mxGraphHandlerGetBoundingBox.apply(this, arguments); - }; - - // Uses text bounding box for edge labels - var mxVertexHandlerGetSelectionBounds = mxVertexHandler.prototype.getSelectionBounds; - mxVertexHandler.prototype.getSelectionBounds = function(state) - { - var model = this.graph.getModel(); - var parent = model.getParent(state.cell); - var geo = this.graph.getCellGeometry(state.cell); - - if (model.isEdge(parent) && geo != null && geo.relative && state.width < 2 && state.height < 2 && state.text != null && state.text.boundingBox != null) - { - var bbox = state.text.unrotatedBoundingBox || state.text.boundingBox; - - return new mxRectangle(Math.round(bbox.x), Math.round(bbox.y), Math.round(bbox.width), Math.round(bbox.height)); - } - else - { - return mxVertexHandlerGetSelectionBounds.apply(this, arguments); - } - }; - - // Redirects moving of edge labels to mxGraphHandler by not starting here. - // This will use the move preview of mxGraphHandler (see above). - var mxVertexHandlerMouseDown = mxVertexHandler.prototype.mouseDown; - mxVertexHandler.prototype.mouseDown = function(sender, me) - { - var model = this.graph.getModel(); - var parent = model.getParent(this.state.cell); - var geo = this.graph.getCellGeometry(this.state.cell); - - // Lets rotation events through - var handle = this.getHandleForEvent(me); - - if (handle == mxEvent.ROTATION_HANDLE || !model.isEdge(parent) || geo == null || !geo.relative || - this.state == null || this.state.width >= 2 || this.state.height >= 2) - { - mxVertexHandlerMouseDown.apply(this, arguments); - } - }; - - // Shows rotation handle for edge labels. - mxVertexHandler.prototype.isRotationHandleVisible = function() - { - return this.graph.isEnabled() && this.rotationEnabled && this.graph.isCellRotatable(this.state.cell) && - (mxGraphHandler.prototype.maxCells <= 0 || this.graph.getSelectionCount() < mxGraphHandler.prototype.maxCells); - }; - - // Invokes turn on single click on rotation handle - mxVertexHandler.prototype.rotateClick = function() - { - this.state.view.graph.turnShapes([this.state.cell]); - }; - - var vertexHandlerMouseMove = mxVertexHandler.prototype.mouseMove; - - // Workaround for "isConsumed not defined" in MS Edge is to use arguments - mxVertexHandler.prototype.mouseMove = function(sender, me) - { - vertexHandlerMouseMove.apply(this, arguments); - - if (this.graph.graphHandler.first != null) - { - if (this.rotationShape != null && this.rotationShape.node != null) - { - this.rotationShape.node.style.display = 'none'; - } - } - }; - - var vertexHandlerMouseUp = mxVertexHandler.prototype.mouseUp; - mxVertexHandler.prototype.mouseUp = function(sender, me) - { - vertexHandlerMouseUp.apply(this, arguments); - - // Shows rotation handle only if one vertex is selected - if (this.rotationShape != null && this.rotationShape.node != null) - { - this.rotationShape.node.style.display = (this.graph.getSelectionCount() == 1) ? '' : 'none'; - } - }; - - var vertexHandlerInit = mxVertexHandler.prototype.init; - mxVertexHandler.prototype.init = function() - { - vertexHandlerInit.apply(this, arguments); - var redraw = false; - - if (this.rotationShape != null) - { - this.rotationShape.node.setAttribute('title', mxResources.get('rotateTooltip')); - } - - var update = mxUtils.bind(this, function() - { - // Shows rotation handle only if one vertex is selected - if (this.rotationShape != null && this.rotationShape.node != null) - { - this.rotationShape.node.style.display = (this.graph.getSelectionCount() == 1) ? '' : 'none'; - } - - if (this.specialHandle != null) - { - this.specialHandle.node.style.display = (this.graph.isEnabled() && this.graph.getSelectionCount() < this.graph.graphHandler.maxCells) ? '' : 'none'; - } - - this.redrawHandles(); - }); - - this.selectionHandler = mxUtils.bind(this, function(sender, evt) - { - update(); - }); - - this.graph.getSelectionModel().addListener(mxEvent.CHANGE, this.selectionHandler); - - this.changeHandler = mxUtils.bind(this, function(sender, evt) - { - this.updateLinkHint(this.graph.getLinkForCell(this.state.cell), - this.graph.getLinksForState(this.state)); - update(); - }); - - this.graph.getModel().addListener(mxEvent.CHANGE, this.changeHandler); - - // Repaint needed when editing stops and no change event is fired - this.editingHandler = mxUtils.bind(this, function(sender, evt) - { - this.redrawHandles(); - }); - - this.graph.addListener(mxEvent.EDITING_STOPPED, this.editingHandler); - - var link = this.graph.getLinkForCell(this.state.cell); - var links = this.graph.getLinksForState(this.state); - this.updateLinkHint(link, links); - - if (link != null || (links != null && links.length > 0)) - { - redraw = true; - } - - if (redraw) - { - this.redrawHandles(); - } - }; - - mxVertexHandler.prototype.updateLinkHint = function(link, links) - { - if ((link == null && (links == null || links.length == 0)) || - this.graph.getSelectionCount() > 1) - { - if (this.linkHint != null) - { - this.linkHint.parentNode.removeChild(this.linkHint); - this.linkHint = null; - } - } - else if (link != null || (links != null && links.length > 0)) - { - if (this.linkHint == null) - { - this.linkHint = createHint(); - this.linkHint.style.padding = '6px 8px 6px 8px'; - this.linkHint.style.fontSize = '90%'; - this.linkHint.style.opacity = '1'; - this.linkHint.style.filter = ''; - - this.graph.container.appendChild(this.linkHint); - } - - this.linkHint.innerHTML = ''; - - if (link != null) - { - this.linkHint.appendChild(this.graph.createLinkForHint(link)); - - if (this.graph.isEnabled() && typeof this.graph.editLink === 'function') - { - var changeLink = document.createElement('img'); - changeLink.setAttribute('src', Editor.editImage); - changeLink.setAttribute('title', mxResources.get('editLink')); - changeLink.setAttribute('width', '11'); - changeLink.setAttribute('height', '11'); - changeLink.style.marginLeft = '10px'; - changeLink.style.marginBottom = '-1px'; - changeLink.style.cursor = 'pointer'; - this.linkHint.appendChild(changeLink); - - mxEvent.addListener(changeLink, 'click', mxUtils.bind(this, function(evt) - { - this.graph.setSelectionCell(this.state.cell); - this.graph.editLink(); - mxEvent.consume(evt); - })); - - var removeLink = document.createElement('img'); - removeLink.setAttribute('src', Dialog.prototype.clearImage); - removeLink.setAttribute('title', mxResources.get('removeIt', [mxResources.get('link')])); - removeLink.setAttribute('width', '13'); - removeLink.setAttribute('height', '10'); - removeLink.style.marginLeft = '4px'; - removeLink.style.marginBottom = '-1px'; - removeLink.style.cursor = 'pointer'; - this.linkHint.appendChild(removeLink); - - mxEvent.addListener(removeLink, 'click', mxUtils.bind(this, function(evt) - { - this.graph.setLinkForCell(this.state.cell, null); - mxEvent.consume(evt); - })); - } - } - - if (links != null) - { - for (var i = 0; i < links.length; i++) - { - var div = document.createElement('div'); - div.style.marginTop = (link != null || i > 0) ? '6px' : '0px'; - div.appendChild(this.graph.createLinkForHint( - links[i].getAttribute('href'), - mxUtils.getTextContent(links[i]))); - - this.linkHint.appendChild(div); - } - } - } - }; - - mxEdgeHandler.prototype.updateLinkHint = mxVertexHandler.prototype.updateLinkHint; - - var edgeHandlerInit = mxEdgeHandler.prototype.init; - mxEdgeHandler.prototype.init = function() - { - edgeHandlerInit.apply(this, arguments); - - // Disables connection points - this.constraintHandler.isEnabled = mxUtils.bind(this, function() - { - return this.state.view.graph.connectionHandler.isEnabled(); - }); - - var update = mxUtils.bind(this, function() - { - if (this.linkHint != null) - { - this.linkHint.style.display = (this.graph.getSelectionCount() == 1) ? '' : 'none'; - } - - if (this.labelShape != null) - { - this.labelShape.node.style.display = (this.graph.isEnabled() && this.graph.getSelectionCount() < this.graph.graphHandler.maxCells) ? '' : 'none'; - } - }); - - this.selectionHandler = mxUtils.bind(this, function(sender, evt) - { - update(); - }); - - this.graph.getSelectionModel().addListener(mxEvent.CHANGE, this.selectionHandler); - - this.changeHandler = mxUtils.bind(this, function(sender, evt) - { - this.updateLinkHint(this.graph.getLinkForCell(this.state.cell), - this.graph.getLinksForState(this.state)); - update(); - this.redrawHandles(); - }); - - this.graph.getModel().addListener(mxEvent.CHANGE, this.changeHandler); - - var link = this.graph.getLinkForCell(this.state.cell); - var links = this.graph.getLinksForState(this.state); - - if (link != null || (links != null && links.length > 0)) - { - this.updateLinkHint(link, links); - this.redrawHandles(); - } - }; - - // Disables connection points - var connectionHandlerInit = mxConnectionHandler.prototype.init; - - mxConnectionHandler.prototype.init = function() - { - connectionHandlerInit.apply(this, arguments); - - this.constraintHandler.isEnabled = mxUtils.bind(this, function() - { - return this.graph.connectionHandler.isEnabled(); - }); - }; - - var vertexHandlerRedrawHandles = mxVertexHandler.prototype.redrawHandles; - mxVertexHandler.prototype.redrawHandles = function() - { - vertexHandlerRedrawHandles.apply(this); - - if (this.state != null && this.linkHint != null) - { - var c = new mxPoint(this.state.getCenterX(), this.state.getCenterY()); - var tmp = new mxRectangle(this.state.x, this.state.y - 22, this.state.width + 24, this.state.height + 22); - var bb = mxUtils.getBoundingBox(tmp, this.state.style[mxConstants.STYLE_ROTATION] || '0', c); - var rs = (bb != null) ? mxUtils.getBoundingBox(this.state, - this.state.style[mxConstants.STYLE_ROTATION] || '0') : this.state; - var tb = (this.state.text != null) ? this.state.text.boundingBox : null; - - if (bb == null) - { - bb = this.state; - } - - var b = bb.y + bb.height; - - if (tb != null) - { - b = Math.max(b, tb.y + tb.height); - } - - this.linkHint.style.left = Math.max(0, Math.round(rs.x + (rs.width - this.linkHint.clientWidth) / 2)) + 'px'; - this.linkHint.style.top = Math.round(b + this.verticalOffset / 2 + 6 + - this.state.view.graph.tolerance) + 'px'; - } - }; - - - var vertexHandlerReset = mxVertexHandler.prototype.reset; - mxVertexHandler.prototype.reset = function() - { - vertexHandlerReset.apply(this, arguments); - - // Shows rotation handle only if one vertex is selected - if (this.rotationShape != null && this.rotationShape.node != null) - { - this.rotationShape.node.style.display = (this.graph.getSelectionCount() == 1) ? '' : 'none'; - } - }; - - var vertexHandlerDestroy = mxVertexHandler.prototype.destroy; - mxVertexHandler.prototype.destroy = function() - { - vertexHandlerDestroy.apply(this, arguments); - - if (this.linkHint != null) - { - this.linkHint.parentNode.removeChild(this.linkHint); - this.linkHint = null; - } - - if (this.selectionHandler != null) - { - this.graph.getSelectionModel().removeListener(this.selectionHandler); - this.selectionHandler = null; - } - - if (this.changeHandler != null) - { - this.graph.getModel().removeListener(this.changeHandler); - this.changeHandler = null; - } - - if (this.editingHandler != null) - { - this.graph.removeListener(this.editingHandler); - this.editingHandler = null; - } - }; - - var edgeHandlerRedrawHandles = mxEdgeHandler.prototype.redrawHandles; - mxEdgeHandler.prototype.redrawHandles = function() - { - // Workaround for special case where handler - // is reset before this which leads to a NPE - if (this.marker != null) - { - edgeHandlerRedrawHandles.apply(this); - - if (this.state != null && this.linkHint != null) - { - var b = this.state; - - if (this.state.text != null && this.state.text.bounds != null) - { - b = new mxRectangle(b.x, b.y, b.width, b.height); - b.add(this.state.text.bounds); - } - - this.linkHint.style.left = Math.max(0, Math.round(b.x + (b.width - this.linkHint.clientWidth) / 2)) + 'px'; - this.linkHint.style.top = Math.round(b.y + b.height + 6 + this.state.view.graph.tolerance) + 'px'; - } - } - }; - - var edgeHandlerReset = mxEdgeHandler.prototype.reset; - mxEdgeHandler.prototype.reset = function() - { - edgeHandlerReset.apply(this, arguments); - - if (this.linkHint != null) - { - this.linkHint.style.visibility = ''; - } - }; - - var edgeHandlerDestroy = mxEdgeHandler.prototype.destroy; - mxEdgeHandler.prototype.destroy = function() - { - edgeHandlerDestroy.apply(this, arguments); - - if (this.linkHint != null) - { - this.linkHint.parentNode.removeChild(this.linkHint); - this.linkHint = null; - } - - if (this.selectionHandler != null) - { - this.graph.getSelectionModel().removeListener(this.selectionHandler); - this.selectionHandler = null; - } - - if (this.changeHandler != null) - { - this.graph.getModel().removeListener(this.changeHandler); - this.changeHandler = null; - } - }; - })(); -} diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Init.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Init.js deleted file mode 100644 index 5de5872f..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Init.js +++ /dev/null @@ -1,30 +0,0 @@ -// urlParams is null when used for embedding -window.urlParams = window.urlParams || {}; - -// Public global variables -window.MAX_REQUEST_SIZE = window.MAX_REQUEST_SIZE || 10485760; -window.MAX_AREA = window.MAX_AREA || 15000 * 15000; - -// URLs for save and export -window.EXPORT_URL = window.EXPORT_URL || '/export'; -window.SAVE_URL = window.SAVE_URL || '/save'; -window.OPEN_URL = window.OPEN_URL || '/open'; -window.RESOURCES_PATH = window.RESOURCES_PATH || 'resources'; -window.RESOURCE_BASE = window.RESOURCE_BASE || window.RESOURCES_PATH + '/grapheditor'; -window.STENCIL_PATH = window.STENCIL_PATH || 'stencils'; -window.IMAGE_PATH = window.IMAGE_PATH || 'images'; -window.STYLE_PATH = window.STYLE_PATH || 'styles'; -window.CSS_PATH = window.CSS_PATH || 'styles'; -window.OPEN_FORM = window.OPEN_FORM || 'open.html'; - -// Sets the base path, the UI language via URL param and configures the -// supported languages to avoid 404s. The loading of all core language -// resources is disabled as all required resources are in grapheditor. -// properties. Note that in this example the loading of two resource -// files (the special bundle and the default bundle) is disabled to -// save a GET request. This requires that all resources be present in -// each properties file since only one file is loaded. - -window.mxBasePath = window.mxBasePath || '../../../src'; -window.mxLanguage = window.mxLanguage || urlParams['lang']; -window.mxLanguages = window.mxLanguages || ['de','zh']; \ No newline at end of file diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Menus.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Menus.js deleted file mode 100644 index 9b0ac24e..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Menus.js +++ /dev/null @@ -1,1315 +0,0 @@ -/** - * Copyright (c) 2006-2012, JGraph Ltd - */ -/** - * Constructs a new graph editor - */ -Menus = function(editorUi) -{ - this.editorUi = editorUi; - this.menus = new Object(); - this.init(); - - // Pre-fetches checkmark image - if (!mxClient.IS_SVG) - { - new Image().src = this.checkmarkImage; - } -}; - -/** - * Sets the default font family. - */ -Menus.prototype.defaultFont = 'Helvetica'; - -/** - * Sets the default font size. - */ -Menus.prototype.defaultFontSize = '12'; - -/** - * Sets the default font size. - */ -Menus.prototype.defaultMenuItems = ['file', 'edit', 'view', 'arrange', 'extras', 'help']; - -/** - * Adds the label menu items to the given menu and parent. - */ -Menus.prototype.defaultFonts = ['Helvetica', 'Verdana', 'Times New Roman', 'Garamond', 'Comic Sans MS', - 'Courier New', 'Georgia', 'Lucida Console', 'Tahoma']; - -/** - * Adds the label menu items to the given menu and parent. - */ -Menus.prototype.init = function() -{ - var graph = this.editorUi.editor.graph; - var isGraphEnabled = mxUtils.bind(graph, graph.isEnabled); - - this.customFonts = []; - this.customFontSizes = []; - - this.put('fontFamily', new Menu(mxUtils.bind(this, function(menu, parent) - { - var addItem = mxUtils.bind(this, function(fontname) - { - var tr = this.styleChange(menu, fontname, [mxConstants.STYLE_FONTFAMILY], [fontname], null, parent, function() - { - document.execCommand('fontname', false, fontname); - }, function() - { - graph.updateLabelElements(graph.getSelectionCells(), function(elt) - { - elt.removeAttribute('face'); - elt.style.fontFamily = null; - - if (elt.nodeName == 'PRE') - { - graph.replaceElement(elt, 'div'); - } - }); - }); - tr.firstChild.nextSibling.style.fontFamily = fontname; - }); - - for (var i = 0; i < this.defaultFonts.length; i++) - { - addItem(this.defaultFonts[i]); - } - - menu.addSeparator(parent); - - if (this.customFonts.length > 0) - { - for (var i = 0; i < this.customFonts.length; i++) - { - addItem(this.customFonts[i]); - } - - menu.addSeparator(parent); - - menu.addItem(mxResources.get('reset'), null, mxUtils.bind(this, function() - { - this.customFonts = []; - }), parent); - - menu.addSeparator(parent); - } - - this.promptChange(menu, mxResources.get('custom') + '...', '', mxConstants.DEFAULT_FONTFAMILY, mxConstants.STYLE_FONTFAMILY, parent, true, mxUtils.bind(this, function(newValue) - { - this.customFonts.push(newValue); - })); - }))); - this.put('formatBlock', new Menu(mxUtils.bind(this, function(menu, parent) - { - function addItem(label, tag) - { - return menu.addItem(label, null, mxUtils.bind(this, function() - { - // TODO: Check if visible - graph.cellEditor.textarea.focus(); - document.execCommand('formatBlock', false, '<' + tag + '>'); - }), parent); - }; - - addItem(mxResources.get('normal'), 'p'); - - addItem('', 'h1').firstChild.nextSibling.innerHTML = '

' + mxResources.get('heading') + ' 1

'; - addItem('', 'h2').firstChild.nextSibling.innerHTML = '

' + mxResources.get('heading') + ' 2

'; - addItem('', 'h3').firstChild.nextSibling.innerHTML = '

' + mxResources.get('heading') + ' 3

'; - addItem('', 'h4').firstChild.nextSibling.innerHTML = '

' + mxResources.get('heading') + ' 4

'; - addItem('', 'h5').firstChild.nextSibling.innerHTML = '
' + mxResources.get('heading') + ' 5
'; - addItem('', 'h6').firstChild.nextSibling.innerHTML = '
' + mxResources.get('heading') + ' 6
'; - - addItem('', 'pre').firstChild.nextSibling.innerHTML = '
' + mxResources.get('formatted') + '
'; - addItem('', 'blockquote').firstChild.nextSibling.innerHTML = '
' + mxResources.get('blockquote') + '
'; - }))); - this.put('fontSize', new Menu(mxUtils.bind(this, function(menu, parent) - { - var sizes = [6, 8, 9, 10, 11, 12, 14, 18, 24, 36, 48, 72]; - - var addItem = mxUtils.bind(this, function(fontsize) - { - this.styleChange(menu, fontsize, [mxConstants.STYLE_FONTSIZE], [fontsize], null, parent, function() - { - // Creates an element with arbitrary size 3 - document.execCommand('fontSize', false, '3'); - - // Changes the css font size of the first font element inside the in-place editor with size 3 - // hopefully the above element that we've just created. LATER: Check for new element using - // previous result of getElementsByTagName (see other actions) - var elts = graph.cellEditor.textarea.getElementsByTagName('font'); - - for (var i = 0; i < elts.length; i++) - { - if (elts[i].getAttribute('size') == '3') - { - elts[i].removeAttribute('size'); - elts[i].style.fontSize = fontsize + 'px'; - - break; - } - } - }); - }); - - for (var i = 0; i < sizes.length; i++) - { - addItem(sizes[i]); - } - - menu.addSeparator(parent); - - if (this.customFontSizes.length > 0) - { - for (var i = 0; i < this.customFontSizes.length; i++) - { - addItem(this.customFontSizes[i]); - } - - menu.addSeparator(parent); - - menu.addItem(mxResources.get('reset'), null, mxUtils.bind(this, function() - { - this.customFontSizes = []; - }), parent); - - menu.addSeparator(parent); - } - - this.promptChange(menu, mxResources.get('custom') + '...', '(pt)', '12', mxConstants.STYLE_FONTSIZE, parent, true, mxUtils.bind(this, function(newValue) - { - this.customFontSizes.push(newValue); - })); - }))); - this.put('direction', new Menu(mxUtils.bind(this, function(menu, parent) - { - menu.addItem(mxResources.get('flipH'), null, function() { graph.toggleCellStyles(mxConstants.STYLE_FLIPH, false); }, parent); - menu.addItem(mxResources.get('flipV'), null, function() { graph.toggleCellStyles(mxConstants.STYLE_FLIPV, false); }, parent); - this.addMenuItems(menu, ['-', 'rotation'], parent); - }))); - this.put('align', new Menu(mxUtils.bind(this, function(menu, parent) - { - menu.addItem(mxResources.get('leftAlign'), null, function() { graph.alignCells(mxConstants.ALIGN_LEFT); }, parent); - menu.addItem(mxResources.get('center'), null, function() { graph.alignCells(mxConstants.ALIGN_CENTER); }, parent); - menu.addItem(mxResources.get('rightAlign'), null, function() { graph.alignCells(mxConstants.ALIGN_RIGHT); }, parent); - menu.addSeparator(parent); - menu.addItem(mxResources.get('topAlign'), null, function() { graph.alignCells(mxConstants.ALIGN_TOP); }, parent); - menu.addItem(mxResources.get('middle'), null, function() { graph.alignCells(mxConstants.ALIGN_MIDDLE); }, parent); - menu.addItem(mxResources.get('bottomAlign'), null, function() { graph.alignCells(mxConstants.ALIGN_BOTTOM); }, parent); - }))); - this.put('distribute', new Menu(mxUtils.bind(this, function(menu, parent) - { - menu.addItem(mxResources.get('horizontal'), null, function() { graph.distributeCells(true); }, parent); - menu.addItem(mxResources.get('vertical'), null, function() { graph.distributeCells(false); }, parent); - }))); - this.put('layout', new Menu(mxUtils.bind(this, function(menu, parent) - { - var promptSpacing = mxUtils.bind(this, function(defaultValue, fn) - { - var dlg = new FilenameDialog(this.editorUi, defaultValue, mxResources.get('apply'), function(newValue) - { - fn(parseFloat(newValue)); - }, mxResources.get('spacing')); - this.editorUi.showDialog(dlg.container, 300, 80, true, true); - dlg.init(); - }); - - menu.addItem(mxResources.get('horizontalFlow'), null, mxUtils.bind(this, function() - { - var layout = new mxHierarchicalLayout(graph, mxConstants.DIRECTION_WEST); - - this.editorUi.executeLayout(function() - { - var selectionCells = graph.getSelectionCells(); - layout.execute(graph.getDefaultParent(), selectionCells.length == 0 ? null : selectionCells); - }, true); - }), parent); - menu.addItem(mxResources.get('verticalFlow'), null, mxUtils.bind(this, function() - { - var layout = new mxHierarchicalLayout(graph, mxConstants.DIRECTION_NORTH); - - this.editorUi.executeLayout(function() - { - var selectionCells = graph.getSelectionCells(); - layout.execute(graph.getDefaultParent(), selectionCells.length == 0 ? null : selectionCells); - }, true); - }), parent); - menu.addSeparator(parent); - menu.addItem(mxResources.get('horizontalTree'), null, mxUtils.bind(this, function() - { - var tmp = graph.getSelectionCell(); - var roots = null; - - if (tmp == null || graph.getModel().getChildCount(tmp) == 0) - { - if (graph.getModel().getEdgeCount(tmp) == 0) - { - roots = graph.findTreeRoots(graph.getDefaultParent()); - } - } - else - { - roots = graph.findTreeRoots(tmp); - } - - if (roots != null && roots.length > 0) - { - tmp = roots[0]; - } - - if (tmp != null) - { - var layout = new mxCompactTreeLayout(graph, true); - layout.edgeRouting = false; - layout.levelDistance = 30; - - promptSpacing(layout.levelDistance, mxUtils.bind(this, function(newValue) - { - layout.levelDistance = newValue; - - this.editorUi.executeLayout(function() - { - layout.execute(graph.getDefaultParent(), tmp); - }, true); - })); - } - }), parent); - menu.addItem(mxResources.get('verticalTree'), null, mxUtils.bind(this, function() - { - var tmp = graph.getSelectionCell(); - var roots = null; - - if (tmp == null || graph.getModel().getChildCount(tmp) == 0) - { - if (graph.getModel().getEdgeCount(tmp) == 0) - { - roots = graph.findTreeRoots(graph.getDefaultParent()); - } - } - else - { - roots = graph.findTreeRoots(tmp); - } - - if (roots != null && roots.length > 0) - { - tmp = roots[0]; - } - - if (tmp != null) - { - var layout = new mxCompactTreeLayout(graph, false); - layout.edgeRouting = false; - layout.levelDistance = 30; - - promptSpacing(layout.levelDistance, mxUtils.bind(this, function(newValue) - { - layout.levelDistance = newValue; - - this.editorUi.executeLayout(function() - { - layout.execute(graph.getDefaultParent(), tmp); - }, true); - })); - } - }), parent); - menu.addItem(mxResources.get('radialTree'), null, mxUtils.bind(this, function() - { - var tmp = graph.getSelectionCell(); - var roots = null; - - if (tmp == null || graph.getModel().getChildCount(tmp) == 0) - { - if (graph.getModel().getEdgeCount(tmp) == 0) - { - roots = graph.findTreeRoots(graph.getDefaultParent()); - } - } - else - { - roots = graph.findTreeRoots(tmp); - } - - if (roots != null && roots.length > 0) - { - tmp = roots[0]; - } - - if (tmp != null) - { - var layout = new mxRadialTreeLayout(graph, false); - layout.levelDistance = 80; - layout.autoRadius = true; - - promptSpacing(layout.levelDistance, mxUtils.bind(this, function(newValue) - { - layout.levelDistance = newValue; - - this.editorUi.executeLayout(function() - { - layout.execute(graph.getDefaultParent(), tmp); - - if (!graph.isSelectionEmpty()) - { - tmp = graph.getModel().getParent(tmp); - - if (graph.getModel().isVertex(tmp)) - { - graph.updateGroupBounds([tmp], graph.gridSize * 2, true); - } - } - }, true); - })); - } - }), parent); - menu.addSeparator(parent); - menu.addItem(mxResources.get('organic'), null, mxUtils.bind(this, function() - { - var layout = new mxFastOrganicLayout(graph); - - promptSpacing(layout.forceConstant, mxUtils.bind(this, function(newValue) - { - layout.forceConstant = newValue; - - this.editorUi.executeLayout(function() - { - var tmp = graph.getSelectionCell(); - - if (tmp == null || graph.getModel().getChildCount(tmp) == 0) - { - tmp = graph.getDefaultParent(); - } - - layout.execute(tmp); - - if (graph.getModel().isVertex(tmp)) - { - graph.updateGroupBounds([tmp], graph.gridSize * 2, true); - } - }, true); - })); - }), parent); - menu.addItem(mxResources.get('circle'), null, mxUtils.bind(this, function() - { - var layout = new mxCircleLayout(graph); - - this.editorUi.executeLayout(function() - { - var tmp = graph.getSelectionCell(); - - if (tmp == null || graph.getModel().getChildCount(tmp) == 0) - { - tmp = graph.getDefaultParent(); - } - - layout.execute(tmp); - - if (graph.getModel().isVertex(tmp)) - { - graph.updateGroupBounds([tmp], graph.gridSize * 2, true); - } - }, true); - }), parent); - }))); - this.put('navigation', new Menu(mxUtils.bind(this, function(menu, parent) - { - this.addMenuItems(menu, ['home', '-', 'exitGroup', 'enterGroup', '-', 'expand', 'collapse', '-', 'collapsible'], parent); - }))); - this.put('arrange', new Menu(mxUtils.bind(this, function(menu, parent) - { - this.addMenuItems(menu, ['toFront', 'toBack', '-'], parent); - this.addSubmenu('direction', menu, parent); - this.addMenuItems(menu, ['turn', '-'], parent); - this.addSubmenu('align', menu, parent); - this.addSubmenu('distribute', menu, parent); - menu.addSeparator(parent); - this.addSubmenu('navigation', menu, parent); - this.addSubmenu('insert', menu, parent); - this.addSubmenu('layout', menu, parent); - this.addMenuItems(menu, ['-', 'group', 'ungroup', 'removeFromGroup', '-', 'clearWaypoints', 'autosize'], parent); - }))).isEnabled = isGraphEnabled; - this.put('insert', new Menu(mxUtils.bind(this, function(menu, parent) - { - this.addMenuItems(menu, ['insertLink', 'insertImage'], parent); - }))); - this.put('view', new Menu(mxUtils.bind(this, function(menu, parent) - { - this.addMenuItems(menu, ((this.editorUi.format != null) ? ['formatPanel'] : []). - concat(['outline', 'layers', '-', 'pageView', 'pageScale', '-', 'scrollbars', 'tooltips', '-', - 'grid', 'guides', '-', 'connectionArrows', 'connectionPoints', '-', - 'resetView', 'zoomIn', 'zoomOut'], parent)); - }))); - // Two special dropdowns that are only used in the toolbar - this.put('viewPanels', new Menu(mxUtils.bind(this, function(menu, parent) - { - if (this.editorUi.format != null) - { - this.addMenuItems(menu, ['formatPanel'], parent); - } - - this.addMenuItems(menu, ['outline', 'layers'], parent); - }))); - this.put('viewZoom', new Menu(mxUtils.bind(this, function(menu, parent) - { - this.addMenuItems(menu, ['resetView', '-'], parent); - var scales = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4]; - - for (var i = 0; i < scales.length; i++) - { - (function(scale) - { - menu.addItem((scale * 100) + '%', null, function() - { - graph.zoomTo(scale); - }, parent); - })(scales[i]); - } - - this.addMenuItems(menu, ['-', 'fitWindow', 'fitPageWidth', 'fitPage', 'fitTwoPages', '-', 'customZoom'], parent); - }))); - this.put('file', new Menu(mxUtils.bind(this, function(menu, parent) - { - this.addMenuItems(menu, ['new', 'open', '-', 'save', 'saveAs', '-', 'import', 'export', '-', 'pageSetup', 'print'], parent); - }))); - this.put('edit', new Menu(mxUtils.bind(this, function(menu, parent) - { - this.addMenuItems(menu, ['undo', 'redo', '-', 'cut', 'copy', 'paste', 'delete', '-', 'duplicate', '-', - 'editData', 'editTooltip', 'editStyle', '-', 'edit', '-', 'editLink', 'openLink', '-', - 'selectVertices', 'selectEdges', 'selectAll', 'selectNone', '-', 'lockUnlock']); - }))); - this.put('extras', new Menu(mxUtils.bind(this, function(menu, parent) - { - this.addMenuItems(menu, ['copyConnect', 'collapseExpand', '-', 'editDiagram']); - }))); - this.put('help', new Menu(mxUtils.bind(this, function(menu, parent) - { - this.addMenuItems(menu, ['help', '-', 'about']); - }))); -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -Menus.prototype.put = function(name, menu) -{ - this.menus[name] = menu; - - return menu; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -Menus.prototype.get = function(name) -{ - return this.menus[name]; -}; - -/** - * Adds the given submenu. - */ -Menus.prototype.addSubmenu = function(name, menu, parent, label) -{ - var entry = this.get(name); - - if (entry != null) - { - var enabled = entry.isEnabled(); - - if (menu.showDisabled || enabled) - { - var submenu = menu.addItem(label || mxResources.get(name), null, null, parent, null, enabled); - this.addMenu(name, menu, submenu); - } - } -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -Menus.prototype.addMenu = function(name, popupMenu, parent) -{ - var menu = this.get(name); - - if (menu != null && (popupMenu.showDisabled || menu.isEnabled())) - { - this.get(name).execute(popupMenu, parent); - } -}; - -/** - * Adds a menu item to insert a table. - */ -Menus.prototype.addInsertTableItem = function(menu) -{ - // KNOWN: Does not work in IE8 standards and quirks - var graph = this.editorUi.editor.graph; - - function createTable(rows, cols) - { - var html = ['']; - - for (var i = 0; i < rows; i++) - { - html.push(''); - - for (var j = 0; j < cols; j++) - { - html.push(''); - } - - html.push(''); - } - - html.push('

'); - - return html.join(''); - }; - - // Show table size dialog - var elt2 = menu.addItem('', null, mxUtils.bind(this, function(evt) - { - var td = graph.getParentByName(mxEvent.getSource(evt), 'TD'); - - if (td != null) - { - var row2 = graph.getParentByName(td, 'TR'); - - // To find the new link, we create a list of all existing links first - // LATER: Refactor for reuse with code for finding inserted image below - var tmp = graph.cellEditor.textarea.getElementsByTagName('table'); - var oldTables = []; - - for (var i = 0; i < tmp.length; i++) - { - oldTables.push(tmp[i]); - } - - // Finding the new table will work with insertHTML, but IE does not support that - graph.container.focus(); - graph.pasteHtmlAtCaret(createTable(row2.sectionRowIndex + 1, td.cellIndex + 1)); - - // Moves cursor to first table cell - var newTables = graph.cellEditor.textarea.getElementsByTagName('table'); - - if (newTables.length == oldTables.length + 1) - { - // Inverse order in favor of appended tables - for (var i = newTables.length - 1; i >= 0; i--) - { - if (i == 0 || newTables[i] != oldTables[i - 1]) - { - graph.selectNode(newTables[i].rows[0].cells[0]); - break; - } - } - } - } - })); - - // Quirks mode does not add cell padding if cell is empty, needs good old spacer solution - var quirksCellHtml = ''; - - function createPicker(rows, cols) - { - var table2 = document.createElement('table'); - table2.setAttribute('border', '1'); - table2.style.borderCollapse = 'collapse'; - - if (!mxClient.IS_QUIRKS) - { - table2.setAttribute('cellPadding', '8'); - } - - for (var i = 0; i < rows; i++) - { - var row = table2.insertRow(i); - - for (var j = 0; j < cols; j++) - { - var cell = row.insertCell(-1); - - if (mxClient.IS_QUIRKS) - { - cell.innerHTML = quirksCellHtml; - } - } - } - - return table2; - }; - - function extendPicker(picker, rows, cols) - { - for (var i = picker.rows.length; i < rows; i++) - { - var row = picker.insertRow(i); - - for (var j = 0; j < picker.rows[0].cells.length; j++) - { - var cell = row.insertCell(-1); - - if (mxClient.IS_QUIRKS) - { - cell.innerHTML = quirksCellHtml; - } - } - } - - for (var i = 0; i < picker.rows.length; i++) - { - var row = picker.rows[i]; - - for (var j = row.cells.length; j < cols; j++) - { - var cell = row.insertCell(-1); - - if (mxClient.IS_QUIRKS) - { - cell.innerHTML = quirksCellHtml; - } - } - } - }; - - elt2.firstChild.innerHTML = ''; - var picker = createPicker(5, 5); - elt2.firstChild.appendChild(picker); - - var label = document.createElement('div'); - label.style.padding = '4px'; - label.style.fontSize = Menus.prototype.defaultFontSize + 'px'; - label.innerHTML = '1x1'; - elt2.firstChild.appendChild(label); - - mxEvent.addListener(picker, 'mouseover', function(e) - { - var td = graph.getParentByName(mxEvent.getSource(e), 'TD'); - - if (td != null) - { - var row2 = graph.getParentByName(td, 'TR'); - extendPicker(picker, Math.min(20, row2.sectionRowIndex + 2), Math.min(20, td.cellIndex + 2)); - label.innerHTML = (td.cellIndex + 1) + 'x' + (row2.sectionRowIndex + 1); - - for (var i = 0; i < picker.rows.length; i++) - { - var r = picker.rows[i]; - - for (var j = 0; j < r.cells.length; j++) - { - var cell = r.cells[j]; - - if (i <= row2.sectionRowIndex && j <= td.cellIndex) - { - cell.style.backgroundColor = 'blue'; - } - else - { - cell.style.backgroundColor = 'white'; - } - } - } - - mxEvent.consume(e); - } - }); -}; - -/** - * Adds a style change item to the given menu. - */ -Menus.prototype.edgeStyleChange = function(menu, label, keys, values, sprite, parent, reset) -{ - return menu.addItem(label, null, mxUtils.bind(this, function() - { - var graph = this.editorUi.editor.graph; - graph.stopEditing(false); - - graph.getModel().beginUpdate(); - try - { - var cells = graph.getSelectionCells(); - var edges = []; - - for (var i = 0; i < cells.length; i++) - { - var cell = cells[i]; - - if (graph.getModel().isEdge(cell)) - { - if (reset) - { - var geo = graph.getCellGeometry(cell); - - // Resets all edge points - if (geo != null) - { - geo = geo.clone(); - geo.points = null; - graph.getModel().setGeometry(cell, geo); - } - } - - for (var j = 0; j < keys.length; j++) - { - graph.setCellStyles(keys[j], values[j], [cell]); - } - - edges.push(cell); - } - } - - this.editorUi.fireEvent(new mxEventObject('styleChanged', 'keys', keys, - 'values', values, 'cells', edges)); - } - finally - { - graph.getModel().endUpdate(); - } - }), parent, sprite); -}; - -/** - * Adds a style change item to the given menu. - */ -Menus.prototype.styleChange = function(menu, label, keys, values, sprite, parent, fn, post) -{ - var apply = this.createStyleChangeFunction(keys, values); - - return menu.addItem(label, null, mxUtils.bind(this, function() - { - var graph = this.editorUi.editor.graph; - - if (fn != null && graph.cellEditor.isContentEditing()) - { - fn(); - } - else - { - apply(post); - } - }), parent, sprite); -}; - -/** - * - */ -Menus.prototype.createStyleChangeFunction = function(keys, values) -{ - return mxUtils.bind(this, function(post) - { - var graph = this.editorUi.editor.graph; - graph.stopEditing(false); - - graph.getModel().beginUpdate(); - try - { - for (var i = 0; i < keys.length; i++) - { - graph.setCellStyles(keys[i], values[i]); - } - - if (post != null) - { - post(); - } - - this.editorUi.fireEvent(new mxEventObject('styleChanged', 'keys', keys, 'values', values, - 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); -}; - -/** - * Adds a style change item with a prompt to the given menu. - */ -Menus.prototype.promptChange = function(menu, label, hint, defaultValue, key, parent, enabled, fn, sprite) -{ - return menu.addItem(label, null, mxUtils.bind(this, function() - { - var graph = this.editorUi.editor.graph; - var value = defaultValue; - var state = graph.getView().getState(graph.getSelectionCell()); - - if (state != null) - { - value = state.style[key] || value; - } - - var dlg = new FilenameDialog(this.editorUi, value, mxResources.get('apply'), mxUtils.bind(this, function(newValue) - { - if (newValue != null && newValue.length > 0) - { - graph.getModel().beginUpdate(); - try - { - graph.stopEditing(false); - graph.setCellStyles(key, newValue); - } - finally - { - graph.getModel().endUpdate(); - } - - if (fn != null) - { - fn(newValue); - } - } - }), mxResources.get('enterValue') + ((hint.length > 0) ? (' ' + hint) : '')); - this.editorUi.showDialog(dlg.container, 300, 80, true, true); - dlg.init(); - }), parent, sprite, enabled); -}; - -/** - * Adds a handler for showing a menu in the given element. - */ -Menus.prototype.pickColor = function(key, cmd, defaultValue) -{ - var graph = this.editorUi.editor.graph; - - if (cmd != null && graph.cellEditor.isContentEditing()) - { - // Saves and restores text selection for in-place editor - var selState = graph.cellEditor.saveSelection(); - - var dlg = new ColorDialog(this.editorUi, defaultValue || '000000', mxUtils.bind(this, function(color) - { - graph.cellEditor.restoreSelection(selState); - document.execCommand(cmd, false, (color != mxConstants.NONE) ? color : 'transparent'); - }), function() - { - graph.cellEditor.restoreSelection(selState); - }); - this.editorUi.showDialog(dlg.container, 230, 430, true, true); - dlg.init(); - } - else - { - if (this.colorDialog == null) - { - this.colorDialog = new ColorDialog(this.editorUi); - } - - this.colorDialog.currentColorKey = key; - var state = graph.getView().getState(graph.getSelectionCell()); - var color = 'none'; - - if (state != null) - { - color = state.style[key] || color; - } - - if (color == 'none') - { - color = 'ffffff'; - this.colorDialog.picker.fromString('ffffff'); - this.colorDialog.colorInput.value = 'none'; - } - else - { - this.colorDialog.picker.fromString(color); - } - - this.editorUi.showDialog(this.colorDialog.container, 230, 430, true, true); - this.colorDialog.init(); - } -}; - -/** - * Adds a handler for showing a menu in the given element. - */ -Menus.prototype.toggleStyle = function(key, defaultValue) -{ - var graph = this.editorUi.editor.graph; - var value = graph.toggleCellStyles(key, defaultValue); - this.editorUi.fireEvent(new mxEventObject('styleChanged', 'keys', [key], 'values', [value], - 'cells', graph.getSelectionCells())); -}; - -/** - * Creates the keyboard event handler for the current graph and history. - */ -Menus.prototype.addMenuItem = function(menu, key, parent, trigger, sprite, label) -{ - var action = this.editorUi.actions.get(key); - - if (action != null && (menu.showDisabled || action.isEnabled()) && action.visible) - { - var item = menu.addItem(label || action.label, null, function() - { - action.funct(trigger); - }, parent, sprite, action.isEnabled()); - - // Adds checkmark image - if (action.toggleAction && action.isSelected()) - { - menu.addCheckmark(item, Editor.checkmarkImage); - } - - this.addShortcut(item, action); - - return item; - } - - return null; -}; - -/** - * Adds a checkmark to the given menuitem. - */ -Menus.prototype.addShortcut = function(item, action) -{ - if (action.shortcut != null) - { - var td = item.firstChild.nextSibling.nextSibling; - var span = document.createElement('span'); - span.style.color = 'gray'; - mxUtils.write(span, action.shortcut); - td.appendChild(span); - } -}; - -/** - * Creates the keyboard event handler for the current graph and history. - */ -Menus.prototype.addMenuItems = function(menu, keys, parent, trigger, sprites) -{ - for (var i = 0; i < keys.length; i++) - { - if (keys[i] == '-') - { - menu.addSeparator(parent); - } - else - { - this.addMenuItem(menu, keys[i], parent, trigger, (sprites != null) ? sprites[i] : null); - } - } -}; - -/** - * Creates the keyboard event handler for the current graph and history. - */ -Menus.prototype.createPopupMenu = function(menu, cell, evt) -{ - var graph = this.editorUi.editor.graph; - menu.smartSeparators = true; - - if (graph.isSelectionEmpty()) - { - this.addMenuItems(menu, ['undo', 'redo', 'pasteHere'], null, evt); - } - else - { - this.addMenuItems(menu, ['delete', '-', 'cut', 'copy', '-', 'duplicate'], null, evt); - } - - if (!graph.isSelectionEmpty()) - { - if (graph.getSelectionCount() == 1) - { - this.addMenuItems(menu, ['setAsDefaultStyle'], null, evt); - } - - menu.addSeparator(); - - cell = graph.getSelectionCell(); - var state = graph.view.getState(cell); - - if (state != null) - { - var hasWaypoints = false; - this.addMenuItems(menu, ['toFront', 'toBack', '-'], null, evt); - - if (graph.getModel().isEdge(cell) && mxUtils.getValue(state.style, mxConstants.STYLE_EDGE, null) != 'entityRelationEdgeStyle' && - mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null) != 'arrow') - { - var handler = graph.selectionCellsHandler.getHandler(cell); - var isWaypoint = false; - - if (handler instanceof mxEdgeHandler && handler.bends != null && handler.bends.length > 2) - { - var index = handler.getHandleForEvent(graph.updateMouseEvent(new mxMouseEvent(evt))); - - // Configures removeWaypoint action before execution - // Using trigger parameter is cleaner but have to find waypoint here anyway. - var rmWaypointAction = this.editorUi.actions.get('removeWaypoint'); - rmWaypointAction.handler = handler; - rmWaypointAction.index = index; - - isWaypoint = index > 0 && index < handler.bends.length - 1; - } - - menu.addSeparator(); - this.addMenuItem(menu, 'turn', null, evt, null, mxResources.get('reverse')); - this.addMenuItems(menu, [(isWaypoint) ? 'removeWaypoint' : 'addWaypoint'], null, evt); - - // Adds reset waypoints option if waypoints exist - var geo = graph.getModel().getGeometry(cell); - hasWaypoints = geo != null && geo.points != null && geo.points.length > 0; - } - - if (graph.getSelectionCount() == 1 && (hasWaypoints || (graph.getModel().isVertex(cell) && - graph.getModel().getEdgeCount(cell) > 0))) - { - this.addMenuItems(menu, ['clearWaypoints'], null, evt); - } - - if (graph.getSelectionCount() > 1) - { - menu.addSeparator(); - this.addMenuItems(menu, ['group'], null, evt); - } - else if (graph.getSelectionCount() == 1 && !graph.getModel().isEdge(cell) && !graph.isSwimlane(cell) && - graph.getModel().getChildCount(cell) > 0) - { - menu.addSeparator(); - this.addMenuItems(menu, ['ungroup'], null, evt); - } - - if (graph.getSelectionCount() == 1) - { - menu.addSeparator(); - this.addMenuItems(menu, ['editData', 'editLink'], null, evt); - - // Shows edit image action if there is an image in the style - if (graph.getModel().isVertex(cell) && mxUtils.getValue(state.style, mxConstants.STYLE_IMAGE, null) != null) - { - menu.addSeparator(); - this.addMenuItem(menu, 'image', null, evt).firstChild.nextSibling.innerHTML = mxResources.get('editImage') + '...'; - } - } - } - } - else - { - this.addMenuItems(menu, ['-', 'selectVertices', 'selectEdges', - 'selectAll', '-', 'clearDefaultStyle'], null, evt); - } -}; - -/** - * Creates the keyboard event handler for the current graph and history. - */ -Menus.prototype.createMenubar = function(container) -{ - var menubar = new Menubar(this.editorUi, container); - var menus = this.defaultMenuItems; - - for (var i = 0; i < menus.length; i++) - { - (mxUtils.bind(this, function(menu) - { - var elt = menubar.addMenu(mxResources.get(menus[i]), mxUtils.bind(this, function() - { - // Allows extensions of menu.funct - menu.funct.apply(this, arguments); - })); - - this.menuCreated(menu, elt); - }))(this.get(menus[i])); - } - - return menubar; -}; - -/** - * Creates the keyboard event handler for the current graph and history. - */ -Menus.prototype.menuCreated = function(menu, elt, className) -{ - if (elt != null) - { - className = (className != null) ? className : 'geItem'; - - menu.addListener('stateChanged', function() - { - elt.enabled = menu.enabled; - - if (!menu.enabled) - { - elt.className = className + ' mxDisabled'; - - if (document.documentMode == 8) - { - elt.style.color = '#c3c3c3'; - } - } - else - { - elt.className = className; - - if (document.documentMode == 8) - { - elt.style.color = ''; - } - } - }); - } -}; - -/** - * Construcs a new menubar for the given editor. - */ -function Menubar(editorUi, container) -{ - this.editorUi = editorUi; - this.container = container; -}; - -/** - * Adds the menubar elements. - */ -Menubar.prototype.hideMenu = function() -{ - this.editorUi.hideCurrentMenu(); -}; - -/** - * Adds a submenu to this menubar. - */ -Menubar.prototype.addMenu = function(label, funct, before) -{ - var elt = document.createElement('a'); - elt.setAttribute('href', 'javascript:void(0);'); - elt.className = 'geItem'; - mxUtils.write(elt, label); - this.addMenuHandler(elt, funct); - - if (before != null) - { - this.container.insertBefore(elt, before); - } - else - { - this.container.appendChild(elt); - } - - return elt; -}; - -/** - * Adds a handler for showing a menu in the given element. - */ -Menubar.prototype.addMenuHandler = function(elt, funct) -{ - if (funct != null) - { - var show = true; - - var clickHandler = mxUtils.bind(this, function(evt) - { - if (show && elt.enabled == null || elt.enabled) - { - this.editorUi.editor.graph.popupMenuHandler.hideMenu(); - var menu = new mxPopupMenu(funct); - menu.div.className += ' geMenubarMenu'; - menu.smartSeparators = true; - menu.showDisabled = true; - menu.autoExpand = true; - - // Disables autoexpand and destroys menu when hidden - menu.hideMenu = mxUtils.bind(this, function() - { - mxPopupMenu.prototype.hideMenu.apply(menu, arguments); - this.editorUi.resetCurrentMenu(); - menu.destroy(); - }); - - var offset = mxUtils.getOffset(elt); - menu.popup(offset.x, offset.y + elt.offsetHeight, null, evt); - this.editorUi.setCurrentMenu(menu, elt); - } - - mxEvent.consume(evt); - }); - - // Shows menu automatically while in expanded state - mxEvent.addListener(elt, 'mousemove', mxUtils.bind(this, function(evt) - { - if (this.editorUi.currentMenu != null && this.editorUi.currentMenuElt != elt) - { - this.editorUi.hideCurrentMenu(); - clickHandler(evt); - } - })); - - // Hides menu if already showing - mxEvent.addListener(elt, 'mousedown', mxUtils.bind(this, function() - { - show = this.currentElt != elt; - })); - - mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt) - { - clickHandler(evt); - show = true; - })); - } -}; - -/** - * Creates the keyboard event handler for the current graph and history. - */ -Menubar.prototype.destroy = function() -{ - // do nothing -}; - -/** - * Constructs a new action for the given parameters. - */ -function Menu(funct, enabled) -{ - mxEventSource.call(this); - this.funct = funct; - this.enabled = (enabled != null) ? enabled : true; -}; - -// Menu inherits from mxEventSource -mxUtils.extend(Menu, mxEventSource); - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Menu.prototype.isEnabled = function() -{ - return this.enabled; -}; - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Menu.prototype.setEnabled = function(value) -{ - if (this.enabled != value) - { - this.enabled = value; - this.fireEvent(new mxEventObject('stateChanged')); - } -}; - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Menu.prototype.execute = function(menu, parent) -{ - this.funct(menu, parent); -}; - -/** - * "Installs" menus in EditorUi. - */ -EditorUi.prototype.createMenus = function() -{ - return new Menus(this); -}; diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Shapes.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Shapes.js deleted file mode 100644 index 03706891..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Shapes.js +++ /dev/null @@ -1,3879 +0,0 @@ -/** - * Copyright (c) 2006-2015, JGraph Ltd - */ - -/** - * Registers shapes. - */ -(function() -{ - // Cube Shape, supports size style - function CubeShape() - { - mxCylinder.call(this); - }; - mxUtils.extend(CubeShape, mxCylinder); - CubeShape.prototype.size = 20; - CubeShape.prototype.redrawPath = function(path, x, y, w, h, isForeground) - { - var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))))); - - if (isForeground) - { - path.moveTo(s, h); - path.lineTo(s, s); - path.lineTo(0, 0); - path.moveTo(s, s); - path.lineTo(w, s); - path.end(); - } - else - { - path.moveTo(0, 0); - path.lineTo(w - s, 0); - path.lineTo(w, s); - path.lineTo(w, h); - path.lineTo(s, h); - path.lineTo(0, h - s); - path.lineTo(0, 0); - path.close(); - path.end(); - } - }; - CubeShape.prototype.getLabelMargins = function(rect) - { - if (mxUtils.getValue(this.style, 'boundedLbl', false)) - { - var s = parseFloat(mxUtils.getValue(this.style, 'size', this.size)) * this.scale; - - return new mxRectangle(s, s, 0, 0); - } - - return null; - }; - - mxCellRenderer.registerShape('cube', CubeShape); - - var tan30 = Math.tan(mxUtils.toRadians(30)); - var tan30Dx = (0.5 - tan30) / 2; - - // Cube Shape, supports size style - function IsoRectangleShape() - { - mxActor.call(this); - }; - mxUtils.extend(IsoRectangleShape, mxActor); - IsoRectangleShape.prototype.size = 20; - IsoRectangleShape.prototype.redrawPath = function(path, x, y, w, h) - { - var m = Math.min(w, h / tan30); - - path.translate((w - m) / 2, (h - m) / 2 + m / 4); - path.moveTo(0, 0.25 * m); - path.lineTo(0.5 * m, m * tan30Dx); - path.lineTo(m, 0.25 * m); - path.lineTo(0.5 * m, (0.5 - tan30Dx) * m); - path.lineTo(0, 0.25 * m); - path.close(); - path.end(); - }; - - mxCellRenderer.registerShape('isoRectangle', IsoRectangleShape); - - // Cube Shape, supports size style - function IsoCubeShape() - { - mxCylinder.call(this); - }; - mxUtils.extend(IsoCubeShape, mxCylinder); - IsoCubeShape.prototype.size = 20; - IsoCubeShape.prototype.redrawPath = function(path, x, y, w, h, isForeground) - { - var m = Math.min(w, h / (0.5 + tan30)); - - if (isForeground) - { - path.moveTo(0, 0.25 * m); - path.lineTo(0.5 * m, (0.5 - tan30Dx) * m); - path.lineTo(m, 0.25 * m); - path.moveTo(0.5 * m, (0.5 - tan30Dx) * m); - path.lineTo(0.5 * m, (1 - tan30Dx) * m); - path.end(); - } - else - { - path.translate((w - m) / 2, (h - m) / 2); - path.moveTo(0, 0.25 * m); - path.lineTo(0.5 * m, m * tan30Dx); - path.lineTo(m, 0.25 * m); - path.lineTo(m, 0.75 * m); - path.lineTo(0.5 * m, (1 - tan30Dx) * m); - path.lineTo(0, 0.75 * m); - path.close(); - path.end(); - } - }; - - mxCellRenderer.registerShape('isoCube', IsoCubeShape); - - // DataStore Shape, supports size style - function DataStoreShape() - { - mxCylinder.call(this); - }; - mxUtils.extend(DataStoreShape, mxCylinder); - - DataStoreShape.prototype.redrawPath = function(c, x, y, w, h, isForeground) - { - var dy = Math.min(h / 2, Math.round(h / 8) + this.strokewidth - 1); - - if ((isForeground && this.fill != null) || (!isForeground && this.fill == null)) - { - c.moveTo(0, dy); - c.curveTo(0, 2 * dy, w, 2 * dy, w, dy); - - // Needs separate shapes for correct hit-detection - if (!isForeground) - { - c.stroke(); - c.begin(); - } - - c.translate(0, dy / 2); - c.moveTo(0, dy); - c.curveTo(0, 2 * dy, w, 2 * dy, w, dy); - - // Needs separate shapes for correct hit-detection - if (!isForeground) - { - c.stroke(); - c.begin(); - } - - c.translate(0, dy / 2); - c.moveTo(0, dy); - c.curveTo(0, 2 * dy, w, 2 * dy, w, dy); - - // Needs separate shapes for correct hit-detection - if (!isForeground) - { - c.stroke(); - c.begin(); - } - - c.translate(0, -dy); - } - - if (!isForeground) - { - c.moveTo(0, dy); - c.curveTo(0, -dy / 3, w, -dy / 3, w, dy); - c.lineTo(w, h - dy); - c.curveTo(w, h + dy / 3, 0, h + dy / 3, 0, h - dy); - c.close(); - } - }; - DataStoreShape.prototype.getLabelMargins = function(rect) - { - return new mxRectangle(0, 2.5 * Math.min(rect.height / 2, Math.round(rect.height / 8) + - this.strokewidth - 1) * this.scale, 0, 0); - } - - mxCellRenderer.registerShape('datastore', DataStoreShape); - - // Note Shape, supports size style - function NoteShape() - { - mxCylinder.call(this); - }; - mxUtils.extend(NoteShape, mxCylinder); - NoteShape.prototype.size = 30; - NoteShape.prototype.redrawPath = function(path, x, y, w, h, isForeground) - { - var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))))); - - if (isForeground) - { - path.moveTo(w - s, 0); - path.lineTo(w - s, s); - path.lineTo(w, s); - path.end(); - } - else - { - path.moveTo(0, 0); - path.lineTo(w - s, 0); - path.lineTo(w, s); - path.lineTo(w, h); - path.lineTo(0, h); - path.lineTo(0, 0); - path.close(); - path.end(); - } - }; - - mxCellRenderer.registerShape('note', NoteShape); - - // Note Shape, supports size style - function SwitchShape() - { - mxActor.call(this); - }; - mxUtils.extend(SwitchShape, mxActor); - SwitchShape.prototype.redrawPath = function(c, x, y, w, h) - { - var curve = 0.5; - c.moveTo(0, 0); - c.quadTo(w / 2, h * curve, w, 0); - c.quadTo(w * (1 - curve), h / 2, w, h); - c.quadTo(w / 2, h * (1 - curve), 0, h); - c.quadTo(w * curve, h / 2, 0, 0); - c.end(); - }; - - mxCellRenderer.registerShape('switch', SwitchShape); - - // Folder Shape, supports tabWidth, tabHeight styles - function FolderShape() - { - mxCylinder.call(this); - }; - mxUtils.extend(FolderShape, mxCylinder); - FolderShape.prototype.tabWidth = 60; - FolderShape.prototype.tabHeight = 20; - FolderShape.prototype.tabPosition = 'right'; - FolderShape.prototype.redrawPath = function(path, x, y, w, h, isForeground) - { - var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'tabWidth', this.tabWidth)))); - var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'tabHeight', this.tabHeight)))); - var tp = mxUtils.getValue(this.style, 'tabPosition', this.tabPosition); - - if (isForeground) - { - if (tp == 'left') - { - path.moveTo(0, dy); - path.lineTo(dx, dy); - } - // Right is default - else - { - path.moveTo(w - dx, dy); - path.lineTo(w, dy); - } - - path.end(); - } - else - { - if (tp == 'left') - { - path.moveTo(0, 0); - path.lineTo(dx, 0); - path.lineTo(dx, dy); - path.lineTo(w, dy); - } - // Right is default - else - { - path.moveTo(0, dy); - path.lineTo(w - dx, dy); - path.lineTo(w - dx, 0); - path.lineTo(w, 0); - } - - path.lineTo(w, h); - path.lineTo(0, h); - path.lineTo(0, dy); - path.close(); - path.end(); - } - }; - - mxCellRenderer.registerShape('folder', FolderShape); - - // Card shape - function CardShape() - { - mxActor.call(this); - }; - mxUtils.extend(CardShape, mxActor); - CardShape.prototype.size = 30; - CardShape.prototype.redrawPath = function(c, x, y, w, h) - { - var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))))); - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - this.addPoints(c, [new mxPoint(s, 0), new mxPoint(w, 0), new mxPoint(w, h), new mxPoint(0, h), new mxPoint(0, s)], - this.isRounded, arcSize, true); - c.end(); - }; - - mxCellRenderer.registerShape('card', CardShape); - - // Tape shape - function TapeShape() - { - mxActor.call(this); - }; - mxUtils.extend(TapeShape, mxActor); - TapeShape.prototype.size = 0.4; - TapeShape.prototype.redrawPath = function(c, x, y, w, h) - { - var dy = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - var fy = 1.4; - - c.moveTo(0, dy / 2); - c.quadTo(w / 4, dy * fy, w / 2, dy / 2); - c.quadTo(w * 3 / 4, dy * (1 - fy), w, dy / 2); - c.lineTo(w, h - dy / 2); - c.quadTo(w * 3 / 4, h - dy * fy, w / 2, h - dy / 2); - c.quadTo(w / 4, h - dy * (1 - fy), 0, h - dy / 2); - c.lineTo(0, dy / 2); - c.close(); - c.end(); - }; - - TapeShape.prototype.getLabelBounds = function(rect) - { - if (mxUtils.getValue(this.style, 'boundedLbl', false)) - { - var size = mxUtils.getValue(this.style, 'size', this.size); - var w = rect.width; - var h = rect.height; - - if (this.direction == null || - this.direction == mxConstants.DIRECTION_EAST || - this.direction == mxConstants.DIRECTION_WEST) - { - var dy = h * size; - - return new mxRectangle(rect.x, rect.y + dy, w, h - 2 * dy); - } - else - { - var dx = w * size; - - return new mxRectangle(rect.x + dx, rect.y, w - 2 * dx, h); - } - } - - return rect; - }; - - mxCellRenderer.registerShape('tape', TapeShape); - - // Document shape - function DocumentShape() - { - mxActor.call(this); - }; - mxUtils.extend(DocumentShape, mxActor); - DocumentShape.prototype.size = 0.3; - DocumentShape.prototype.getLabelMargins = function(rect) - { - if (mxUtils.getValue(this.style, 'boundedLbl', false)) - { - return new mxRectangle(0, 0, 0, parseFloat(mxUtils.getValue( - this.style, 'size', this.size)) * rect.height); - } - - return null; - }; - DocumentShape.prototype.redrawPath = function(c, x, y, w, h) - { - var dy = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - var fy = 1.4; - - c.moveTo(0, 0); - c.lineTo(w, 0); - c.lineTo(w, h - dy / 2); - c.quadTo(w * 3 / 4, h - dy * fy, w / 2, h - dy / 2); - c.quadTo(w / 4, h - dy * (1 - fy), 0, h - dy / 2); - c.lineTo(0, dy / 2); - c.close(); - c.end(); - }; - - mxCellRenderer.registerShape('document', DocumentShape); - - var cylinderGetCylinderSize = mxCylinder.prototype.getCylinderSize; - - mxCylinder.prototype.getCylinderSize = function(x, y, w, h) - { - var size = mxUtils.getValue(this.style, 'size'); - - if (size != null) - { - return h * Math.max(0, Math.min(1, size)); - } - else - { - return cylinderGetCylinderSize.apply(this, arguments); - } - }; - - mxCylinder.prototype.getLabelMargins = function(rect) - { - if (mxUtils.getValue(this.style, 'boundedLbl', false)) - { - var size = mxUtils.getValue(this.style, 'size', 0.15) * 2; - - return new mxRectangle(0, Math.min(this.maxHeight * this.scale, rect.height * size), 0, 0); - } - - return null; - }; - - // Parallelogram shape - function ParallelogramShape() - { - mxActor.call(this); - }; - mxUtils.extend(ParallelogramShape, mxActor); - ParallelogramShape.prototype.size = 0.2; - ParallelogramShape.prototype.redrawPath = function(c, x, y, w, h) - { - var dx = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - this.addPoints(c, [new mxPoint(0, h), new mxPoint(dx, 0), new mxPoint(w, 0), new mxPoint(w - dx, h)], - this.isRounded, arcSize, true); - c.end(); - }; - - mxCellRenderer.registerShape('parallelogram', ParallelogramShape); - - // Trapezoid shape - function TrapezoidShape() - { - mxActor.call(this); - }; - mxUtils.extend(TrapezoidShape, mxActor); - TrapezoidShape.prototype.size = 0.2; - TrapezoidShape.prototype.redrawPath = function(c, x, y, w, h) - { - var dx = w * Math.max(0, Math.min(0.5, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - this.addPoints(c, [new mxPoint(0, h), new mxPoint(dx, 0), new mxPoint(w - dx, 0), new mxPoint(w, h)], - this.isRounded, arcSize, true); - }; - - mxCellRenderer.registerShape('trapezoid', TrapezoidShape); - - // Curly Bracket shape - function CurlyBracketShape() - { - mxActor.call(this); - }; - mxUtils.extend(CurlyBracketShape, mxActor); - CurlyBracketShape.prototype.size = 0.5; - CurlyBracketShape.prototype.redrawPath = function(c, x, y, w, h) - { - c.setFillColor(null); - var s = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - this.addPoints(c, [new mxPoint(w, 0), new mxPoint(s, 0), new mxPoint(s, h / 2), - new mxPoint(0, h / 2), new mxPoint(s, h / 2), new mxPoint(s, h), - new mxPoint(w, h)], this.isRounded, arcSize, false); - c.end(); - }; - - mxCellRenderer.registerShape('curlyBracket', CurlyBracketShape); - - // Parallel marker shape - function ParallelMarkerShape() - { - mxActor.call(this); - }; - mxUtils.extend(ParallelMarkerShape, mxActor); - ParallelMarkerShape.prototype.redrawPath = function(c, x, y, w, h) - { - c.setStrokeWidth(1); - c.setFillColor(this.stroke); - var w2 = w / 5; - c.rect(0, 0, w2, h); - c.fillAndStroke(); - c.rect(2 * w2, 0, w2, h); - c.fillAndStroke(); - c.rect(4 * w2, 0, w2, h); - c.fillAndStroke(); - }; - - mxCellRenderer.registerShape('parallelMarker', ParallelMarkerShape); - - /** - * Adds handJiggle style (jiggle=n sets jiggle) - */ - function HandJiggle(canvas, defaultVariation) - { - this.canvas = canvas; - - // Avoids "spikes" in the output - this.canvas.setLineJoin('round'); - this.canvas.setLineCap('round'); - - this.defaultVariation = defaultVariation; - - this.originalLineTo = this.canvas.lineTo; - this.canvas.lineTo = mxUtils.bind(this, HandJiggle.prototype.lineTo); - - this.originalMoveTo = this.canvas.moveTo; - this.canvas.moveTo = mxUtils.bind(this, HandJiggle.prototype.moveTo); - - this.originalClose = this.canvas.close; - this.canvas.close = mxUtils.bind(this, HandJiggle.prototype.close); - - this.originalQuadTo = this.canvas.quadTo; - this.canvas.quadTo = mxUtils.bind(this, HandJiggle.prototype.quadTo); - - this.originalCurveTo = this.canvas.curveTo; - this.canvas.curveTo = mxUtils.bind(this, HandJiggle.prototype.curveTo); - - this.originalArcTo = this.canvas.arcTo; - this.canvas.arcTo = mxUtils.bind(this, HandJiggle.prototype.arcTo); - }; - - HandJiggle.prototype.moveTo = function(endX, endY) - { - this.originalMoveTo.apply(this.canvas, arguments); - this.lastX = endX; - this.lastY = endY; - this.firstX = endX; - this.firstY = endY; - }; - - HandJiggle.prototype.close = function() - { - if (this.firstX != null && this.firstY != null) - { - this.lineTo(this.firstX, this.firstY); - this.originalClose.apply(this.canvas, arguments); - } - - this.originalClose.apply(this.canvas, arguments); - }; - - HandJiggle.prototype.quadTo = function(x1, y1, x2, y2) - { - this.originalQuadTo.apply(this.canvas, arguments); - this.lastX = x2; - this.lastY = y2; - }; - - HandJiggle.prototype.curveTo = function(x1, y1, x2, y2, x3, y3) - { - this.originalCurveTo.apply(this.canvas, arguments); - this.lastX = x3; - this.lastY = y3; - }; - - HandJiggle.prototype.arcTo = function(rx, ry, angle, largeArcFlag, sweepFlag, x, y) - { - this.originalArcTo.apply(this.canvas, arguments); - this.lastX = x; - this.lastY = y; - }; - - HandJiggle.prototype.lineTo = function(endX, endY) - { - // LATER: Check why this.canvas.lastX cannot be used - if (this.lastX != null && this.lastY != null) - { - var dx = Math.abs(endX - this.lastX); - var dy = Math.abs(endY - this.lastY); - var dist = Math.sqrt(dx * dx + dy * dy); - - if (dist < 2) - { - this.originalLineTo.apply(this.canvas, arguments); - this.lastX = endX; - this.lastY = endY; - - return; - } - - var segs = Math.round(dist / 10); - var variation = this.defaultVariation; - - if (segs < 5) - { - segs = 5; - variation /= 3; - } - - function sign(x) - { - return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN; - } - - var stepX = sign(endX - this.lastX) * dx / segs; - var stepY = sign(endY - this.lastY) * dy / segs; - - var fx = dx / dist; - var fy = dy / dist; - - for (var s = 0; s < segs; s++) - { - var x = stepX * s + this.lastX; - var y = stepY * s + this.lastY; - - var offset = (Math.random() - 0.5) * variation; - this.originalLineTo.call(this.canvas, x - offset * fy, y - offset * fx); - } - - this.originalLineTo.call(this.canvas, endX, endY); - this.lastX = endX; - this.lastY = endY; - } - else - { - this.originalLineTo.apply(this.canvas, arguments); - this.lastX = endX; - this.lastY = endY; - } - }; - - HandJiggle.prototype.destroy = function() - { - this.canvas.lineTo = this.originalLineTo; - this.canvas.moveTo = this.originalMoveTo; - this.canvas.close = this.originalClose; - this.canvas.quadTo = this.originalQuadTo; - this.canvas.curveTo = this.originalCurveTo; - this.canvas.arcTo = this.originalArcTo; - }; - - // Installs hand jiggle in all shapes - var mxShapePaint0 = mxShape.prototype.paint; - mxShape.prototype.defaultJiggle = 1.5; - mxShape.prototype.paint = function(c) - { - // NOTE: getValue does not return a boolean value so !('0') would return true here and below - if (this.style != null && mxUtils.getValue(this.style, 'comic', '0') != '0' && c.handHiggle == null) - { - c.handJiggle = new HandJiggle(c, mxUtils.getValue(this.style, 'jiggle', this.defaultJiggle)); - } - - mxShapePaint0.apply(this, arguments); - - if (c.handJiggle != null) - { - c.handJiggle.destroy(); - delete c.handJiggle; - } - }; - - // Sets default jiggle for diamond - mxRhombus.prototype.defaultJiggle = 2; - - /** - * Overrides to avoid call to rect - */ - var mxRectangleShapeIsHtmlAllowed0 = mxRectangleShape.prototype.isHtmlAllowed; - mxRectangleShape.prototype.isHtmlAllowed = function() - { - return (this.style == null || mxUtils.getValue(this.style, 'comic', '0') == '0') && - mxRectangleShapeIsHtmlAllowed0.apply(this, arguments); - }; - - var mxRectangleShapePaintBackground0 = mxRectangleShape.prototype.paintBackground; - mxRectangleShape.prototype.paintBackground = function(c, x, y, w, h) - { - if (c.handJiggle == null) - { - mxRectangleShapePaintBackground0.apply(this, arguments); - } - else - { - var events = true; - - if (this.style != null) - { - events = mxUtils.getValue(this.style, mxConstants.STYLE_POINTER_EVENTS, '1') == '1'; - } - - if (events || (this.fill != null && this.fill != mxConstants.NONE) || - (this.stroke != null && this.stroke != mxConstants.NONE)) - { - if (!events && (this.fill == null || this.fill == mxConstants.NONE)) - { - c.pointerEvents = false; - } - - c.begin(); - - if (this.isRounded) - { - var r = 0; - - if (mxUtils.getValue(this.style, mxConstants.STYLE_ABSOLUTE_ARCSIZE, 0) == '1') - { - r = Math.min(w / 2, Math.min(h / 2, mxUtils.getValue(this.style, - mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2)); - } - else - { - var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, - mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100; - r = Math.min(w * f, h * f); - } - - c.moveTo(x + r, y); - c.lineTo(x + w - r, y); - c.quadTo(x + w, y, x + w, y + r); - c.lineTo(x + w, y + h - r); - c.quadTo(x + w, y + h, x + w - r, y + h); - c.lineTo(x + r, y + h); - c.quadTo(x, y + h, x, y + h - r); - c.lineTo(x, y + r); - c.quadTo(x, y, x + r, y); - } - else - { - - c.moveTo(x, y); - c.lineTo(x + w, y); - c.lineTo(x + w, y + h); - c.lineTo(x, y + h); - c.lineTo(x, y); - } - - // LATER: Check if close is needed here - c.close(); - c.end(); - - c.fillAndStroke(); - } - } - }; - - /** - * Disables glass effect with hand jiggle. - */ - var mxRectangleShapePaintForeground0 = mxRectangleShape.prototype.paintForeground; - mxRectangleShape.prototype.paintForeground = function(c, x, y, w, h) - { - if (c.handJiggle == null) - { - mxRectangleShapePaintForeground0.apply(this, arguments); - } - }; - - // End of hand jiggle integration - - // Process Shape - function ProcessShape() - { - mxRectangleShape.call(this); - }; - mxUtils.extend(ProcessShape, mxRectangleShape); - ProcessShape.prototype.size = 0.1; - ProcessShape.prototype.isHtmlAllowed = function() - { - return false; - }; - ProcessShape.prototype.getLabelBounds = function(rect) - { - if (mxUtils.getValue(this.state.style, mxConstants.STYLE_HORIZONTAL, true) == - (this.direction == null || - this.direction == mxConstants.DIRECTION_EAST || - this.direction == mxConstants.DIRECTION_WEST)) - { - var w = rect.width; - var h = rect.height; - var r = new mxRectangle(rect.x, rect.y, w, h); - - var inset = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - - if (this.isRounded) - { - var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, - mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100; - inset = Math.max(inset, Math.min(w * f, h * f)); - } - - r.x += Math.round(inset); - r.width -= Math.round(2 * inset); - - return r; - } - - return rect; - }; - ProcessShape.prototype.paintForeground = function(c, x, y, w, h) - { - var inset = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - - if (this.isRounded) - { - var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, - mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100; - inset = Math.max(inset, Math.min(w * f, h * f)); - } - - // Crisp rendering of inner lines - inset = Math.round(inset); - - c.begin(); - c.moveTo(x + inset, y); - c.lineTo(x + inset, y + h); - c.moveTo(x + w - inset, y); - c.lineTo(x + w - inset, y + h); - c.end(); - c.stroke(); - mxRectangleShape.prototype.paintForeground.apply(this, arguments); - }; - - mxCellRenderer.registerShape('process', ProcessShape); - - // Transparent Shape - function TransparentShape() - { - mxRectangleShape.call(this); - }; - mxUtils.extend(TransparentShape, mxRectangleShape); - TransparentShape.prototype.paintBackground = function(c, x, y, w, h) - { - c.setFillColor(mxConstants.NONE); - c.rect(x, y, w, h); - c.fill(); - }; - TransparentShape.prototype.paintForeground = function(c, x, y, w, h) { }; - - mxCellRenderer.registerShape('transparent', TransparentShape); - - // Callout shape - function CalloutShape() - { - mxActor.call(this); - }; - mxUtils.extend(CalloutShape, mxHexagon); - CalloutShape.prototype.size = 30; - CalloutShape.prototype.position = 0.5; - CalloutShape.prototype.position2 = 0.5; - CalloutShape.prototype.base = 20; - CalloutShape.prototype.getLabelMargins = function() - { - return new mxRectangle(0, 0, 0, parseFloat(mxUtils.getValue( - this.style, 'size', this.size)) * this.scale); - }; - CalloutShape.prototype.redrawPath = function(c, x, y, w, h) - { - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - var s = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - var dx = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'position', this.position)))); - var dx2 = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'position2', this.position2)))); - var base = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'base', this.base)))); - - this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, h - s), - new mxPoint(Math.min(w, dx + base), h - s), new mxPoint(dx2, h), - new mxPoint(Math.max(0, dx), h - s), new mxPoint(0, h - s)], - this.isRounded, arcSize, true, [4]); - }; - - mxCellRenderer.registerShape('callout', CalloutShape); - - // Step shape - function StepShape() - { - mxActor.call(this); - }; - mxUtils.extend(StepShape, mxActor); - StepShape.prototype.size = 0.2; - StepShape.prototype.fixedSize = 20; - StepShape.prototype.redrawPath = function(c, x, y, w, h) - { - var fixed = mxUtils.getValue(this.style, 'fixedSize', '0') != '0'; - var s = (fixed) ? Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'size', this.fixedSize)))) : - w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w - s, 0), new mxPoint(w, h / 2), new mxPoint(w - s, h), - new mxPoint(0, h), new mxPoint(s, h / 2)], this.isRounded, arcSize, true); - c.end(); - }; - - mxCellRenderer.registerShape('step', StepShape); - - // Hexagon shape - function HexagonShape() - { - mxActor.call(this); - }; - mxUtils.extend(HexagonShape, mxHexagon); - HexagonShape.prototype.size = 0.25; - HexagonShape.prototype.redrawPath = function(c, x, y, w, h) - { - var s = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - this.addPoints(c, [new mxPoint(s, 0), new mxPoint(w - s, 0), new mxPoint(w, 0.5 * h), new mxPoint(w - s, h), - new mxPoint(s, h), new mxPoint(0, 0.5 * h)], this.isRounded, arcSize, true); - }; - - mxCellRenderer.registerShape('hexagon', HexagonShape); - - // Plus Shape - function PlusShape() - { - mxRectangleShape.call(this); - }; - mxUtils.extend(PlusShape, mxRectangleShape); - PlusShape.prototype.isHtmlAllowed = function() - { - return false; - }; - PlusShape.prototype.paintForeground = function(c, x, y, w, h) - { - var border = Math.min(w / 5, h / 5) + 1; - - c.begin(); - c.moveTo(x + w / 2, y + border); - c.lineTo(x + w / 2, y + h - border); - c.moveTo(x + border, y + h / 2); - c.lineTo(x + w - border, y + h / 2); - c.end(); - c.stroke(); - mxRectangleShape.prototype.paintForeground.apply(this, arguments); - }; - - mxCellRenderer.registerShape('plus', PlusShape); - - // Overrides painting of rhombus shape to allow for double style - var mxRhombusPaintVertexShape = mxRhombus.prototype.paintVertexShape; - mxRhombus.prototype.getLabelBounds = function(rect) - { - if (this.style['double'] == 1) - { - var margin = (Math.max(2, this.strokewidth + 1) * 2 + parseFloat( - this.style[mxConstants.STYLE_MARGIN] || 0)) * this.scale; - - return new mxRectangle(rect.x + margin, rect.y + margin, - rect.width - 2 * margin, rect.height - 2 * margin); - } - - return rect; - }; - mxRhombus.prototype.paintVertexShape = function(c, x, y, w, h) - { - mxRhombusPaintVertexShape.apply(this, arguments); - - if (!this.outline && this.style['double'] == 1) - { - var margin = Math.max(2, this.strokewidth + 1) * 2 + - parseFloat(this.style[mxConstants.STYLE_MARGIN] || 0); - x += margin; - y += margin; - w -= 2 * margin; - h -= 2 * margin; - - if (w > 0 && h > 0) - { - c.setShadow(false); - - // Workaround for closure compiler bug where the lines with x and y above - // are removed if arguments is used as second argument in call below. - mxRhombusPaintVertexShape.apply(this, [c, x, y, w, h]); - } - } - }; - - // CompositeShape - function ExtendedShape() - { - mxRectangleShape.call(this); - }; - mxUtils.extend(ExtendedShape, mxRectangleShape); - ExtendedShape.prototype.isHtmlAllowed = function() - { - return false; - }; - ExtendedShape.prototype.getLabelBounds = function(rect) - { - if (this.style['double'] == 1) - { - var margin = (Math.max(2, this.strokewidth + 1) + parseFloat( - this.style[mxConstants.STYLE_MARGIN] || 0)) * this.scale; - - return new mxRectangle(rect.x + margin, rect.y + margin, - rect.width - 2 * margin, rect.height - 2 * margin); - } - - return rect; - }; - - ExtendedShape.prototype.paintForeground = function(c, x, y, w, h) - { - if (this.style != null) - { - if (!this.outline && this.style['double'] == 1) - { - var margin = Math.max(2, this.strokewidth + 1) + parseFloat(this.style[mxConstants.STYLE_MARGIN] || 0); - x += margin; - y += margin; - w -= 2 * margin; - h -= 2 * margin; - - if (w > 0 && h > 0) - { - mxRectangleShape.prototype.paintBackground.apply(this, arguments); - } - } - - c.setDashed(false); - - // Draws the symbols defined in the style. The symbols are - // numbered from 1...n. Possible postfixes are align, - // verticalAlign, spacing, arcSpacing, width, height - var counter = 0; - var shape = null; - - do - { - shape = mxCellRenderer.defaultShapes[this.style['symbol' + counter]]; - - if (shape != null) - { - var align = this.style['symbol' + counter + 'Align']; - var valign = this.style['symbol' + counter + 'VerticalAlign']; - var width = this.style['symbol' + counter + 'Width']; - var height = this.style['symbol' + counter + 'Height']; - var spacing = this.style['symbol' + counter + 'Spacing'] || 0; - var vspacing = this.style['symbol' + counter + 'VSpacing'] || spacing; - var arcspacing = this.style['symbol' + counter + 'ArcSpacing']; - - if (arcspacing != null) - { - var arcSize = this.getArcSize(w + this.strokewidth, h + this.strokewidth) * arcspacing; - spacing += arcSize; - vspacing += arcSize; - } - - var x2 = x; - var y2 = y; - - if (align == mxConstants.ALIGN_CENTER) - { - x2 += (w - width) / 2; - } - else if (align == mxConstants.ALIGN_RIGHT) - { - x2 += w - width - spacing; - } - else - { - x2 += spacing; - } - - if (valign == mxConstants.ALIGN_MIDDLE) - { - y2 += (h - height) / 2; - } - else if (valign == mxConstants.ALIGN_BOTTOM) - { - y2 += h - height - vspacing; - } - else - { - y2 += vspacing; - } - - c.save(); - - // Small hack to pass style along into subshape - var tmp = new shape(); - // TODO: Clone style and override settings (eg. strokewidth) - tmp.style = this.style; - shape.prototype.paintVertexShape.call(tmp, c, x2, y2, width, height); - c.restore(); - } - - counter++; - } - while (shape != null); - } - - // Paints glass effect - mxRectangleShape.prototype.paintForeground.apply(this, arguments); - }; - - mxCellRenderer.registerShape('ext', ExtendedShape); - - // Tape Shape, supports size style - function MessageShape() - { - mxCylinder.call(this); - }; - mxUtils.extend(MessageShape, mxCylinder); - MessageShape.prototype.redrawPath = function(path, x, y, w, h, isForeground) - { - if (isForeground) - { - path.moveTo(0, 0); - path.lineTo(w / 2, h / 2); - path.lineTo(w, 0); - path.end(); - } - else - { - path.moveTo(0, 0); - path.lineTo(w, 0); - path.lineTo(w, h); - path.lineTo(0, h); - path.close(); - } - }; - - mxCellRenderer.registerShape('message', MessageShape); - - // UML Actor Shape - function UmlActorShape() - { - mxShape.call(this); - }; - mxUtils.extend(UmlActorShape, mxShape); - UmlActorShape.prototype.paintBackground = function(c, x, y, w, h) - { - c.translate(x, y); - - // Head - c.ellipse(w / 4, 0, w / 2, h / 4); - c.fillAndStroke(); - - c.begin(); - c.moveTo(w / 2, h / 4); - c.lineTo(w / 2, 2 * h / 3); - - // Arms - c.moveTo(w / 2, h / 3); - c.lineTo(0, h / 3); - c.moveTo(w / 2, h / 3); - c.lineTo(w, h / 3); - - // Legs - c.moveTo(w / 2, 2 * h / 3); - c.lineTo(0, h); - c.moveTo(w / 2, 2 * h / 3); - c.lineTo(w, h); - c.end(); - - c.stroke(); - }; - - // Replaces existing actor shape - mxCellRenderer.registerShape('umlActor', UmlActorShape); - - // UML Boundary Shape - function UmlBoundaryShape() - { - mxShape.call(this); - }; - mxUtils.extend(UmlBoundaryShape, mxShape); - UmlBoundaryShape.prototype.getLabelMargins = function(rect) - { - return new mxRectangle(rect.width / 6, 0, 0, 0); - }; - UmlBoundaryShape.prototype.paintBackground = function(c, x, y, w, h) - { - c.translate(x, y); - - // Base line - c.begin(); - c.moveTo(0, h / 4); - c.lineTo(0, h * 3 / 4); - c.end(); - c.stroke(); - - // Horizontal line - c.begin(); - c.moveTo(0, h / 2); - c.lineTo(w / 6, h / 2); - c.end(); - c.stroke(); - - // Circle - c.ellipse(w / 6, 0, w * 5 / 6, h); - c.fillAndStroke(); - }; - - // Replaces existing actor shape - mxCellRenderer.registerShape('umlBoundary', UmlBoundaryShape); - - // UML Entity Shape - function UmlEntityShape() - { - mxEllipse.call(this); - }; - mxUtils.extend(UmlEntityShape, mxEllipse); - UmlEntityShape.prototype.paintVertexShape = function(c, x, y, w, h) - { - mxEllipse.prototype.paintVertexShape.apply(this, arguments); - - c.begin(); - c.moveTo(x + w / 8, y + h); - c.lineTo(x + w * 7 / 8, y + h); - c.end(); - c.stroke(); - }; - - mxCellRenderer.registerShape('umlEntity', UmlEntityShape); - - // UML Destroy Shape - function UmlDestroyShape() - { - mxShape.call(this); - }; - mxUtils.extend(UmlDestroyShape, mxShape); - UmlDestroyShape.prototype.paintVertexShape = function(c, x, y, w, h) - { - c.translate(x, y); - - c.begin(); - c.moveTo(w, 0); - c.lineTo(0, h); - c.moveTo(0, 0); - c.lineTo(w, h); - c.end(); - c.stroke(); - }; - - mxCellRenderer.registerShape('umlDestroy', UmlDestroyShape); - - // UML Control Shape - function UmlControlShape() - { - mxShape.call(this); - }; - mxUtils.extend(UmlControlShape, mxShape); - UmlControlShape.prototype.getLabelBounds = function(rect) - { - return new mxRectangle(rect.x, rect.y + rect.height / 8, rect.width, rect.height * 7 / 8); - }; - UmlControlShape.prototype.paintBackground = function(c, x, y, w, h) - { - c.translate(x, y); - - // Upper line - c.begin(); - c.moveTo(w * 3 / 8, h / 8 * 1.1); - c.lineTo(w * 5 / 8, 0); - c.end(); - c.stroke(); - - // Circle - c.ellipse(0, h / 8, w, h * 7 / 8); - c.fillAndStroke(); - }; - UmlControlShape.prototype.paintForeground = function(c, x, y, w, h) - { - // Lower line - c.begin(); - c.moveTo(w * 3 / 8, h / 8 * 1.1); - c.lineTo(w * 5 / 8, h / 4); - c.end(); - c.stroke(); - }; - - // Replaces existing actor shape - mxCellRenderer.registerShape('umlControl', UmlControlShape); - - // UML Lifeline Shape - function UmlLifeline() - { - mxRectangleShape.call(this); - }; - mxUtils.extend(UmlLifeline, mxRectangleShape); - UmlLifeline.prototype.size = 40; - UmlLifeline.prototype.isHtmlAllowed = function() - { - return false; - }; - UmlLifeline.prototype.getLabelBounds = function(rect) - { - var size = Math.max(0, Math.min(rect.height, parseFloat( - mxUtils.getValue(this.style, 'size', this.size)) * this.scale)); - - return new mxRectangle(rect.x, rect.y, rect.width, size); - }; - UmlLifeline.prototype.paintBackground = function(c, x, y, w, h) - { - var size = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - var participant = mxUtils.getValue(this.style, 'participant'); - - if (participant == null || this.state == null) - { - mxRectangleShape.prototype.paintBackground.call(this, c, x, y, w, size); - } - else - { - var ctor = this.state.view.graph.cellRenderer.getShape(participant); - - if (ctor != null && ctor != UmlLifeline) - { - var shape = new ctor(); - shape.apply(this.state); - c.save(); - shape.paintVertexShape(c, x, y, w, size); - c.restore(); - } - } - - if (size < h) - { - c.setDashed(true); - c.begin(); - c.moveTo(x + w / 2, y + size); - c.lineTo(x + w / 2, y + h); - c.end(); - c.stroke(); - } - }; - UmlLifeline.prototype.paintForeground = function(c, x, y, w, h) - { - var size = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - mxRectangleShape.prototype.paintForeground.call(this, c, x, y, w, Math.min(h, size)); - }; - - mxCellRenderer.registerShape('umlLifeline', UmlLifeline); - - // UML Frame Shape - function UmlFrame() - { - mxShape.call(this); - }; - mxUtils.extend(UmlFrame, mxShape); - UmlFrame.prototype.width = 60; - UmlFrame.prototype.height = 30; - UmlFrame.prototype.corner = 10; - UmlFrame.prototype.getLabelMargins = function(rect) - { - return new mxRectangle(0, 0, - rect.width - (parseFloat(mxUtils.getValue(this.style, 'width', this.width) * this.scale)), - rect.height - (parseFloat(mxUtils.getValue(this.style, 'height', this.height) * this.scale))); - }; - UmlFrame.prototype.paintBackground = function(c, x, y, w, h) - { - var co = this.corner; - var w0 = Math.min(w, Math.max(co, parseFloat(mxUtils.getValue(this.style, 'width', this.width)))); - var h0 = Math.min(h, Math.max(co * 1.5, parseFloat(mxUtils.getValue(this.style, 'height', this.height)))); - var bg = mxUtils.getValue(this.style, mxConstants.STYLE_SWIMLANE_FILLCOLOR, mxConstants.NONE); - - if (bg != mxConstants.NONE) - { - c.setFillColor(bg); - c.rect(x, y, w, h); - c.fill(); - } - - if (this.fill != null && this.fill != mxConstants.NONE && this.gradient && this.gradient != mxConstants.NONE) - { - var b = this.getGradientBounds(c, x, y, w, h); - c.setGradient(this.fill, this.gradient, x, y, w, h, this.gradientDirection); - } - else - { - c.setFillColor(this.fill); - } - - c.begin(); - c.moveTo(x, y); - c.lineTo(x + w0, y); - c.lineTo(x + w0, y + Math.max(0, h0 - co * 1.5)); - c.lineTo(x + Math.max(0, w0 - co), y + h0); - c.lineTo(x, y + h0); - c.close(); - c.fillAndStroke(); - - c.begin(); - c.moveTo(x + w0, y); - c.lineTo(x + w, y); - c.lineTo(x + w, y + h); - c.lineTo(x, y + h); - c.lineTo(x, y + h0); - c.stroke(); - }; - - mxCellRenderer.registerShape('umlFrame', UmlFrame); - - mxPerimeter.LifelinePerimeter = function (bounds, vertex, next, orthogonal) - { - var size = UmlLifeline.prototype.size; - - if (vertex != null) - { - size = mxUtils.getValue(vertex.style, 'size', size) * vertex.view.scale; - } - - var sw = (parseFloat(vertex.style[mxConstants.STYLE_STROKEWIDTH] || 1) * vertex.view.scale / 2) - 1; - - if (next.x < bounds.getCenterX()) - { - sw += 1; - sw *= -1; - } - - return new mxPoint(bounds.getCenterX() + sw, Math.min(bounds.y + bounds.height, - Math.max(bounds.y + size, next.y))); - }; - - mxStyleRegistry.putValue('lifelinePerimeter', mxPerimeter.LifelinePerimeter); - - mxPerimeter.OrthogonalPerimeter = function (bounds, vertex, next, orthogonal) - { - orthogonal = true; - - return mxPerimeter.RectanglePerimeter.apply(this, arguments); - }; - - mxStyleRegistry.putValue('orthogonalPerimeter', mxPerimeter.OrthogonalPerimeter); - - mxPerimeter.BackbonePerimeter = function (bounds, vertex, next, orthogonal) - { - var sw = (parseFloat(vertex.style[mxConstants.STYLE_STROKEWIDTH] || 1) * vertex.view.scale / 2) - 1; - - if (vertex.style['backboneSize'] != null) - { - sw += (parseFloat(vertex.style['backboneSize']) * vertex.view.scale / 2) - 1; - } - - if (vertex.style[mxConstants.STYLE_DIRECTION] == 'south' || - vertex.style[mxConstants.STYLE_DIRECTION] == 'north') - { - if (next.x < bounds.getCenterX()) - { - sw += 1; - sw *= -1; - } - - return new mxPoint(bounds.getCenterX() + sw, Math.min(bounds.y + bounds.height, - Math.max(bounds.y, next.y))); - } - else - { - if (next.y < bounds.getCenterY()) - { - sw += 1; - sw *= -1; - } - - return new mxPoint(Math.min(bounds.x + bounds.width, Math.max(bounds.x, next.x)), - bounds.getCenterY() + sw); - } - }; - - mxStyleRegistry.putValue('backbonePerimeter', mxPerimeter.BackbonePerimeter); - - // Callout Perimeter - mxPerimeter.CalloutPerimeter = function (bounds, vertex, next, orthogonal) - { - return mxPerimeter.RectanglePerimeter(mxUtils.getDirectedBounds(bounds, new mxRectangle(0, 0, 0, - Math.max(0, Math.min(bounds.height, parseFloat(mxUtils.getValue(vertex.style, 'size', - CalloutShape.prototype.size)) * vertex.view.scale))), - vertex.style), vertex, next, orthogonal); - }; - - mxStyleRegistry.putValue('calloutPerimeter', mxPerimeter.CalloutPerimeter); - - // Parallelogram Perimeter - mxPerimeter.ParallelogramPerimeter = function (bounds, vertex, next, orthogonal) - { - var size = ParallelogramShape.prototype.size; - - if (vertex != null) - { - size = mxUtils.getValue(vertex.style, 'size', size); - } - - var x = bounds.x; - var y = bounds.y; - var w = bounds.width; - var h = bounds.height; - - var direction = (vertex != null) ? mxUtils.getValue( - vertex.style, mxConstants.STYLE_DIRECTION, - mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST; - var vertical = direction == mxConstants.DIRECTION_NORTH || - direction == mxConstants.DIRECTION_SOUTH; - var points; - - if (vertical) - { - var dy = h * Math.max(0, Math.min(1, size)); - points = [new mxPoint(x, y), new mxPoint(x + w, y + dy), - new mxPoint(x + w, y + h), new mxPoint(x, y + h - dy), new mxPoint(x, y)]; - } - else - { - var dx = w * Math.max(0, Math.min(1, size)); - points = [new mxPoint(x + dx, y), new mxPoint(x + w, y), - new mxPoint(x + w - dx, y + h), new mxPoint(x, y + h), new mxPoint(x + dx, y)]; - } - - var cx = bounds.getCenterX(); - var cy = bounds.getCenterY(); - - var p1 = new mxPoint(cx, cy); - - if (orthogonal) - { - if (next.x < x || next.x > x + w) - { - p1.y = next.y; - } - else - { - p1.x = next.x; - } - } - - return mxUtils.getPerimeterPoint(points, p1, next); - }; - - mxStyleRegistry.putValue('parallelogramPerimeter', mxPerimeter.ParallelogramPerimeter); - - // Trapezoid Perimeter - mxPerimeter.TrapezoidPerimeter = function (bounds, vertex, next, orthogonal) - { - var size = TrapezoidShape.prototype.size; - - if (vertex != null) - { - size = mxUtils.getValue(vertex.style, 'size', size); - } - - var x = bounds.x; - var y = bounds.y; - var w = bounds.width; - var h = bounds.height; - - var direction = (vertex != null) ? mxUtils.getValue( - vertex.style, mxConstants.STYLE_DIRECTION, - mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST; - var points; - - if (direction == mxConstants.DIRECTION_EAST) - { - var dx = w * Math.max(0, Math.min(1, size)); - points = [new mxPoint(x + dx, y), new mxPoint(x + w - dx, y), - new mxPoint(x + w, y + h), new mxPoint(x, y + h), new mxPoint(x + dx, y)]; - } - else if (direction == mxConstants.DIRECTION_WEST) - { - var dx = w * Math.max(0, Math.min(1, size)); - points = [new mxPoint(x, y), new mxPoint(x + w, y), - new mxPoint(x + w - dx, y + h), new mxPoint(x + dx, y + h), new mxPoint(x, y)]; - } - else if (direction == mxConstants.DIRECTION_NORTH) - { - var dy = h * Math.max(0, Math.min(1, size)); - points = [new mxPoint(x, y + dy), new mxPoint(x + w, y), - new mxPoint(x + w, y + h), new mxPoint(x, y + h - dy), new mxPoint(x, y + dy)]; - } - else - { - var dy = h * Math.max(0, Math.min(1, size)); - points = [new mxPoint(x, y), new mxPoint(x + w, y + dy), - new mxPoint(x + w, y + h - dy), new mxPoint(x, y + h), new mxPoint(x, y)]; - } - - var cx = bounds.getCenterX(); - var cy = bounds.getCenterY(); - - var p1 = new mxPoint(cx, cy); - - if (orthogonal) - { - if (next.x < x || next.x > x + w) - { - p1.y = next.y; - } - else - { - p1.x = next.x; - } - } - - return mxUtils.getPerimeterPoint(points, p1, next); - }; - - mxStyleRegistry.putValue('trapezoidPerimeter', mxPerimeter.TrapezoidPerimeter); - - // Step Perimeter - mxPerimeter.StepPerimeter = function (bounds, vertex, next, orthogonal) - { - var fixed = mxUtils.getValue(vertex.style, 'fixedSize', '0') != '0'; - var size = (fixed) ? StepShape.prototype.fixedSize : StepShape.prototype.size; - - if (vertex != null) - { - size = mxUtils.getValue(vertex.style, 'size', size); - } - - var x = bounds.x; - var y = bounds.y; - var w = bounds.width; - var h = bounds.height; - - var cx = bounds.getCenterX(); - var cy = bounds.getCenterY(); - - var direction = (vertex != null) ? mxUtils.getValue( - vertex.style, mxConstants.STYLE_DIRECTION, - mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST; - var points; - - if (direction == mxConstants.DIRECTION_EAST) - { - var dx = (fixed) ? Math.max(0, Math.min(w, size)) : w * Math.max(0, Math.min(1, size)); - points = [new mxPoint(x, y), new mxPoint(x + w - dx, y), new mxPoint(x + w, cy), - new mxPoint(x + w - dx, y + h), new mxPoint(x, y + h), - new mxPoint(x + dx, cy), new mxPoint(x, y)]; - } - else if (direction == mxConstants.DIRECTION_WEST) - { - var dx = (fixed) ? Math.max(0, Math.min(w, size)) : w * Math.max(0, Math.min(1, size)); - points = [new mxPoint(x + dx, y), new mxPoint(x + w, y), new mxPoint(x + w - dx, cy), - new mxPoint(x + w, y + h), new mxPoint(x + dx, y + h), - new mxPoint(x, cy), new mxPoint(x + dx, y)]; - } - else if (direction == mxConstants.DIRECTION_NORTH) - { - var dy = (fixed) ? Math.max(0, Math.min(h, size)) : h * Math.max(0, Math.min(1, size)); - points = [new mxPoint(x, y + dy), new mxPoint(cx, y), new mxPoint(x + w, y + dy), - new mxPoint(x + w, y + h), new mxPoint(cx, y + h - dy), - new mxPoint(x, y + h), new mxPoint(x, y + dy)]; - } - else - { - var dy = (fixed) ? Math.max(0, Math.min(h, size)) : h * Math.max(0, Math.min(1, size)); - points = [new mxPoint(x, y), new mxPoint(cx, y + dy), new mxPoint(x + w, y), - new mxPoint(x + w, y + h - dy), new mxPoint(cx, y + h), - new mxPoint(x, y + h - dy), new mxPoint(x, y)]; - } - - var p1 = new mxPoint(cx, cy); - - if (orthogonal) - { - if (next.x < x || next.x > x + w) - { - p1.y = next.y; - } - else - { - p1.x = next.x; - } - } - - return mxUtils.getPerimeterPoint(points, p1, next); - }; - - mxStyleRegistry.putValue('stepPerimeter', mxPerimeter.StepPerimeter); - - // Hexagon Perimeter 2 (keep existing one) - mxPerimeter.HexagonPerimeter2 = function (bounds, vertex, next, orthogonal) - { - var size = HexagonShape.prototype.size; - - if (vertex != null) - { - size = mxUtils.getValue(vertex.style, 'size', size); - } - - var x = bounds.x; - var y = bounds.y; - var w = bounds.width; - var h = bounds.height; - - var cx = bounds.getCenterX(); - var cy = bounds.getCenterY(); - - var direction = (vertex != null) ? mxUtils.getValue( - vertex.style, mxConstants.STYLE_DIRECTION, - mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST; - var vertical = direction == mxConstants.DIRECTION_NORTH || - direction == mxConstants.DIRECTION_SOUTH; - var points; - - if (vertical) - { - var dy = h * Math.max(0, Math.min(1, size)); - points = [new mxPoint(cx, y), new mxPoint(x + w, y + dy), new mxPoint(x + w, y + h - dy), - new mxPoint(cx, y + h), new mxPoint(x, y + h - dy), - new mxPoint(x, y + dy), new mxPoint(cx, y)]; - } - else - { - var dx = w * Math.max(0, Math.min(1, size)); - points = [new mxPoint(x + dx, y), new mxPoint(x + w - dx, y), new mxPoint(x + w, cy), - new mxPoint(x + w - dx, y + h), new mxPoint(x + dx, y + h), - new mxPoint(x, cy), new mxPoint(x + dx, y)]; - } - - var p1 = new mxPoint(cx, cy); - - if (orthogonal) - { - if (next.x < x || next.x > x + w) - { - p1.y = next.y; - } - else - { - p1.x = next.x; - } - } - - return mxUtils.getPerimeterPoint(points, p1, next); - }; - - mxStyleRegistry.putValue('hexagonPerimeter2', mxPerimeter.HexagonPerimeter2); - - // Lollipop Shape - function LollipopShape() - { - mxShape.call(this); - }; - mxUtils.extend(LollipopShape, mxShape); - LollipopShape.prototype.size = 10; - LollipopShape.prototype.paintBackground = function(c, x, y, w, h) - { - var sz = parseFloat(mxUtils.getValue(this.style, 'size', this.size)); - c.translate(x, y); - - c.ellipse((w - sz) / 2, 0, sz, sz); - c.fillAndStroke(); - - c.begin(); - c.moveTo(w / 2, sz); - c.lineTo(w / 2, h); - c.end(); - c.stroke(); - }; - - mxCellRenderer.registerShape('lollipop', LollipopShape); - - // Lollipop Shape - function RequiresShape() - { - mxShape.call(this); - }; - mxUtils.extend(RequiresShape, mxShape); - RequiresShape.prototype.size = 10; - RequiresShape.prototype.inset = 2; - RequiresShape.prototype.paintBackground = function(c, x, y, w, h) - { - var sz = parseFloat(mxUtils.getValue(this.style, 'size', this.size)); - var inset = parseFloat(mxUtils.getValue(this.style, 'inset', this.inset)) + this.strokewidth; - c.translate(x, y); - - c.begin(); - c.moveTo(w / 2, sz + inset); - c.lineTo(w / 2, h); - c.end(); - c.stroke(); - - c.begin(); - c.moveTo((w - sz) / 2 - inset, sz / 2); - c.quadTo((w - sz) / 2 - inset, sz + inset, w / 2, sz + inset); - c.quadTo((w + sz) / 2 + inset, sz + inset, (w + sz) / 2 + inset, sz / 2); - c.end(); - c.stroke(); - }; - - mxCellRenderer.registerShape('requires', RequiresShape); - - // Component shape - function ComponentShape() - { - mxCylinder.call(this); - }; - mxUtils.extend(ComponentShape, mxCylinder); - ComponentShape.prototype.jettyWidth = 32; - ComponentShape.prototype.jettyHeight = 12; - ComponentShape.prototype.redrawPath = function(path, x, y, w, h, isForeground) - { - var dx = parseFloat(mxUtils.getValue(this.style, 'jettyWidth', this.jettyWidth)); - var dy = parseFloat(mxUtils.getValue(this.style, 'jettyHeight', this.jettyHeight)); - var x0 = dx / 2; - var x1 = x0 + dx / 2; - var y0 = 0.3 * h - dy / 2; - var y1 = 0.7 * h - dy / 2; - - if (isForeground) - { - path.moveTo(x0, y0); - path.lineTo(x1, y0); - path.lineTo(x1, y0 + dy); - path.lineTo(x0, y0 + dy); - path.moveTo(x0, y1); - path.lineTo(x1, y1); - path.lineTo(x1, y1 + dy); - path.lineTo(x0, y1 + dy); - path.end(); - } - else - { - path.moveTo(x0, 0); - path.lineTo(w, 0); - path.lineTo(w, h); - path.lineTo(x0, h); - path.lineTo(x0, y1 + dy); - path.lineTo(0, y1 + dy); - path.lineTo(0, y1); - path.lineTo(x0, y1); - path.lineTo(x0, y0 + dy); - path.lineTo(0, y0 + dy); - path.lineTo(0, y0); - path.lineTo(x0, y0); - path.close(); - path.end(); - } - }; - - mxCellRenderer.registerShape('component', ComponentShape); - - // State Shapes derives from double ellipse - function StateShape() - { - mxDoubleEllipse.call(this); - }; - mxUtils.extend(StateShape, mxDoubleEllipse); - StateShape.prototype.outerStroke = true; - StateShape.prototype.paintVertexShape = function(c, x, y, w, h) - { - var inset = Math.min(4, Math.min(w / 5, h / 5)); - - if (w > 0 && h > 0) - { - c.ellipse(x + inset, y + inset, w - 2 * inset, h - 2 * inset); - c.fillAndStroke(); - } - - c.setShadow(false); - - if (this.outerStroke) - { - c.ellipse(x, y, w, h); - c.stroke(); - } - }; - - mxCellRenderer.registerShape('endState', StateShape); - - function StartStateShape() - { - StateShape.call(this); - }; - mxUtils.extend(StartStateShape, StateShape); - StartStateShape.prototype.outerStroke = false; - - mxCellRenderer.registerShape('startState', StartStateShape); - - // Link shape - function LinkShape() - { - mxArrowConnector.call(this); - this.spacing = 0; - }; - mxUtils.extend(LinkShape, mxArrowConnector); - LinkShape.prototype.defaultWidth = 4; - - LinkShape.prototype.isOpenEnded = function() - { - return true; - }; - - LinkShape.prototype.getEdgeWidth = function() - { - return mxUtils.getNumber(this.style, 'width', this.defaultWidth) + Math.max(0, this.strokewidth - 1); - }; - - LinkShape.prototype.isArrowRounded = function() - { - return this.isRounded; - }; - - // Registers the link shape - mxCellRenderer.registerShape('link', LinkShape); - - // Generic arrow - function FlexArrowShape() - { - mxArrowConnector.call(this); - this.spacing = 0; - }; - mxUtils.extend(FlexArrowShape, mxArrowConnector); - FlexArrowShape.prototype.defaultWidth = 10; - FlexArrowShape.prototype.defaultArrowWidth = 20; - - FlexArrowShape.prototype.getStartArrowWidth = function() - { - return this.getEdgeWidth() + mxUtils.getNumber(this.style, 'startWidth', this.defaultArrowWidth); - }; - - FlexArrowShape.prototype.getEndArrowWidth = function() - { - return this.getEdgeWidth() + mxUtils.getNumber(this.style, 'endWidth', this.defaultArrowWidth);; - }; - - FlexArrowShape.prototype.getEdgeWidth = function() - { - return mxUtils.getNumber(this.style, 'width', this.defaultWidth) + Math.max(0, this.strokewidth - 1); - }; - - // Registers the link shape - mxCellRenderer.registerShape('flexArrow', FlexArrowShape); - - // Manual Input shape - function ManualInputShape() - { - mxActor.call(this); - }; - mxUtils.extend(ManualInputShape, mxActor); - ManualInputShape.prototype.size = 30; - ManualInputShape.prototype.redrawPath = function(c, x, y, w, h) - { - var s = Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))); - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - this.addPoints(c, [new mxPoint(0, h), new mxPoint(0, s), new mxPoint(w, 0), new mxPoint(w, h)], - this.isRounded, arcSize, true); - c.end(); - }; - - mxCellRenderer.registerShape('manualInput', ManualInputShape); - - // Internal storage - function InternalStorageShape() - { - mxRectangleShape.call(this); - }; - mxUtils.extend(InternalStorageShape, mxRectangleShape); - InternalStorageShape.prototype.dx = 20; - InternalStorageShape.prototype.dy = 20; - InternalStorageShape.prototype.isHtmlAllowed = function() - { - return false; - }; - InternalStorageShape.prototype.paintForeground = function(c, x, y, w, h) - { - mxRectangleShape.prototype.paintForeground.apply(this, arguments); - var inset = 0; - - if (this.isRounded) - { - var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, - mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100; - inset = Math.max(inset, Math.min(w * f, h * f)); - } - - var dx = Math.max(inset, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx)))); - var dy = Math.max(inset, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy)))); - - c.begin(); - c.moveTo(x, y + dy); - c.lineTo(x + w, y + dy); - c.end(); - c.stroke(); - - c.begin(); - c.moveTo(x + dx, y); - c.lineTo(x + dx, y + h); - c.end(); - c.stroke(); - }; - - mxCellRenderer.registerShape('internalStorage', InternalStorageShape); - - // Internal storage - function CornerShape() - { - mxActor.call(this); - }; - mxUtils.extend(CornerShape, mxActor); - CornerShape.prototype.dx = 20; - CornerShape.prototype.dy = 20; - - // Corner - CornerShape.prototype.redrawPath = function(c, x, y, w, h) - { - var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx)))); - var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy)))); - - var s = Math.min(w / 2, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, dy), new mxPoint(dx, dy), - new mxPoint(dx, h), new mxPoint(0, h)], this.isRounded, arcSize, true); - c.end(); - }; - - mxCellRenderer.registerShape('corner', CornerShape); - - // Crossbar shape - function CrossbarShape() - { - mxActor.call(this); - }; - mxUtils.extend(CrossbarShape, mxActor); - - CrossbarShape.prototype.redrawPath = function(c, x, y, w, h) - { - c.moveTo(0, 0); - c.lineTo(0, h); - c.end(); - - c.moveTo(w, 0); - c.lineTo(w, h); - c.end(); - - c.moveTo(0, h / 2); - c.lineTo(w, h / 2); - c.end(); - }; - - mxCellRenderer.registerShape('crossbar', CrossbarShape); - - // Internal storage - function TeeShape() - { - mxActor.call(this); - }; - mxUtils.extend(TeeShape, mxActor); - TeeShape.prototype.dx = 20; - TeeShape.prototype.dy = 20; - - // Corner - TeeShape.prototype.redrawPath = function(c, x, y, w, h) - { - var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx)))); - var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy)))); - var w2 = Math.abs(w - dx) / 2; - - var s = Math.min(w / 2, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, dy), new mxPoint((w + dx) / 2, dy), - new mxPoint((w + dx) / 2, h), new mxPoint((w - dx) / 2, h), new mxPoint((w - dx) / 2, dy), - new mxPoint(0, dy)], this.isRounded, arcSize, true); - c.end(); - }; - - mxCellRenderer.registerShape('tee', TeeShape); - - // Arrow - function SingleArrowShape() - { - mxActor.call(this); - }; - mxUtils.extend(SingleArrowShape, mxActor); - SingleArrowShape.prototype.arrowWidth = 0.3; - SingleArrowShape.prototype.arrowSize = 0.2; - SingleArrowShape.prototype.redrawPath = function(c, x, y, w, h) - { - var aw = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowWidth', this.arrowWidth)))); - var as = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowSize', this.arrowSize)))); - var at = (h - aw) / 2; - var ab = at + aw; - - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - this.addPoints(c, [new mxPoint(0, at), new mxPoint(w - as, at), new mxPoint(w - as, 0), new mxPoint(w, h / 2), - new mxPoint(w - as, h), new mxPoint(w - as, ab), new mxPoint(0, ab)], - this.isRounded, arcSize, true); - c.end(); - }; - - mxCellRenderer.registerShape('singleArrow', SingleArrowShape); - - // Arrow - function DoubleArrowShape() - { - mxActor.call(this); - }; - mxUtils.extend(DoubleArrowShape, mxActor); - DoubleArrowShape.prototype.redrawPath = function(c, x, y, w, h) - { - var aw = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowWidth', SingleArrowShape.prototype.arrowWidth)))); - var as = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowSize', SingleArrowShape.prototype.arrowSize)))); - var at = (h - aw) / 2; - var ab = at + aw; - - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - this.addPoints(c, [new mxPoint(0, h / 2), new mxPoint(as, 0), new mxPoint(as, at), new mxPoint(w - as, at), - new mxPoint(w - as, 0), new mxPoint(w, h / 2), new mxPoint(w - as, h), - new mxPoint(w - as, ab), new mxPoint(as, ab), new mxPoint(as, h)], - this.isRounded, arcSize, true); - c.end(); - }; - - mxCellRenderer.registerShape('doubleArrow', DoubleArrowShape); - - // Data storage - function DataStorageShape() - { - mxActor.call(this); - }; - mxUtils.extend(DataStorageShape, mxActor); - DataStorageShape.prototype.size = 0.1; - DataStorageShape.prototype.redrawPath = function(c, x, y, w, h) - { - var s = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - - c.moveTo(s, 0); - c.lineTo(w, 0); - c.quadTo(w - s * 2, h / 2, w, h); - c.lineTo(s, h); - c.quadTo(s - s * 2, h / 2, s, 0); - c.close(); - c.end(); - }; - - mxCellRenderer.registerShape('dataStorage', DataStorageShape); - - // Or - function OrShape() - { - mxActor.call(this); - }; - mxUtils.extend(OrShape, mxActor); - OrShape.prototype.redrawPath = function(c, x, y, w, h) - { - c.moveTo(0, 0); - c.quadTo(w, 0, w, h / 2); - c.quadTo(w, h, 0, h); - c.close(); - c.end(); - }; - - mxCellRenderer.registerShape('or', OrShape); - - // Xor - function XorShape() - { - mxActor.call(this); - }; - mxUtils.extend(XorShape, mxActor); - XorShape.prototype.redrawPath = function(c, x, y, w, h) - { - c.moveTo(0, 0); - c.quadTo(w, 0, w, h / 2); - c.quadTo(w, h, 0, h); - c.quadTo(w / 2, h / 2, 0, 0); - c.close(); - c.end(); - }; - - mxCellRenderer.registerShape('xor', XorShape); - - // Loop limit - function LoopLimitShape() - { - mxActor.call(this); - }; - mxUtils.extend(LoopLimitShape, mxActor); - LoopLimitShape.prototype.size = 20; - LoopLimitShape.prototype.redrawPath = function(c, x, y, w, h) - { - var s = Math.min(w / 2, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - this.addPoints(c, [new mxPoint(s, 0), new mxPoint(w - s, 0), new mxPoint(w, s * 0.8), new mxPoint(w, h), - new mxPoint(0, h), new mxPoint(0, s * 0.8)], this.isRounded, arcSize, true); - c.end(); - }; - - mxCellRenderer.registerShape('loopLimit', LoopLimitShape); - - // Off page connector - function OffPageConnectorShape() - { - mxActor.call(this); - }; - mxUtils.extend(OffPageConnectorShape, mxActor); - OffPageConnectorShape.prototype.size = 3 / 8; - OffPageConnectorShape.prototype.redrawPath = function(c, x, y, w, h) - { - var s = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, h - s), new mxPoint(w / 2, h), - new mxPoint(0, h - s)], this.isRounded, arcSize, true); - c.end(); - }; - - mxCellRenderer.registerShape('offPageConnector', OffPageConnectorShape); - - // Internal storage - function TapeDataShape() - { - mxEllipse.call(this); - }; - mxUtils.extend(TapeDataShape, mxEllipse); - TapeDataShape.prototype.paintVertexShape = function(c, x, y, w, h) - { - mxEllipse.prototype.paintVertexShape.apply(this, arguments); - - c.begin(); - c.moveTo(x + w / 2, y + h); - c.lineTo(x + w, y + h); - c.end(); - c.stroke(); - }; - - mxCellRenderer.registerShape('tapeData', TapeDataShape); - - // OrEllipseShape - function OrEllipseShape() - { - mxEllipse.call(this); - }; - mxUtils.extend(OrEllipseShape, mxEllipse); - OrEllipseShape.prototype.paintVertexShape = function(c, x, y, w, h) - { - mxEllipse.prototype.paintVertexShape.apply(this, arguments); - - c.setShadow(false); - c.begin(); - c.moveTo(x, y + h / 2); - c.lineTo(x + w, y + h / 2); - c.end(); - c.stroke(); - - c.begin(); - c.moveTo(x + w / 2, y); - c.lineTo(x + w / 2, y + h); - c.end(); - c.stroke(); - }; - - mxCellRenderer.registerShape('orEllipse', OrEllipseShape); - - // SumEllipseShape - function SumEllipseShape() - { - mxEllipse.call(this); - }; - mxUtils.extend(SumEllipseShape, mxEllipse); - SumEllipseShape.prototype.paintVertexShape = function(c, x, y, w, h) - { - mxEllipse.prototype.paintVertexShape.apply(this, arguments); - var s2 = 0.145; - - c.setShadow(false); - c.begin(); - c.moveTo(x + w * s2, y + h * s2); - c.lineTo(x + w * (1 - s2), y + h * (1 - s2)); - c.end(); - c.stroke(); - - c.begin(); - c.moveTo(x + w * (1 - s2), y + h * s2); - c.lineTo(x + w * s2, y + h * (1 - s2)); - c.end(); - c.stroke(); - }; - - mxCellRenderer.registerShape('sumEllipse', SumEllipseShape); - - // SortShape - function SortShape() - { - mxRhombus.call(this); - }; - mxUtils.extend(SortShape, mxRhombus); - SortShape.prototype.paintVertexShape = function(c, x, y, w, h) - { - mxRhombus.prototype.paintVertexShape.apply(this, arguments); - - c.setShadow(false); - c.begin(); - c.moveTo(x, y + h / 2); - c.lineTo(x + w, y + h / 2); - c.end(); - c.stroke(); - }; - - mxCellRenderer.registerShape('sortShape', SortShape); - - // CollateShape - function CollateShape() - { - mxEllipse.call(this); - }; - mxUtils.extend(CollateShape, mxEllipse); - CollateShape.prototype.paintVertexShape = function(c, x, y, w, h) - { - c.begin(); - c.moveTo(x, y); - c.lineTo(x + w, y); - c.lineTo(x + w / 2, y + h / 2); - c.close(); - c.fillAndStroke(); - - c.begin(); - c.moveTo(x, y + h); - c.lineTo(x + w, y + h); - c.lineTo(x + w / 2, y + h / 2); - c.close(); - c.fillAndStroke(); - }; - - mxCellRenderer.registerShape('collate', CollateShape); - - // DimensionShape - function DimensionShape() - { - mxEllipse.call(this); - }; - mxUtils.extend(DimensionShape, mxEllipse); - DimensionShape.prototype.paintVertexShape = function(c, x, y, w, h) - { - // Arrow size - var al = 10; - var cy = y + h - al / 2; - - c.begin(); - c.moveTo(x, y); - c.lineTo(x, y + h); - c.moveTo(x, cy); - c.lineTo(x + al, cy - al / 2); - c.moveTo(x, cy); - c.lineTo(x + al, cy + al / 2); - c.moveTo(x, cy); - c.lineTo(x + w, cy); - - // Opposite side - c.moveTo(x + w, y); - c.lineTo(x + w, y + h); - c.moveTo(x + w, cy); - c.lineTo(x + w - al, cy - al / 2); - c.moveTo(x + w, cy); - c.lineTo(x + w - al, cy + al / 2); - c.end(); - c.stroke(); - }; - - mxCellRenderer.registerShape('dimension', DimensionShape); - - // PartialRectangleShape - function PartialRectangleShape() - { - mxEllipse.call(this); - }; - mxUtils.extend(PartialRectangleShape, mxEllipse); - PartialRectangleShape.prototype.paintVertexShape = function(c, x, y, w, h) - { - if (!this.outline) - { - c.setStrokeColor(null); - } - - mxRectangleShape.prototype.paintBackground.apply(this, arguments); - - if (this.style != null) - { - c.setStrokeColor(this.stroke); - c.rect(x, y, w, h); - c.fill(); - - c.begin(); - c.moveTo(x, y); - - if (mxUtils.getValue(this.style, 'top', '1') == '1') - { - c.lineTo(x + w, y); - } - else - { - c.moveTo(x + w, y); - } - - if (mxUtils.getValue(this.style, 'right', '1') == '1') - { - c.lineTo(x + w, y + h); - } - else - { - c.moveTo(x + w, y + h); - } - - if (mxUtils.getValue(this.style, 'bottom', '1') == '1') - { - c.lineTo(x, y + h); - } - else - { - c.moveTo(x, y + h); - } - - if (mxUtils.getValue(this.style, 'left', '1') == '1') - { - c.lineTo(x, y - this.strokewidth / 2); - } - - c.end(); - c.stroke(); - } - }; - - mxCellRenderer.registerShape('partialRectangle', PartialRectangleShape); - - // LineEllipseShape - function LineEllipseShape() - { - mxEllipse.call(this); - }; - mxUtils.extend(LineEllipseShape, mxEllipse); - LineEllipseShape.prototype.paintVertexShape = function(c, x, y, w, h) - { - mxEllipse.prototype.paintVertexShape.apply(this, arguments); - - c.setShadow(false); - c.begin(); - - if (mxUtils.getValue(this.style, 'line') == 'vertical') - { - c.moveTo(x + w / 2, y); - c.lineTo(x + w / 2, y + h); - } - else - { - c.moveTo(x, y + h / 2); - c.lineTo(x + w, y + h / 2); - } - - c.end(); - c.stroke(); - }; - - mxCellRenderer.registerShape('lineEllipse', LineEllipseShape); - - // Delay - function DelayShape() - { - mxActor.call(this); - }; - mxUtils.extend(DelayShape, mxActor); - DelayShape.prototype.redrawPath = function(c, x, y, w, h) - { - var dx = Math.min(w, h / 2); - c.moveTo(0, 0); - c.lineTo(w - dx, 0); - c.quadTo(w, 0, w, h / 2); - c.quadTo(w, h, w - dx, h); - c.lineTo(0, h); - c.close(); - c.end(); - }; - - mxCellRenderer.registerShape('delay', DelayShape); - - // Cross Shape - function CrossShape() - { - mxActor.call(this); - }; - mxUtils.extend(CrossShape, mxActor); - CrossShape.prototype.size = 0.2; - CrossShape.prototype.redrawPath = function(c, x, y, w, h) - { - var m = Math.min(h, w); - var size = Math.max(0, Math.min(m, m * parseFloat(mxUtils.getValue(this.style, 'size', this.size)))); - var t = (h - size) / 2; - var b = t + size; - var l = (w - size) / 2; - var r = l + size; - - c.moveTo(0, t); - c.lineTo(l, t); - c.lineTo(l, 0); - c.lineTo(r, 0); - c.lineTo(r, t); - c.lineTo(w, t); - c.lineTo(w, b); - c.lineTo(r, b); - c.lineTo(r, h); - c.lineTo(l, h); - c.lineTo(l, b); - c.lineTo(0, b); - c.close(); - c.end(); - }; - - mxCellRenderer.registerShape('cross', CrossShape); - - // Display - function DisplayShape() - { - mxActor.call(this); - }; - mxUtils.extend(DisplayShape, mxActor); - DisplayShape.prototype.size = 0.25; - DisplayShape.prototype.redrawPath = function(c, x, y, w, h) - { - var dx = Math.min(w, h / 2); - var s = Math.min(w - dx, Math.max(0, parseFloat(mxUtils.getValue(this.style, 'size', this.size))) * w); - - c.moveTo(0, h / 2); - c.lineTo(s, 0); - c.lineTo(w - dx, 0); - c.quadTo(w, 0, w, h / 2); - c.quadTo(w, h, w - dx, h); - c.lineTo(s, h); - c.close(); - c.end(); - }; - - mxCellRenderer.registerShape('display', DisplayShape); - - // FilledEdge shape - function FilledEdge() - { - mxConnector.call(this); - }; - mxUtils.extend(FilledEdge, mxConnector); - - FilledEdge.prototype.origPaintEdgeShape = FilledEdge.prototype.paintEdgeShape; - FilledEdge.prototype.paintEdgeShape = function(c, pts, rounded) - { - // Markers modify incoming points array - var temp = []; - - for (var i = 0; i < pts.length; i++) - { - temp.push(mxUtils.clone(pts[i])); - } - - // paintEdgeShape resets dashed to false - var dashed = c.state.dashed; - var fixDash = c.state.fixDash; - FilledEdge.prototype.origPaintEdgeShape.apply(this, [c, temp, rounded]); - - if (c.state.strokeWidth >= 3) - { - var fillClr = mxUtils.getValue(this.style, 'fillColor', null); - - if (fillClr != null) - { - c.setStrokeColor(fillClr); - c.setStrokeWidth(c.state.strokeWidth - 2); - c.setDashed(dashed, fixDash); - - FilledEdge.prototype.origPaintEdgeShape.apply(this, [c, pts, rounded]); - } - } - }; - - // Registers the link shape - mxCellRenderer.registerShape('filledEdge', FilledEdge); - - // Implements custom colors for shapes - if (typeof StyleFormatPanel !== 'undefined') - { - (function() - { - var styleFormatPanelGetCustomColors = StyleFormatPanel.prototype.getCustomColors; - - StyleFormatPanel.prototype.getCustomColors = function() - { - var ss = this.format.getSelectionState(); - var result = styleFormatPanelGetCustomColors.apply(this, arguments); - - if (ss.style.shape == 'umlFrame') - { - result.push({title: mxResources.get('laneColor'), key: 'swimlaneFillColor', defaultValue: '#ffffff'}); - } - - return result; - }; - })(); - } - - // Registers and defines the custom marker - mxMarker.addMarker('dash', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled) - { - var nx = unitX * (size + sw + 1); - var ny = unitY * (size + sw + 1); - - return function() - { - c.begin(); - c.moveTo(pe.x - nx / 2 - ny / 2, pe.y - ny / 2 + nx / 2); - c.lineTo(pe.x + ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 - nx / 2); - c.stroke(); - }; - }); - - // Registers and defines the custom marker - mxMarker.addMarker('cross', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled) - { - var nx = unitX * (size + sw + 1); - var ny = unitY * (size + sw + 1); - - return function() - { - c.begin(); - c.moveTo(pe.x - nx / 2 - ny / 2, pe.y - ny / 2 + nx / 2); - c.lineTo(pe.x + ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 - nx / 2); - c.moveTo(pe.x - nx / 2 + ny / 2, pe.y - ny / 2 - nx / 2); - c.lineTo(pe.x - ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 + nx / 2); - c.stroke(); - }; - }); - - function circleMarker(c, shape, type, pe, unitX, unitY, size, source, sw, filled) - { - var a = size / 2; - var size = size + sw; - - var pt = pe.clone(); - - pe.x -= unitX * (2 * size + sw); - pe.y -= unitY * (2 * size + sw); - - unitX = unitX * (size + sw); - unitY = unitY * (size + sw); - - return function() - { - c.ellipse(pt.x - unitX - size, pt.y - unitY - size, 2 * size, 2 * size); - - if (filled) - { - c.fillAndStroke(); - } - else - { - c.stroke(); - } - }; - }; - - mxMarker.addMarker('circle', circleMarker); - mxMarker.addMarker('circlePlus', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled) - { - var pt = pe.clone(); - var fn = circleMarker.apply(this, arguments); - var nx = unitX * (size + 2 * sw); // (size + sw + 1); - var ny = unitY * (size + 2 * sw); //(size + sw + 1); - - return function() - { - fn.apply(this, arguments); - - c.begin(); - c.moveTo(pt.x - unitX * (sw), pt.y - unitY * (sw)); - c.lineTo(pt.x - 2 * nx + unitX * (sw), pt.y - 2 * ny + unitY * (sw)); - c.moveTo(pt.x - nx - ny + unitY * sw, pt.y - ny + nx - unitX * sw); - c.lineTo(pt.x + ny - nx - unitY * sw, pt.y - ny - nx + unitX * sw); - c.stroke(); - }; - }); - - mxMarker.addMarker('async', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled) - { - // The angle of the forward facing arrow sides against the x axis is - // 26.565 degrees, 1/sin(26.565) = 2.236 / 2 = 1.118 ( / 2 allows for - // only half the strokewidth is processed ). - var endOffsetX = unitX * sw * 1.118; - var endOffsetY = unitY * sw * 1.118; - - unitX = unitX * (size + sw); - unitY = unitY * (size + sw); - - var pt = pe.clone(); - pt.x -= endOffsetX; - pt.y -= endOffsetY; - - var f = 1; - pe.x += -unitX * f - endOffsetX; - pe.y += -unitY * f - endOffsetY; - - return function() - { - c.begin(); - c.moveTo(pt.x, pt.y); - - if (source) - { - c.lineTo(pt.x - unitX - unitY / 2, pt.y - unitY + unitX / 2); - } - else - { - c.lineTo(pt.x + unitY / 2 - unitX, pt.y - unitY - unitX / 2); - } - - c.lineTo(pt.x - unitX, pt.y - unitY); - c.close(); - - if (filled) - { - c.fillAndStroke(); - } - else - { - c.stroke(); - } - }; - }); - - function createOpenAsyncArrow(widthFactor) - { - widthFactor = (widthFactor != null) ? widthFactor : 2; - - return function(c, shape, type, pe, unitX, unitY, size, source, sw, filled) - { - unitX = unitX * (size + sw); - unitY = unitY * (size + sw); - - var pt = pe.clone(); - - return function() - { - c.begin(); - c.moveTo(pt.x, pt.y); - - if (source) - { - c.lineTo(pt.x - unitX - unitY / widthFactor, pt.y - unitY + unitX / widthFactor); - } - else - { - c.lineTo(pt.x + unitY / widthFactor - unitX, pt.y - unitY - unitX / widthFactor); - } - - c.stroke(); - }; - } - }; - - mxMarker.addMarker('openAsync', createOpenAsyncArrow(2)); - - function arrow(canvas, shape, type, pe, unitX, unitY, size, source, sw, filled) - { - // The angle of the forward facing arrow sides against the x axis is - // 26.565 degrees, 1/sin(26.565) = 2.236 / 2 = 1.118 ( / 2 allows for - // only half the strokewidth is processed ). - var endOffsetX = unitX * sw * 1.118; - var endOffsetY = unitY * sw * 1.118; - - unitX = unitX * (size + sw); - unitY = unitY * (size + sw); - - var pt = pe.clone(); - pt.x -= endOffsetX; - pt.y -= endOffsetY; - - var f = (type != mxConstants.ARROW_CLASSIC && type != mxConstants.ARROW_CLASSIC_THIN) ? 1 : 3 / 4; - pe.x += -unitX * f - endOffsetX; - pe.y += -unitY * f - endOffsetY; - - return function() - { - canvas.begin(); - canvas.moveTo(pt.x, pt.y); - canvas.lineTo(pt.x - unitX - unitY / widthFactor, pt.y - unitY + unitX / widthFactor); - - if (type == mxConstants.ARROW_CLASSIC || type == mxConstants.ARROW_CLASSIC_THIN) - { - canvas.lineTo(pt.x - unitX * 3 / 4, pt.y - unitY * 3 / 4); - } - - canvas.lineTo(pt.x + unitY / widthFactor - unitX, pt.y - unitY - unitX / widthFactor); - canvas.close(); - - if (filled) - { - canvas.fillAndStroke(); - } - else - { - canvas.stroke(); - } - }; - } - - // Handlers are only added if mxVertexHandler is defined (ie. not in embedded graph) - if (typeof mxVertexHandler !== 'undefined') - { - function createHandle(state, keys, getPositionFn, setPositionFn, ignoreGrid, redrawEdges) - { - var handle = new mxHandle(state, null, mxVertexHandler.prototype.secondaryHandleImage); - - handle.execute = function() - { - for (var i = 0; i < keys.length; i++) - { - this.copyStyle(keys[i]); - } - }; - - handle.getPosition = getPositionFn; - handle.setPosition = setPositionFn; - handle.ignoreGrid = (ignoreGrid != null) ? ignoreGrid : true; - - // Overridden to update connected edges - if (redrawEdges) - { - var positionChanged = handle.positionChanged; - - handle.positionChanged = function() - { - positionChanged.apply(this, arguments); - - // Redraws connected edges TODO: Include child edges - state.view.invalidate(this.state.cell); - state.view.validate(); - }; - } - - return handle; - }; - - function createArcHandle(state, yOffset) - { - return createHandle(state, [mxConstants.STYLE_ARCSIZE], function(bounds) - { - var tmp = (yOffset != null) ? yOffset : bounds.height / 8; - - if (mxUtils.getValue(state.style, mxConstants.STYLE_ABSOLUTE_ARCSIZE, 0) == '1') - { - var arcSize = mxUtils.getValue(state.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2; - - return new mxPoint(bounds.x + bounds.width - Math.min(bounds.width / 2, arcSize), bounds.y + tmp); - } - else - { - var arcSize = Math.max(0, parseFloat(mxUtils.getValue(state.style, - mxConstants.STYLE_ARCSIZE, mxConstants.RECTANGLE_ROUNDING_FACTOR * 100))) / 100; - - return new mxPoint(bounds.x + bounds.width - Math.min(Math.max(bounds.width / 2, bounds.height / 2), - Math.min(bounds.width, bounds.height) * arcSize), bounds.y + tmp); - } - }, function(bounds, pt, me) - { - if (mxUtils.getValue(state.style, mxConstants.STYLE_ABSOLUTE_ARCSIZE, 0) == '1') - { - this.state.style[mxConstants.STYLE_ARCSIZE] = Math.round(Math.max(0, Math.min(bounds.width, - (bounds.x + bounds.width - pt.x) * 2))); - } - else - { - var f = Math.min(50, Math.max(0, (bounds.width - pt.x + bounds.x) * 100 / - Math.min(bounds.width, bounds.height))); - this.state.style[mxConstants.STYLE_ARCSIZE] = Math.round(f); - } - }); - } - - function createArcHandleFunction() - { - return function(state) - { - var handles = []; - - if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false)) - { - handles.push(createArcHandle(state)); - } - - return handles; - }; - }; - - function createTrapezoidHandleFunction(max) - { - return function(state) - { - var handles = [createHandle(state, ['size'], function(bounds) - { - var size = Math.max(0, Math.min(max, parseFloat(mxUtils.getValue(this.state.style, 'size', TrapezoidShape.prototype.size)))); - - return new mxPoint(bounds.x + size * bounds.width * 0.75, bounds.y + bounds.height / 4); - }, function(bounds, pt) - { - this.state.style['size'] = Math.max(0, Math.min(max, (pt.x - bounds.x) / (bounds.width * 0.75))); - }, null, true)]; - - if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false)) - { - handles.push(createArcHandle(state)); - } - - return handles; - }; - }; - - function createDisplayHandleFunction(defaultValue, allowArcHandle, max, redrawEdges, fixedDefaultValue) - { - max = (max != null) ? max : 1; - - return function(state) - { - var handles = [createHandle(state, ['size'], function(bounds) - { - var fixed = (fixedDefaultValue != null) ? mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0' : null; - var size = parseFloat(mxUtils.getValue(this.state.style, 'size', (fixed) ? fixedDefaultValue : defaultValue)); - - return new mxPoint(bounds.x + Math.max(0, Math.min(bounds.width, size * ((fixed) ? 1 : bounds.width))), bounds.getCenterY()); - }, function(bounds, pt, me) - { - var fixed = (fixedDefaultValue != null) ? mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0' : null; - var size = (fixed) ? (pt.x - bounds.x) : Math.max(0, Math.min(max, (pt.x - bounds.x) / bounds.width)); - - if (fixed && !mxEvent.isAltDown(me.getEvent())) - { - size = state.view.graph.snap(size); - } - - this.state.style['size'] = size; - }, null, redrawEdges)]; - - if (allowArcHandle && mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false)) - { - handles.push(createArcHandle(state)); - } - - return handles; - }; - }; - - function createCubeHandleFunction(factor, defaultValue, allowArcHandle) - { - return function(state) - { - var handles = [createHandle(state, ['size'], function(bounds) - { - var size = Math.max(0, Math.min(bounds.width, Math.min(bounds.height, parseFloat( - mxUtils.getValue(this.state.style, 'size', defaultValue))))) * factor; - - return new mxPoint(bounds.x + size, bounds.y + size); - }, function(bounds, pt) - { - this.state.style['size'] = Math.round(Math.max(0, Math.min(Math.min(bounds.width, pt.x - bounds.x), - Math.min(bounds.height, pt.y - bounds.y))) / factor); - })]; - - if (allowArcHandle && mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false)) - { - handles.push(createArcHandle(state)); - } - - return handles; - }; - }; - - function createArrowHandleFunction(maxSize) - { - return function(state) - { - return [createHandle(state, ['arrowWidth', 'arrowSize'], function(bounds) - { - var aw = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'arrowWidth', SingleArrowShape.prototype.arrowWidth))); - var as = Math.max(0, Math.min(maxSize, mxUtils.getValue(this.state.style, 'arrowSize', SingleArrowShape.prototype.arrowSize))); - - return new mxPoint(bounds.x + (1 - as) * bounds.width, bounds.y + (1 - aw) * bounds.height / 2); - }, function(bounds, pt) - { - this.state.style['arrowWidth'] = Math.max(0, Math.min(1, Math.abs(bounds.y + bounds.height / 2 - pt.y) / bounds.height * 2)); - this.state.style['arrowSize'] = Math.max(0, Math.min(maxSize, (bounds.x + bounds.width - pt.x) / (bounds.width))); - })]; - }; - }; - - function createEdgeHandle(state, keys, start, getPosition, setPosition) - { - return createHandle(state, keys, function(bounds) - { - var pts = state.absolutePoints; - var n = pts.length - 1; - - var tr = state.view.translate; - var s = state.view.scale; - - var p0 = (start) ? pts[0] : pts[n]; - var p1 = (start) ? pts[1] : pts[n - 1]; - var dx = (start) ? p1.x - p0.x : p1.x - p0.x; - var dy = (start) ? p1.y - p0.y : p1.y - p0.y; - - var dist = Math.sqrt(dx * dx + dy * dy); - - var pt = getPosition.call(this, dist, dx / dist, dy / dist, p0, p1); - - return new mxPoint(pt.x / s - tr.x, pt.y / s - tr.y); - }, function(bounds, pt, me) - { - var pts = state.absolutePoints; - var n = pts.length - 1; - - var tr = state.view.translate; - var s = state.view.scale; - - var p0 = (start) ? pts[0] : pts[n]; - var p1 = (start) ? pts[1] : pts[n - 1]; - var dx = (start) ? p1.x - p0.x : p1.x - p0.x; - var dy = (start) ? p1.y - p0.y : p1.y - p0.y; - - var dist = Math.sqrt(dx * dx + dy * dy); - pt.x = (pt.x + tr.x) * s; - pt.y = (pt.y + tr.y) * s; - - setPosition.call(this, dist, dx / dist, dy / dist, p0, p1, pt, me); - }); - }; - - function createEdgeWidthHandle(state, start, spacing) - { - return createEdgeHandle(state, ['width'], start, function(dist, nx, ny, p0, p1) - { - var w = state.shape.getEdgeWidth() * state.view.scale + spacing; - - return new mxPoint(p0.x + nx * dist / 4 + ny * w / 2, p0.y + ny * dist / 4 - nx * w / 2); - }, function(dist, nx, ny, p0, p1, pt) - { - var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y)); - state.style['width'] = Math.round(w * 2) / state.view.scale - spacing; - }); - }; - - function ptLineDistance(x1, y1, x2, y2, x0, y0) - { - return Math.abs((y2 - y1) * x0 - (x2 - x1) * y0 + x2 * y1 - y2 * x1) / Math.sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1)); - } - - var handleFactory = { - 'link': function(state) - { - var spacing = 10; - - return [createEdgeWidthHandle(state, true, spacing), createEdgeWidthHandle(state, false, spacing)]; - }, - 'flexArrow': function(state) - { - // Do not use state.shape.startSize/endSize since it is cached - var tol = state.view.graph.gridSize / state.view.scale; - var handles = []; - - if (mxUtils.getValue(state.style, mxConstants.STYLE_STARTARROW, mxConstants.NONE) != mxConstants.NONE) - { - handles.push(createEdgeHandle(state, ['width', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], true, function(dist, nx, ny, p0, p1) - { - var w = (state.shape.getEdgeWidth() - state.shape.strokewidth) * state.view.scale; - var l = mxUtils.getNumber(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale; - - return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) + ny * w / 2, - p0.y + ny * (l + state.shape.strokewidth * state.view.scale) - nx * w / 2); - }, function(dist, nx, ny, p0, p1, pt, me) - { - var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y)); - var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y); - - state.style[mxConstants.STYLE_STARTSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale; - state.style['width'] = Math.round(w * 2) / state.view.scale; - - // Applies to opposite side - if (mxEvent.isControlDown(me.getEvent())) - { - state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE]; - } - - // Snaps to end geometry - if (!mxEvent.isAltDown(me.getEvent())) - { - if (Math.abs(parseFloat(state.style[mxConstants.STYLE_STARTSIZE]) - parseFloat(state.style[mxConstants.STYLE_ENDSIZE])) < tol / 6) - { - state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE]; - } - } - })); - - handles.push(createEdgeHandle(state, ['startWidth', 'endWidth', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], true, function(dist, nx, ny, p0, p1) - { - var w = (state.shape.getStartArrowWidth() - state.shape.strokewidth) * state.view.scale; - var l = mxUtils.getNumber(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale; - - return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) + ny * w / 2, - p0.y + ny * (l + state.shape.strokewidth * state.view.scale) - nx * w / 2); - }, function(dist, nx, ny, p0, p1, pt, me) - { - var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y)); - var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y); - - state.style[mxConstants.STYLE_STARTSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale; - state.style['startWidth'] = Math.max(0, Math.round(w * 2) - state.shape.getEdgeWidth()) / state.view.scale; - - // Applies to opposite side - if (mxEvent.isControlDown(me.getEvent())) - { - state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE]; - state.style['endWidth'] = state.style['startWidth']; - } - - // Snaps to endWidth - if (!mxEvent.isAltDown(me.getEvent())) - { - if (Math.abs(parseFloat(state.style[mxConstants.STYLE_STARTSIZE]) - parseFloat(state.style[mxConstants.STYLE_ENDSIZE])) < tol / 6) - { - state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE]; - } - - if (Math.abs(parseFloat(state.style['startWidth']) - parseFloat(state.style['endWidth'])) < tol) - { - state.style['startWidth'] = state.style['endWidth']; - } - } - })); - } - - if (mxUtils.getValue(state.style, mxConstants.STYLE_ENDARROW, mxConstants.NONE) != mxConstants.NONE) - { - handles.push(createEdgeHandle(state, ['width', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], false, function(dist, nx, ny, p0, p1) - { - var w = (state.shape.getEdgeWidth() - state.shape.strokewidth) * state.view.scale; - var l = mxUtils.getNumber(state.style, mxConstants.STYLE_ENDSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale; - - return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) - ny * w / 2, - p0.y + ny * (l + state.shape.strokewidth * state.view.scale) + nx * w / 2); - }, function(dist, nx, ny, p0, p1, pt, me) - { - var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y)); - var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y); - - state.style[mxConstants.STYLE_ENDSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale; - state.style['width'] = Math.round(w * 2) / state.view.scale; - - // Applies to opposite side - if (mxEvent.isControlDown(me.getEvent())) - { - state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE]; - } - - // Snaps to start geometry - if (!mxEvent.isAltDown(me.getEvent())) - { - if (Math.abs(parseFloat(state.style[mxConstants.STYLE_ENDSIZE]) - parseFloat(state.style[mxConstants.STYLE_STARTSIZE])) < tol / 6) - { - state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE]; - } - } - })); - - handles.push(createEdgeHandle(state, ['startWidth', 'endWidth', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], false, function(dist, nx, ny, p0, p1) - { - var w = (state.shape.getEndArrowWidth() - state.shape.strokewidth) * state.view.scale; - var l = mxUtils.getNumber(state.style, mxConstants.STYLE_ENDSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale; - - return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) - ny * w / 2, - p0.y + ny * (l + state.shape.strokewidth * state.view.scale) + nx * w / 2); - }, function(dist, nx, ny, p0, p1, pt, me) - { - var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y)); - var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y); - - state.style[mxConstants.STYLE_ENDSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale; - state.style['endWidth'] = Math.max(0, Math.round(w * 2) - state.shape.getEdgeWidth()) / state.view.scale; - - // Applies to opposite side - if (mxEvent.isControlDown(me.getEvent())) - { - state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE]; - state.style['startWidth'] = state.style['endWidth']; - } - - // Snaps to start geometry - if (!mxEvent.isAltDown(me.getEvent())) - { - if (Math.abs(parseFloat(state.style[mxConstants.STYLE_ENDSIZE]) - parseFloat(state.style[mxConstants.STYLE_STARTSIZE])) < tol / 6) - { - state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE]; - } - - if (Math.abs(parseFloat(state.style['endWidth']) - parseFloat(state.style['startWidth'])) < tol) - { - state.style['endWidth'] = state.style['startWidth']; - } - } - })); - } - - return handles; - }, - 'swimlane': function(state) - { - var handles = [createHandle(state, [mxConstants.STYLE_STARTSIZE], function(bounds) - { - var size = parseFloat(mxUtils.getValue(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE)); - - if (mxUtils.getValue(state.style, mxConstants.STYLE_HORIZONTAL, 1) == 1) - { - return new mxPoint(bounds.getCenterX(), bounds.y + Math.max(0, Math.min(bounds.height, size))); - } - else - { - return new mxPoint(bounds.x + Math.max(0, Math.min(bounds.width, size)), bounds.getCenterY()); - } - }, function(bounds, pt) - { - state.style[mxConstants.STYLE_STARTSIZE] = - (mxUtils.getValue(this.state.style, mxConstants.STYLE_HORIZONTAL, 1) == 1) ? - Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y))) : - Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x))); - })]; - - if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED)) - { - var size = parseFloat(mxUtils.getValue(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE)); - handles.push(createArcHandle(state, size / 2)); - } - - return handles; - }, - 'label': createArcHandleFunction(), - 'ext': createArcHandleFunction(), - 'rectangle': createArcHandleFunction(), - 'triangle': createArcHandleFunction(), - 'rhombus': createArcHandleFunction(), - 'umlLifeline': function(state) - { - return [createHandle(state, ['size'], function(bounds) - { - var size = Math.max(0, Math.min(bounds.height, parseFloat(mxUtils.getValue(this.state.style, 'size', UmlLifeline.prototype.size)))); - - return new mxPoint(bounds.getCenterX(), bounds.y + size); - }, function(bounds, pt) - { - this.state.style['size'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y))); - }, false)]; - }, - 'umlFrame': function(state) - { - var handles = [createHandle(state, ['width', 'height'], function(bounds) - { - var w0 = Math.max(UmlFrame.prototype.corner, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'width', UmlFrame.prototype.width))); - var h0 = Math.max(UmlFrame.prototype.corner * 1.5, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'height', UmlFrame.prototype.height))); - - return new mxPoint(bounds.x + w0, bounds.y + h0); - }, function(bounds, pt) - { - this.state.style['width'] = Math.round(Math.max(UmlFrame.prototype.corner, Math.min(bounds.width, pt.x - bounds.x))); - this.state.style['height'] = Math.round(Math.max(UmlFrame.prototype.corner * 1.5, Math.min(bounds.height, pt.y - bounds.y))); - }, false)]; - - return handles; - }, - 'process': function(state) - { - var handles = [createHandle(state, ['size'], function(bounds) - { - var size = Math.max(0, Math.min(0.5, parseFloat(mxUtils.getValue(this.state.style, 'size', ProcessShape.prototype.size)))); - - return new mxPoint(bounds.x + bounds.width * size, bounds.y + bounds.height / 4); - }, function(bounds, pt) - { - this.state.style['size'] = Math.max(0, Math.min(0.5, (pt.x - bounds.x) / bounds.width)); - })]; - - if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false)) - { - handles.push(createArcHandle(state)); - } - - return handles; - }, - 'cross': function(state) - { - return [createHandle(state, ['size'], function(bounds) - { - var m = Math.min(bounds.width, bounds.height); - var size = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'size', CrossShape.prototype.size))) * m / 2; - - return new mxPoint(bounds.getCenterX() - size, bounds.getCenterY() - size); - }, function(bounds, pt) - { - var m = Math.min(bounds.width, bounds.height); - this.state.style['size'] = Math.max(0, Math.min(1, Math.min((Math.max(0, bounds.getCenterY() - pt.y) / m) * 2, - (Math.max(0, bounds.getCenterX() - pt.x) / m) * 2))); - })]; - }, - 'note': function(state) - { - return [createHandle(state, ['size'], function(bounds) - { - var size = Math.max(0, Math.min(bounds.width, Math.min(bounds.height, parseFloat( - mxUtils.getValue(this.state.style, 'size', NoteShape.prototype.size))))); - - return new mxPoint(bounds.x + bounds.width - size, bounds.y + size); - }, function(bounds, pt) - { - this.state.style['size'] = Math.round(Math.max(0, Math.min(Math.min(bounds.width, bounds.x + bounds.width - pt.x), - Math.min(bounds.height, pt.y - bounds.y)))); - })]; - }, - 'manualInput': function(state) - { - var handles = [createHandle(state, ['size'], function(bounds) - { - var size = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'size', ManualInputShape.prototype.size))); - - return new mxPoint(bounds.x + bounds.width / 4, bounds.y + size * 3 / 4); - }, function(bounds, pt) - { - this.state.style['size'] = Math.round(Math.max(0, Math.min(bounds.height, (pt.y - bounds.y) * 4 / 3))); - })]; - - if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false)) - { - handles.push(createArcHandle(state)); - } - - return handles; - }, - 'dataStorage': function(state) - { - return [createHandle(state, ['size'], function(bounds) - { - var size = Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.state.style, 'size', DataStorageShape.prototype.size)))); - - return new mxPoint(bounds.x + (1 - size) * bounds.width, bounds.getCenterY()); - }, function(bounds, pt) - { - this.state.style['size'] = Math.max(0, Math.min(1, (bounds.x + bounds.width - pt.x) / bounds.width)); - })]; - }, - 'callout': function(state) - { - var handles = [createHandle(state, ['size', 'position'], function(bounds) - { - var size = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'size', CalloutShape.prototype.size))); - var position = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'position', CalloutShape.prototype.position))); - var base = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'base', CalloutShape.prototype.base))); - - return new mxPoint(bounds.x + position * bounds.width, bounds.y + bounds.height - size); - }, function(bounds, pt) - { - var base = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'base', CalloutShape.prototype.base))); - this.state.style['size'] = Math.round(Math.max(0, Math.min(bounds.height, bounds.y + bounds.height - pt.y))); - this.state.style['position'] = Math.round(Math.max(0, Math.min(1, (pt.x - bounds.x) / bounds.width)) * 100) / 100; - }), createHandle(state, ['position2'], function(bounds) - { - var position2 = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'position2', CalloutShape.prototype.position2))); - - return new mxPoint(bounds.x + position2 * bounds.width, bounds.y + bounds.height); - }, function(bounds, pt) - { - this.state.style['position2'] = Math.round(Math.max(0, Math.min(1, (pt.x - bounds.x) / bounds.width)) * 100) / 100; - }), createHandle(state, ['base'], function(bounds) - { - var size = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'size', CalloutShape.prototype.size))); - var position = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'position', CalloutShape.prototype.position))); - var base = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'base', CalloutShape.prototype.base))); - - return new mxPoint(bounds.x + Math.min(bounds.width, position * bounds.width + base), bounds.y + bounds.height - size); - }, function(bounds, pt) - { - var position = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'position', CalloutShape.prototype.position))); - - this.state.style['base'] = Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x - position * bounds.width))); - })]; - - if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false)) - { - handles.push(createArcHandle(state)); - } - - return handles; - }, - 'internalStorage': function(state) - { - var handles = [createHandle(state, ['dx', 'dy'], function(bounds) - { - var dx = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'dx', InternalStorageShape.prototype.dx))); - var dy = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'dy', InternalStorageShape.prototype.dy))); - - return new mxPoint(bounds.x + dx, bounds.y + dy); - }, function(bounds, pt) - { - this.state.style['dx'] = Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x))); - this.state.style['dy'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y))); - })]; - - if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false)) - { - handles.push(createArcHandle(state)); - } - - return handles; - }, - 'corner': function(state) - { - return [createHandle(state, ['dx', 'dy'], function(bounds) - { - var dx = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'dx', CornerShape.prototype.dx))); - var dy = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'dy', CornerShape.prototype.dy))); - - return new mxPoint(bounds.x + dx, bounds.y + dy); - }, function(bounds, pt) - { - this.state.style['dx'] = Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x))); - this.state.style['dy'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y))); - })]; - }, - 'tee': function(state) - { - return [createHandle(state, ['dx', 'dy'], function(bounds) - { - var dx = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'dx', TeeShape.prototype.dx))); - var dy = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'dy', TeeShape.prototype.dy))); - - return new mxPoint(bounds.x + (bounds.width + dx) / 2, bounds.y + dy); - }, function(bounds, pt) - { - this.state.style['dx'] = Math.round(Math.max(0, Math.min(bounds.width / 2, (pt.x - bounds.x - bounds.width / 2)) * 2)); - this.state.style['dy'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y))); - })]; - }, - 'singleArrow': createArrowHandleFunction(1), - 'doubleArrow': createArrowHandleFunction(0.5), - 'folder': function(state) - { - return [createHandle(state, ['tabWidth', 'tabHeight'], function(bounds) - { - var tw = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'tabWidth', FolderShape.prototype.tabWidth))); - var th = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'tabHeight', FolderShape.prototype.tabHeight))); - - if (mxUtils.getValue(this.state.style, 'tabPosition', FolderShape.prototype.tabPosition) == mxConstants.ALIGN_RIGHT) - { - tw = bounds.width - tw; - } - - return new mxPoint(bounds.x + tw, bounds.y + th); - }, function(bounds, pt) - { - var tw = Math.max(0, Math.min(bounds.width, pt.x - bounds.x)); - - if (mxUtils.getValue(this.state.style, 'tabPosition', FolderShape.prototype.tabPosition) == mxConstants.ALIGN_RIGHT) - { - tw = bounds.width - tw; - } - - this.state.style['tabWidth'] = Math.round(tw); - this.state.style['tabHeight'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y))); - })]; - }, - 'document': function(state) - { - return [createHandle(state, ['size'], function(bounds) - { - var size = Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.state.style, 'size', DocumentShape.prototype.size)))); - - return new mxPoint(bounds.x + 3 * bounds.width / 4, bounds.y + (1 - size) * bounds.height); - }, function(bounds, pt) - { - this.state.style['size'] = Math.max(0, Math.min(1, (bounds.y + bounds.height - pt.y) / bounds.height)); - })]; - }, - 'tape': function(state) - { - return [createHandle(state, ['size'], function(bounds) - { - var size = Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.state.style, 'size', TapeShape.prototype.size)))); - - return new mxPoint(bounds.getCenterX(), bounds.y + size * bounds.height / 2); - }, function(bounds, pt) - { - this.state.style['size'] = Math.max(0, Math.min(1, ((pt.y - bounds.y) / bounds.height) * 2)); - })]; - }, - 'offPageConnector': function(state) - { - return [createHandle(state, ['size'], function(bounds) - { - var size = Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.state.style, 'size', OffPageConnectorShape.prototype.size)))); - - return new mxPoint(bounds.getCenterX(), bounds.y + (1 - size) * bounds.height); - }, function(bounds, pt) - { - this.state.style['size'] = Math.max(0, Math.min(1, (bounds.y + bounds.height - pt.y) / bounds.height)); - })]; - }, - 'step': createDisplayHandleFunction(StepShape.prototype.size, true, null, true, StepShape.prototype.fixedSize), - 'hexagon': createDisplayHandleFunction(HexagonShape.prototype.size, true, 0.5, true), - 'curlyBracket': createDisplayHandleFunction(CurlyBracketShape.prototype.size, false), - 'display': createDisplayHandleFunction(DisplayShape.prototype.size, false), - 'cube': createCubeHandleFunction(1, CubeShape.prototype.size, false), - 'card': createCubeHandleFunction(0.5, CardShape.prototype.size, true), - 'loopLimit': createCubeHandleFunction(0.5, LoopLimitShape.prototype.size, true), - 'trapezoid': createTrapezoidHandleFunction(0.5), - 'parallelogram': createTrapezoidHandleFunction(1) - }; - - // Exposes custom handles - Graph.createHandle = createHandle; - Graph.handleFactory = handleFactory; - - mxVertexHandler.prototype.createCustomHandles = function() - { - // Not rotatable means locked - if (this.state.view.graph.getSelectionCount() == 1) - { - if (this.graph.isCellRotatable(this.state.cell)) - // LATER: Make locked state independent of rotatable flag, fix toggle if default is false - //if (this.graph.isCellResizable(this.state.cell) || this.graph.isCellMovable(this.state.cell)) - { - var name = this.state.style['shape']; - - if (mxCellRenderer.defaultShapes[name] == null && - mxStencilRegistry.getStencil(name) == null) - { - name = mxConstants.SHAPE_RECTANGLE; - } - - var fn = handleFactory[name]; - - if (fn == null && this.state.shape != null && this.state.shape.isRoundable()) - { - fn = handleFactory[mxConstants.SHAPE_RECTANGLE]; - } - - if (fn != null) - { - return fn(this.state); - } - } - } - - return null; - }; - - mxEdgeHandler.prototype.createCustomHandles = function() - { - if (this.state.view.graph.getSelectionCount() == 1) - { - var name = this.state.style['shape']; - - if (mxCellRenderer.defaultShapes[name] == null && - mxStencilRegistry.getStencil(name) == null) - { - name = mxConstants.SHAPE_CONNECTOR; - } - - var fn = handleFactory[name]; - - if (fn != null) - { - return fn(this.state); - } - } - - return null; - } - } - else - { - // Dummy entries to avoid NPE in embed mode - Graph.createHandle = function() {}; - Graph.handleFactory = {}; - } - - var isoHVector = new mxPoint(1, 0); - var isoVVector = new mxPoint(1, 0); - - var alpha1 = mxUtils.toRadians(-30); - - var cos1 = Math.cos(alpha1); - var sin1 = Math.sin(alpha1); - - isoHVector = mxUtils.getRotatedPoint(isoHVector, cos1, sin1); - - var alpha2 = mxUtils.toRadians(-150); - - var cos2 = Math.cos(alpha2); - var sin2 = Math.sin(alpha2); - - isoVVector = mxUtils.getRotatedPoint(isoVVector, cos2, sin2); - - mxEdgeStyle.IsometricConnector = function (state, source, target, points, result) - { - var view = state.view; - var pt = (points != null && points.length > 0) ? points[0] : null; - var pts = state.absolutePoints; - var p0 = pts[0]; - var pe = pts[pts.length-1]; - - if (pt != null) - { - pt = view.transformControlPoint(state, pt); - } - - if (p0 == null) - { - if (source != null) - { - p0 = new mxPoint(source.getCenterX(), source.getCenterY()); - } - } - - if (pe == null) - { - if (target != null) - { - pe = new mxPoint(target.getCenterX(), target.getCenterY()); - } - } - - var a1 = isoHVector.x; - var a2 = isoHVector.y; - - var b1 = isoVVector.x; - var b2 = isoVVector.y; - - var elbow = mxUtils.getValue(state.style, 'elbow', 'horizontal') == 'horizontal'; - - if (pe != null && p0 != null) - { - var last = p0; - - function isoLineTo(x, y, ignoreFirst) - { - var c1 = x - last.x; - var c2 = y - last.y; - - // Solves for isometric base vectors - var h = (b2 * c1 - b1 * c2) / (a1 * b2 - a2 * b1); - var v = (a2 * c1 - a1 * c2) / (a2 * b1 - a1 * b2); - - if (elbow) - { - if (ignoreFirst) - { - last = new mxPoint(last.x + a1 * h, last.y + a2 * h); - result.push(last); - } - - last = new mxPoint(last.x + b1 * v, last.y + b2 * v); - result.push(last); - } - else - { - if (ignoreFirst) - { - last = new mxPoint(last.x + b1 * v, last.y + b2 * v); - result.push(last); - } - - last = new mxPoint(last.x + a1 * h, last.y + a2 * h); - result.push(last); - } - }; - - if (pt == null) - { - pt = new mxPoint(p0.x + (pe.x - p0.x) / 2, p0.y + (pe.y - p0.y) / 2); - } - - isoLineTo(pt.x, pt.y, true); - isoLineTo(pe.x, pe.y, false); - } - }; - - mxStyleRegistry.putValue('isometricEdgeStyle', mxEdgeStyle.IsometricConnector); - - var graphCreateEdgeHandler = Graph.prototype.createEdgeHandler; - Graph.prototype.createEdgeHandler = function(state, edgeStyle) - { - if (edgeStyle == mxEdgeStyle.IsometricConnector) - { - var handler = new mxElbowEdgeHandler(state); - handler.snapToTerminals = false; - - return handler; - } - - return graphCreateEdgeHandler.apply(this, arguments); - }; - - // Defines connection points for all shapes - IsoRectangleShape.prototype.constraints = []; - IsoCubeShape.prototype.constraints = []; - CalloutShape.prototype.constraints = []; - mxRectangleShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true), - new mxConnectionConstraint(new mxPoint(0.5, 0), true), - new mxConnectionConstraint(new mxPoint(0.75, 0), true), - new mxConnectionConstraint(new mxPoint(0, 0.25), true), - new mxConnectionConstraint(new mxPoint(0, 0.5), true), - new mxConnectionConstraint(new mxPoint(0, 0.75), true), - new mxConnectionConstraint(new mxPoint(1, 0.25), true), - new mxConnectionConstraint(new mxPoint(1, 0.5), true), - new mxConnectionConstraint(new mxPoint(1, 0.75), true), - new mxConnectionConstraint(new mxPoint(0.25, 1), true), - new mxConnectionConstraint(new mxPoint(0.5, 1), true), - new mxConnectionConstraint(new mxPoint(0.75, 1), true)]; - mxEllipse.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), true), new mxConnectionConstraint(new mxPoint(1, 0), true), - new mxConnectionConstraint(new mxPoint(0, 1), true), new mxConnectionConstraint(new mxPoint(1, 1), true), - new mxConnectionConstraint(new mxPoint(0.5, 0), true), new mxConnectionConstraint(new mxPoint(0.5, 1), true), - new mxConnectionConstraint(new mxPoint(0, 0.5), true), new mxConnectionConstraint(new mxPoint(1, 0.5))]; - mxLabel.prototype.constraints = mxRectangleShape.prototype.constraints; - mxImageShape.prototype.constraints = mxRectangleShape.prototype.constraints; - mxSwimlane.prototype.constraints = mxRectangleShape.prototype.constraints; - PlusShape.prototype.constraints = mxRectangleShape.prototype.constraints; - NoteShape.prototype.constraints = mxRectangleShape.prototype.constraints; - CardShape.prototype.constraints = mxRectangleShape.prototype.constraints; - CubeShape.prototype.constraints = mxRectangleShape.prototype.constraints; - FolderShape.prototype.constraints = mxRectangleShape.prototype.constraints; - InternalStorageShape.prototype.constraints = mxRectangleShape.prototype.constraints; - DataStorageShape.prototype.constraints = mxRectangleShape.prototype.constraints; - TapeDataShape.prototype.constraints = mxEllipse.prototype.constraints; - OrEllipseShape.prototype.constraints = mxEllipse.prototype.constraints; - SumEllipseShape.prototype.constraints = mxEllipse.prototype.constraints; - LineEllipseShape.prototype.constraints = mxEllipse.prototype.constraints; - ManualInputShape.prototype.constraints = mxRectangleShape.prototype.constraints; - DelayShape.prototype.constraints = mxRectangleShape.prototype.constraints; - DisplayShape.prototype.constraints = mxRectangleShape.prototype.constraints; - LoopLimitShape.prototype.constraints = mxRectangleShape.prototype.constraints; - OffPageConnectorShape.prototype.constraints = mxRectangleShape.prototype.constraints; - mxCylinder.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.15, 0.05), false), - new mxConnectionConstraint(new mxPoint(0.5, 0), true), - new mxConnectionConstraint(new mxPoint(0.85, 0.05), false), - new mxConnectionConstraint(new mxPoint(0, 0.3), true), - new mxConnectionConstraint(new mxPoint(0, 0.5), true), - new mxConnectionConstraint(new mxPoint(0, 0.7), true), - new mxConnectionConstraint(new mxPoint(1, 0.3), true), - new mxConnectionConstraint(new mxPoint(1, 0.5), true), - new mxConnectionConstraint(new mxPoint(1, 0.7), true), - new mxConnectionConstraint(new mxPoint(0.15, 0.95), false), - new mxConnectionConstraint(new mxPoint(0.5, 1), true), - new mxConnectionConstraint(new mxPoint(0.85, 0.95), false)]; - UmlActorShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.1), false), - new mxConnectionConstraint(new mxPoint(0.5, 0), false), - new mxConnectionConstraint(new mxPoint(0.75, 0.1), false), - new mxConnectionConstraint(new mxPoint(0, 1/3), false), - new mxConnectionConstraint(new mxPoint(0, 1), false), - new mxConnectionConstraint(new mxPoint(1, 1/3), false), - new mxConnectionConstraint(new mxPoint(1, 1), false), - new mxConnectionConstraint(new mxPoint(0.5, 0.5), false)]; - ComponentShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true), - new mxConnectionConstraint(new mxPoint(0.5, 0), true), - new mxConnectionConstraint(new mxPoint(0.75, 0), true), - new mxConnectionConstraint(new mxPoint(0, 0.3), true), - new mxConnectionConstraint(new mxPoint(0, 0.7), true), - new mxConnectionConstraint(new mxPoint(1, 0.25), true), - new mxConnectionConstraint(new mxPoint(1, 0.5), true), - new mxConnectionConstraint(new mxPoint(1, 0.75), true), - new mxConnectionConstraint(new mxPoint(0.25, 1), true), - new mxConnectionConstraint(new mxPoint(0.5, 1), true), - new mxConnectionConstraint(new mxPoint(0.75, 1), true)]; - mxActor.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), true), - new mxConnectionConstraint(new mxPoint(0.25, 0.2), false), - new mxConnectionConstraint(new mxPoint(0.1, 0.5), false), - new mxConnectionConstraint(new mxPoint(0, 0.75), true), - new mxConnectionConstraint(new mxPoint(0.75, 0.25), false), - new mxConnectionConstraint(new mxPoint(0.9, 0.5), false), - new mxConnectionConstraint(new mxPoint(1, 0.75), true), - new mxConnectionConstraint(new mxPoint(0.25, 1), true), - new mxConnectionConstraint(new mxPoint(0.5, 1), true), - new mxConnectionConstraint(new mxPoint(0.75, 1), true)]; - SwitchShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), false), - new mxConnectionConstraint(new mxPoint(0.5, 0.25), false), - new mxConnectionConstraint(new mxPoint(1, 0), false), - new mxConnectionConstraint(new mxPoint(0.25, 0.5), false), - new mxConnectionConstraint(new mxPoint(0.75, 0.5), false), - new mxConnectionConstraint(new mxPoint(0, 1), false), - new mxConnectionConstraint(new mxPoint(0.5, 0.75), false), - new mxConnectionConstraint(new mxPoint(1, 1), false)]; - TapeShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.35), false), - new mxConnectionConstraint(new mxPoint(0, 0.5), false), - new mxConnectionConstraint(new mxPoint(0, 0.65), false), - new mxConnectionConstraint(new mxPoint(1, 0.35), false), - new mxConnectionConstraint(new mxPoint(1, 0.5), false), - new mxConnectionConstraint(new mxPoint(1, 0.65), false), - new mxConnectionConstraint(new mxPoint(0.25, 1), false), - new mxConnectionConstraint(new mxPoint(0.75, 0), false)]; - StepShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true), - new mxConnectionConstraint(new mxPoint(0.5, 0), true), - new mxConnectionConstraint(new mxPoint(0.75, 0), true), - new mxConnectionConstraint(new mxPoint(0.25, 1), true), - new mxConnectionConstraint(new mxPoint(0.5, 1), true), - new mxConnectionConstraint(new mxPoint(0.75, 1), true), - new mxConnectionConstraint(new mxPoint(0, 0.25), true), - new mxConnectionConstraint(new mxPoint(0, 0.5), true), - new mxConnectionConstraint(new mxPoint(0, 0.75), true), - new mxConnectionConstraint(new mxPoint(1, 0.25), true), - new mxConnectionConstraint(new mxPoint(1, 0.5), true), - new mxConnectionConstraint(new mxPoint(1, 0.75), true)]; - mxLine.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false), - new mxConnectionConstraint(new mxPoint(0.25, 0.5), false), - new mxConnectionConstraint(new mxPoint(0.75, 0.5), false), - new mxConnectionConstraint(new mxPoint(1, 0.5), false)]; - LollipopShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), false), - new mxConnectionConstraint(new mxPoint(0.5, 1), false)]; - mxDoubleEllipse.prototype.constraints = mxEllipse.prototype.constraints; - mxRhombus.prototype.constraints = mxEllipse.prototype.constraints; - mxTriangle.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.25), true), - new mxConnectionConstraint(new mxPoint(0, 0.5), true), - new mxConnectionConstraint(new mxPoint(0, 0.75), true), - new mxConnectionConstraint(new mxPoint(0.5, 0), true), - new mxConnectionConstraint(new mxPoint(0.5, 1), true), - new mxConnectionConstraint(new mxPoint(1, 0.5), true)]; - mxHexagon.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.375, 0), true), - new mxConnectionConstraint(new mxPoint(0.5, 0), true), - new mxConnectionConstraint(new mxPoint(0.625, 0), true), - new mxConnectionConstraint(new mxPoint(0, 0.25), true), - new mxConnectionConstraint(new mxPoint(0, 0.5), true), - new mxConnectionConstraint(new mxPoint(0, 0.75), true), - new mxConnectionConstraint(new mxPoint(1, 0.25), true), - new mxConnectionConstraint(new mxPoint(1, 0.5), true), - new mxConnectionConstraint(new mxPoint(1, 0.75), true), - new mxConnectionConstraint(new mxPoint(0.375, 1), true), - new mxConnectionConstraint(new mxPoint(0.5, 1), true), - new mxConnectionConstraint(new mxPoint(0.625, 1), true)]; - mxCloud.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.25), false), - new mxConnectionConstraint(new mxPoint(0.4, 0.1), false), - new mxConnectionConstraint(new mxPoint(0.16, 0.55), false), - new mxConnectionConstraint(new mxPoint(0.07, 0.4), false), - new mxConnectionConstraint(new mxPoint(0.31, 0.8), false), - new mxConnectionConstraint(new mxPoint(0.13, 0.77), false), - new mxConnectionConstraint(new mxPoint(0.8, 0.8), false), - new mxConnectionConstraint(new mxPoint(0.55, 0.95), false), - new mxConnectionConstraint(new mxPoint(0.875, 0.5), false), - new mxConnectionConstraint(new mxPoint(0.96, 0.7), false), - new mxConnectionConstraint(new mxPoint(0.625, 0.2), false), - new mxConnectionConstraint(new mxPoint(0.88, 0.25), false)]; - ParallelogramShape.prototype.constraints = mxRectangleShape.prototype.constraints; - TrapezoidShape.prototype.constraints = mxRectangleShape.prototype.constraints; - DocumentShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true), - new mxConnectionConstraint(new mxPoint(0.5, 0), true), - new mxConnectionConstraint(new mxPoint(0.75, 0), true), - new mxConnectionConstraint(new mxPoint(0, 0.25), true), - new mxConnectionConstraint(new mxPoint(0, 0.5), true), - new mxConnectionConstraint(new mxPoint(0, 0.75), true), - new mxConnectionConstraint(new mxPoint(1, 0.25), true), - new mxConnectionConstraint(new mxPoint(1, 0.5), true), - new mxConnectionConstraint(new mxPoint(1, 0.75), true)]; - mxArrow.prototype.constraints = null; - TeeShape.prototype.constraints = null; - CornerShape.prototype.constraints = null; - CrossbarShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), false), - new mxConnectionConstraint(new mxPoint(0, 0.5), false), - new mxConnectionConstraint(new mxPoint(0, 1), false), - new mxConnectionConstraint(new mxPoint(0.25, 0.5), false), - new mxConnectionConstraint(new mxPoint(0.5, 0.5), false), - new mxConnectionConstraint(new mxPoint(0.75, 0.5), false), - new mxConnectionConstraint(new mxPoint(1, 0), false), - new mxConnectionConstraint(new mxPoint(1, 0.5), false), - new mxConnectionConstraint(new mxPoint(1, 1), false)]; - - SingleArrowShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false), - new mxConnectionConstraint(new mxPoint(1, 0.5), false)]; - DoubleArrowShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false), - new mxConnectionConstraint(new mxPoint(1, 0.5), false)]; - CrossShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false), - new mxConnectionConstraint(new mxPoint(1, 0.5), false), - new mxConnectionConstraint(new mxPoint(0.5, 0), false), - new mxConnectionConstraint(new mxPoint(0.5, 1), false)]; - UmlLifeline.prototype.constraints = null; - OrShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.25), false), - new mxConnectionConstraint(new mxPoint(0, 0.5), false), - new mxConnectionConstraint(new mxPoint(0, 0.75), false), - new mxConnectionConstraint(new mxPoint(1, 0.5), false), - new mxConnectionConstraint(new mxPoint(0.7, 0.1), false), - new mxConnectionConstraint(new mxPoint(0.7, 0.9), false)]; - XorShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.175, 0.25), false), - new mxConnectionConstraint(new mxPoint(0.25, 0.5), false), - new mxConnectionConstraint(new mxPoint(0.175, 0.75), false), - new mxConnectionConstraint(new mxPoint(1, 0.5), false), - new mxConnectionConstraint(new mxPoint(0.7, 0.1), false), - new mxConnectionConstraint(new mxPoint(0.7, 0.9), false)]; -})(); diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Sidebar.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Sidebar.js deleted file mode 100644 index 8f28f038..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Sidebar.js +++ /dev/null @@ -1,3602 +0,0 @@ -/** - * Copyright (c) 2006-2012, JGraph Ltd - */ -/** - * Construcs a new sidebar for the given editor. - */ -function Sidebar(editorUi, container) -{ - this.editorUi = editorUi; - this.container = container; - this.palettes = new Object(); - this.taglist = new Object(); - this.showTooltips = true; - this.graph = editorUi.createTemporaryGraph(this.editorUi.editor.graph.getStylesheet()); - this.graph.cellRenderer.antiAlias = false; - this.graph.foldingEnabled = false; - this.graph.container.style.visibility = 'hidden'; - document.body.appendChild(this.graph.container); - - this.pointerUpHandler = mxUtils.bind(this, function() - { - this.showTooltips = true; - }); - - mxEvent.addListener(document, (mxClient.IS_POINTER) ? 'pointerup' : 'mouseup', this.pointerUpHandler); - - this.pointerDownHandler = mxUtils.bind(this, function() - { - this.showTooltips = false; - this.hideTooltip(); - }); - - mxEvent.addListener(document, (mxClient.IS_POINTER) ? 'pointerdown' : 'mousedown', this.pointerDownHandler); - - this.pointerMoveHandler = mxUtils.bind(this, function(evt) - { - var src = mxEvent.getSource(evt); - - while (src != null) - { - if (src == this.currentElt) - { - return; - } - - src = src.parentNode; - } - - this.hideTooltip(); - }); - - mxEvent.addListener(document, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', this.pointerMoveHandler); - - // Handles mouse leaving the window - this.pointerOutHandler = mxUtils.bind(this, function(evt) - { - if (evt.toElement == null && evt.relatedTarget == null) - { - this.hideTooltip(); - } - }); - - mxEvent.addListener(document, (mxClient.IS_POINTER) ? 'pointerout' : 'mouseout', this.pointerOutHandler); - - // Enables tooltips after scroll - mxEvent.addListener(container, 'scroll', mxUtils.bind(this, function() - { - this.showTooltips = true; - this.hideTooltip(); - })); - - this.init(); - - // Pre-fetches tooltip image - if (!mxClient.IS_SVG) - { - new Image().src = IMAGE_PATH + '/tooltip.png'; - } -}; - -/** - * Adds all palettes to the sidebar. - */ -Sidebar.prototype.init = function() -{ - var dir = STENCIL_PATH; - - this.addSearchPalette(true); - this.addGeneralPalette(true); - this.addMiscPalette(false); - this.addAdvancedPalette(false); - this.addBasicPalette(dir); - this.addStencilPalette('arrows', mxResources.get('arrows'), dir + '/arrows.xml', - ';whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#000000;strokeWidth=2'); - this.addUmlPalette(false); - this.addBpmnPalette(dir, false); - this.addStencilPalette('flowchart', 'Flowchart', dir + '/flowchart.xml', - ';whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#000000;strokeWidth=2'); - this.addImagePalette('clipart', mxResources.get('clipart'), dir + '/clipart/', '_128x128.png', - ['Earth_globe', 'Empty_Folder', 'Full_Folder', 'Gear', 'Lock', 'Software', 'Virus', 'Email', - 'Database', 'Router_Icon', 'iPad', 'iMac', 'Laptop', 'MacBook', 'Monitor_Tower', 'Printer', - 'Server_Tower', 'Workstation', 'Firewall_02', 'Wireless_Router_N', 'Credit_Card', - 'Piggy_Bank', 'Graph', 'Safe', 'Shopping_Cart', 'Suit1', 'Suit2', 'Suit3', 'Pilot1', - 'Worker1', 'Soldier1', 'Doctor1', 'Tech1', 'Security1', 'Telesales1'], null, - {'Wireless_Router_N': 'wireless router switch wap wifi access point wlan', - 'Router_Icon': 'router switch'}); -}; - -/** - * Sets the default font size. - */ -Sidebar.prototype.collapsedImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/collapsed.gif' : 'data:image/gif;base64,R0lGODlhDQANAIABAJmZmf///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozNUQyRTJFNjZGNUYxMUU1QjZEOThCNDYxMDQ2MzNCQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozNUQyRTJFNzZGNUYxMUU1QjZEOThCNDYxMDQ2MzNCQiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFERjc3MEUxNkY1RjExRTVCNkQ5OEI0NjEwNDYzM0JCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjFERjc3MEUyNkY1RjExRTVCNkQ5OEI0NjEwNDYzM0JCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAQAAAQAsAAAAAA0ADQAAAhSMj6lrwAjcC1GyahV+dcZJgeIIFgA7'; - -/** - * Sets the default font size. - */ -Sidebar.prototype.expandedImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/expanded.gif' : 'data:image/gif;base64,R0lGODlhDQANAIABAJmZmf///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxREY3NzBERjZGNUYxMUU1QjZEOThCNDYxMDQ2MzNCQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxREY3NzBFMDZGNUYxMUU1QjZEOThCNDYxMDQ2MzNCQiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFERjc3MERENkY1RjExRTVCNkQ5OEI0NjEwNDYzM0JCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjFERjc3MERFNkY1RjExRTVCNkQ5OEI0NjEwNDYzM0JCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAQAAAQAsAAAAAA0ADQAAAhGMj6nL3QAjVHIu6azbvPtWAAA7'; - -/** - * Sets the default font size. - */ -Sidebar.prototype.tooltipImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/tooltip.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAbCAMAAAB7jU7LAAAACVBMVEX///+ZmZn///9Y2COLAAAAA3RSTlP//wDXyg1BAAAAOElEQVR42mXQMQ4AMAgDsWv//+iutcJmIQSk+9dJpVKpVCqVSqVSqZTdncWzF8/NeP7FkxWenPEDOnUBiL3jWx0AAAAASUVORK5CYII='; - -/** - * - */ -Sidebar.prototype.searchImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/search.png' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAEaSURBVHjabNGxS5VxFIfxz71XaWuQUJCG/gCHhgTD9VpEETg4aMOlQRp0EoezObgcd220KQiXmpretTAHQRBdojlQEJyukPdt+b1ywfvAGc7wnHP4nlZd1yKijQW8xzNc4Su+ZOYfQ3T6/f4YNvEJYzjELXp4VVXVz263+7cR2niBxAFeZ2YPi3iHR/gYERPDwhpOsd6sz8x/mfkNG3iOlWFhFj8y89J9KvzGXER0GuEaD42mgwHqUtoljbcRsTBCeINpfM/MgZLKPpaxFxGbOCqDXmILN7hoJrTKH+axhxmcYRxP0MIDnOBDZv5q1XUNIuJxifJp+UNV7t7BFM6xeic0RMQ4Bpl5W/ol7GISx/eEUUTECrbx+f8A8xhiZht9zsgAAAAASUVORK5CYII='; - -/** - * - */ -Sidebar.prototype.dragPreviewBorder = '1px dashed black'; - -/** - * Specifies if tooltips should be visible. Default is true. - */ -Sidebar.prototype.enableTooltips = true; - -/** - * Specifies the delay for the tooltip. Default is 16 px. - */ -Sidebar.prototype.tooltipBorder = 16; - -/** - * Specifies the delay for the tooltip. Default is 300 ms. - */ -Sidebar.prototype.tooltipDelay = 300; - -/** - * Specifies the delay for the drop target icons. Default is 200 ms. - */ -Sidebar.prototype.dropTargetDelay = 200; - -/** - * Specifies the URL of the gear image. - */ -Sidebar.prototype.gearImage = STENCIL_PATH + '/clipart/Gear_128x128.png'; - -/** - * Specifies the width of the thumbnails. - */ -Sidebar.prototype.thumbWidth = 36; - -/** - * Specifies the height of the thumbnails. - */ -Sidebar.prototype.thumbHeight = 36; - -/** - * Specifies the padding for the thumbnails. Default is 3. - */ -Sidebar.prototype.thumbPadding = (document.documentMode >= 5) ? 0 : 1; - -/** - * Specifies the delay for the tooltip. Default is 2 px. - */ -Sidebar.prototype.thumbBorder = 2; - -/** - * Specifies the size of the sidebar titles. - */ -Sidebar.prototype.sidebarTitleSize = 9; - -/** - * Specifies if titles in the sidebar should be enabled. - */ -Sidebar.prototype.sidebarTitles = false; - -/** - * Specifies if titles in the tooltips should be enabled. - */ -Sidebar.prototype.tooltipTitles = true; - -/** - * Specifies if titles in the tooltips should be enabled. - */ -Sidebar.prototype.maxTooltipWidth = 400; - -/** - * Specifies if titles in the tooltips should be enabled. - */ -Sidebar.prototype.maxTooltipHeight = 400; - -/** - * Specifies if stencil files should be loaded and added to the search index - * when stencil palettes are added. If this is false then the stencil files - * are lazy-loaded when the palette is shown. - */ -Sidebar.prototype.addStencilsToIndex = true; - -/** - * Specifies the width for clipart images. Default is 80. - */ -Sidebar.prototype.defaultImageWidth = 80; - -/** - * Specifies the height for clipart images. Default is 80. - */ -Sidebar.prototype.defaultImageHeight = 80; - -/** - * Adds all palettes to the sidebar. - */ -Sidebar.prototype.getTooltipOffset = function() -{ - return new mxPoint(0, 0); -}; - -/** - * Adds all palettes to the sidebar. - */ -Sidebar.prototype.showTooltip = function(elt, cells, w, h, title, showLabel) -{ - if (this.enableTooltips && this.showTooltips) - { - if (this.currentElt != elt) - { - if (this.thread != null) - { - window.clearTimeout(this.thread); - this.thread = null; - } - - var show = mxUtils.bind(this, function() - { - // Lazy creation of the DOM nodes and graph instance - if (this.tooltip == null) - { - this.tooltip = document.createElement('div'); - this.tooltip.className = 'geSidebarTooltip'; - this.tooltip.style.zIndex = mxPopupMenu.prototype.zIndex - 1; - document.body.appendChild(this.tooltip); - - this.graph2 = new Graph(this.tooltip, null, null, this.editorUi.editor.graph.getStylesheet()); - this.graph2.resetViewOnRootChange = false; - this.graph2.foldingEnabled = false; - this.graph2.gridEnabled = false; - this.graph2.autoScroll = false; - this.graph2.setTooltips(false); - this.graph2.setConnectable(false); - this.graph2.setEnabled(false); - - if (!mxClient.IS_SVG) - { - this.graph2.view.canvas.style.position = 'relative'; - } - - this.tooltipImage = mxUtils.createImage(this.tooltipImage); - this.tooltipImage.className = 'geSidebarTooltipImage'; - this.tooltipImage.style.zIndex = mxPopupMenu.prototype.zIndex - 1; - this.tooltipImage.style.position = 'absolute'; - this.tooltipImage.style.width = '14px'; - this.tooltipImage.style.height = '27px'; - - document.body.appendChild(this.tooltipImage); - } - - this.graph2.model.clear(); - this.graph2.view.setTranslate(this.tooltipBorder, this.tooltipBorder); - - if (w > this.maxTooltipWidth || h > this.maxTooltipHeight) - { - this.graph2.view.scale = Math.round(Math.min(this.maxTooltipWidth / w, this.maxTooltipHeight / h) * 100) / 100; - } - else - { - this.graph2.view.scale = 1; - } - - this.tooltip.style.display = 'block'; - this.graph2.labelsVisible = (showLabel == null || showLabel); - var fo = mxClient.NO_FO; - mxClient.NO_FO = Editor.prototype.originalNoForeignObject; - this.graph2.addCells(cells); - mxClient.NO_FO = fo; - - var bounds = this.graph2.getGraphBounds(); - var width = bounds.width + 2 * this.tooltipBorder + 4; - var height = bounds.height + 2 * this.tooltipBorder; - - if (mxClient.IS_QUIRKS) - { - height += 4; - this.tooltip.style.overflow = 'hidden'; - } - else - { - this.tooltip.style.overflow = 'visible'; - } - - this.tooltipImage.style.visibility = 'visible'; - this.tooltip.style.width = width + 'px'; - - // Adds title for entry - if (this.tooltipTitles && title != null && title.length > 0) - { - if (this.tooltipTitle == null) - { - this.tooltipTitle = document.createElement('div'); - this.tooltipTitle.style.borderTop = '1px solid gray'; - this.tooltipTitle.style.textAlign = 'center'; - this.tooltipTitle.style.width = '100%'; - - // Oversize titles are cut-off currently. Should make tooltip wider later. - this.tooltipTitle.style.overflow = 'hidden'; - this.tooltipTitle.style.position = 'absolute'; - this.tooltipTitle.style.paddingTop = '6px'; - this.tooltipTitle.style.bottom = '6px'; - - this.tooltip.appendChild(this.tooltipTitle); - } - else - { - this.tooltipTitle.innerHTML = ''; - } - - this.tooltipTitle.style.display = ''; - mxUtils.write(this.tooltipTitle, title); - - var ddy = this.tooltipTitle.offsetHeight + 10; - height += ddy; - - if (mxClient.IS_SVG) - { - this.tooltipTitle.style.marginTop = (2 - ddy) + 'px'; - } - else - { - height -= 6; - this.tooltipTitle.style.top = (height - ddy) + 'px'; - } - } - else if (this.tooltipTitle != null && this.tooltipTitle.parentNode != null) - { - this.tooltipTitle.style.display = 'none'; - } - - this.tooltip.style.height = height + 'px'; - var x0 = -Math.round(bounds.x - this.tooltipBorder); - var y0 = -Math.round(bounds.y - this.tooltipBorder); - - var b = document.body; - var d = document.documentElement; - var off = this.getTooltipOffset(); - var bottom = Math.max(b.clientHeight || 0, d.clientHeight); - var left = this.container.clientWidth + this.editorUi.splitSize + 3 + this.editorUi.container.offsetLeft + off.x; - var top = Math.min(bottom - height - 20 /*status bar*/, Math.max(0, (this.editorUi.container.offsetTop + - this.container.offsetTop + elt.offsetTop - this.container.scrollTop - height / 2 + 16))) + off.y; - - if (mxClient.IS_SVG) - { - if (x0 != 0 || y0 != 0) - { - this.graph2.view.canvas.setAttribute('transform', 'translate(' + x0 + ',' + y0 + ')'); - } - else - { - this.graph2.view.canvas.removeAttribute('transform'); - } - } - else - { - this.graph2.view.drawPane.style.left = x0 + 'px'; - this.graph2.view.drawPane.style.top = y0 + 'px'; - } - - // Workaround for ignored position CSS style in IE9 - // (changes to relative without the following line) - this.tooltip.style.position = 'absolute'; - this.tooltip.style.left = left + 'px'; - this.tooltip.style.top = top + 'px'; - this.tooltipImage.style.left = (left - 13) + 'px'; - this.tooltipImage.style.top = (top + height / 2 - 13) + 'px'; - }); - - if (this.tooltip != null && this.tooltip.style.display != 'none') - { - show(); - } - else - { - this.thread = window.setTimeout(show, this.tooltipDelay); - } - - this.currentElt = elt; - } - } -}; - -/** - * Hides the current tooltip. - */ -Sidebar.prototype.hideTooltip = function() -{ - if (this.thread != null) - { - window.clearTimeout(this.thread); - this.thread = null; - } - - if (this.tooltip != null) - { - this.tooltip.style.display = 'none'; - this.tooltipImage.style.visibility = 'hidden'; - this.currentElt = null; - } -}; - -/** - * Hides the current tooltip. - */ -Sidebar.prototype.addDataEntry = function(tags, width, height, title, data) -{ - return this.addEntry(tags, mxUtils.bind(this, function() - { - return this.createVertexTemplateFromData(data, width, height, title); - })); -}; - -/** - * Hides the current tooltip. - */ -Sidebar.prototype.addEntry = function(tags, fn) -{ - if (this.taglist != null && tags != null && tags.length > 0) - { - // Replaces special characters - var tmp = tags.toLowerCase().replace(/[\/\,\(\)]/g, ' ').split(' '); - - var doAddEntry = mxUtils.bind(this, function(tag) - { - if (tag.length > 1) - { - var entry = this.taglist[tag]; - - if (typeof entry !== 'object') - { - entry = {entries: [], dict: new mxDictionary()}; - this.taglist[tag] = entry; - } - - // Ignores duplicates - if (entry.dict.get(fn) == null) - { - entry.dict.put(fn, fn); - entry.entries.push(fn); - } - } - }); - - for (var i = 0; i < tmp.length; i++) - { - doAddEntry(tmp[i]); - - // Adds additional entry with removed trailing numbers - var normalized = tmp[i].replace(/\.*\d*$/, ''); - - if (normalized != tmp[i]) - { - doAddEntry(normalized); - } - } - } - - return fn; -}; - -/** - * Adds shape search UI. - */ -Sidebar.prototype.searchEntries = function(searchTerms, count, page, success, error) -{ - if (this.taglist != null && searchTerms != null) - { - var tmp = searchTerms.toLowerCase().split(' '); - var dict = new mxDictionary(); - var max = (page + 1) * count; - var results = []; - var index = 0; - - for (var i = 0; i < tmp.length; i++) - { - if (tmp[i].length > 0) - { - var entry = this.taglist[tmp[i]]; - var tmpDict = new mxDictionary(); - - if (entry != null) - { - var arr = entry.entries; - results = []; - - for (var j = 0; j < arr.length; j++) - { - var entry = arr[j]; - - // NOTE Array does not contain duplicates - if ((index == 0) == (dict.get(entry) == null)) - { - tmpDict.put(entry, entry); - results.push(entry); - - if (i == tmp.length - 1 && results.length == max) - { - success(results.slice(page * count, max), max, true, tmp); - - return; - } - } - } - } - else - { - results = []; - } - - dict = tmpDict; - index++; - } - } - - var len = results.length; - success(results.slice(page * count, (page + 1) * count), len, false, tmp); - } - else - { - success([], null, null, tmp); - } -}; - -/** - * Adds shape search UI. - */ -Sidebar.prototype.filterTags = function(tags) -{ - if (tags != null) - { - var arr = tags.split(' '); - var result = []; - var hash = {}; - - // Ignores tags with leading numbers, strips trailing numbers - for (var i = 0; i < arr.length; i++) - { - // Removes duplicates - if (hash[arr[i]] == null) - { - hash[arr[i]] = '1'; - result.push(arr[i]); - } - } - - return result.join(' '); - } - - return null; -}; - -/** - * Adds the general palette to the sidebar. - */ -Sidebar.prototype.cloneCell = function(cell, value) -{ - var clone = cell.clone(); - - if (value != null) - { - clone.value = value; - } - - return clone; -}; - -/** - * Adds shape search UI. - */ -Sidebar.prototype.addSearchPalette = function(expand) -{ - var elt = document.createElement('div'); - elt.style.visibility = 'hidden'; - this.container.appendChild(elt); - - var div = document.createElement('div'); - div.className = 'geSidebar'; - div.style.boxSizing = 'border-box'; - div.style.overflow = 'hidden'; - div.style.width = '100%'; - div.style.padding = '8px'; - div.style.paddingTop = '14px'; - div.style.paddingBottom = '0px'; - - if (!expand) - { - div.style.display = 'none'; - } - - var inner = document.createElement('div'); - inner.style.whiteSpace = 'nowrap'; - inner.style.textOverflow = 'clip'; - inner.style.paddingBottom = '8px'; - inner.style.cursor = 'default'; - - var input = document.createElement('input'); - input.setAttribute('placeholder', mxResources.get('searchShapes')); - input.setAttribute('type', 'text'); - input.style.fontSize = '12px'; - input.style.overflow = 'hidden'; - input.style.boxSizing = 'border-box'; - input.style.border = 'solid 1px #d5d5d5'; - input.style.borderRadius = '4px'; - input.style.width = '100%'; - input.style.outline = 'none'; - input.style.padding = '6px'; - inner.appendChild(input); - - var cross = document.createElement('img'); - cross.setAttribute('src', Sidebar.prototype.searchImage); - cross.setAttribute('title', mxResources.get('search')); - cross.style.position = 'relative'; - cross.style.left = '-18px'; - - if (mxClient.IS_QUIRKS) - { - input.style.height = '28px'; - cross.style.top = '-4px'; - } - else - { - cross.style.top = '1px'; - } - - // Needed to block event transparency in IE - cross.style.background = 'url(\'' + this.editorUi.editor.transparentImage + '\')'; - - var find; - - inner.appendChild(cross); - div.appendChild(inner); - - var center = document.createElement('center'); - var button = mxUtils.button(mxResources.get('moreResults'), function() - { - find(); - }); - button.style.display = 'none'; - - // Workaround for inherited line-height in quirks mode - button.style.lineHeight = 'normal'; - button.style.marginTop = '4px'; - button.style.marginBottom = '8px'; - center.style.paddingTop = '4px'; - center.style.paddingBottom = '8px'; - - center.appendChild(button); - div.appendChild(center); - - var searchTerm = ''; - var active = false; - var complete = false; - var page = 0; - var hash = new Object(); - - // Count is dynamically updated below - var count = 12; - - var clearDiv = mxUtils.bind(this, function() - { - active = false; - this.currentSearch = null; - var child = div.firstChild; - - while (child != null) - { - var next = child.nextSibling; - - if (child != inner && child != center) - { - child.parentNode.removeChild(child); - } - - child = next; - } - }); - - mxEvent.addListener(cross, 'click', function() - { - if (cross.getAttribute('src') == Dialog.prototype.closeImage) - { - cross.setAttribute('src', Sidebar.prototype.searchImage); - cross.setAttribute('title', mxResources.get('search')); - button.style.display = 'none'; - input.value = ''; - searchTerm = ''; - clearDiv(); - } - - input.focus(); - }); - - find = mxUtils.bind(this, function() - { - // Shows 4 rows (minimum 4 results) - count = 4 * Math.max(1, Math.floor(this.container.clientWidth / (this.thumbWidth + 10))); - this.hideTooltip(); - - if (input.value != '') - { - if (center.parentNode != null) - { - if (searchTerm != input.value) - { - clearDiv(); - searchTerm = input.value; - hash = new Object(); - complete = false; - page = 0; - } - - if (!active && !complete) - { - button.setAttribute('disabled', 'true'); - button.style.display = ''; - button.style.cursor = 'wait'; - button.innerHTML = mxResources.get('loading') + '...'; - active = true; - - // Ignores old results - var current = new Object(); - this.currentSearch = current; - - this.searchEntries(searchTerm, count, page, mxUtils.bind(this, function(results, len, more, terms) - { - if (this.currentSearch == current) - { - results = (results != null) ? results : []; - active = false; - page++; - center.parentNode.removeChild(center); - this.insertSearchHint(div, searchTerm, count, page, results, len, more, terms); - - for (var i = 0; i < results.length; i++) - { - var elt = results[i](); - - // Avoids duplicates in results - if (hash[elt.innerHTML] == null) - { - hash[elt.innerHTML] = '1'; - div.appendChild(results[i]()); - } - } - - if (more) - { - button.removeAttribute('disabled'); - button.innerHTML = mxResources.get('moreResults'); - } - else - { - button.innerHTML = mxResources.get('reset'); - button.style.display = 'none'; - complete = true; - } - - button.style.cursor = ''; - div.appendChild(center); - } - }), mxUtils.bind(this, function() - { - // TODO: Error handling - button.style.cursor = ''; - })); - } - } - } - else - { - clearDiv(); - input.value = ''; - searchTerm = ''; - hash = new Object(); - button.style.display = 'none'; - complete = false; - input.focus(); - } - }); - - mxEvent.addListener(input, 'keydown', mxUtils.bind(this, function(evt) - { - if (evt.keyCode == 13 /* Enter */) - { - find(); - mxEvent.consume(evt); - } - })); - - mxEvent.addListener(input, 'focus', function() - { - input.style.paddingRight = ''; - }); - - mxEvent.addListener(input, 'blur', function() - { - input.style.paddingRight = '20px'; - }); - - input.style.paddingRight = '20px'; - - mxEvent.addListener(input, 'keyup', mxUtils.bind(this, function(evt) - { - if (input.value == '') - { - cross.setAttribute('src', Sidebar.prototype.searchImage); - cross.setAttribute('title', mxResources.get('search')); - } - else - { - cross.setAttribute('src', Dialog.prototype.closeImage); - cross.setAttribute('title', mxResources.get('reset')); - } - - if (input.value == '') - { - complete = true; - button.style.display = 'none'; - } - else if (input.value != searchTerm) - { - button.style.display = 'none'; - complete = false; - } - else if (!active) - { - if (complete) - { - button.style.display = 'none'; - } - else - { - button.style.display = ''; - } - } - })); - - // Workaround for blocked text selection in Editor - mxEvent.addListener(input, 'mousedown', function(evt) - { - if (evt.stopPropagation) - { - evt.stopPropagation(); - } - - evt.cancelBubble = true; - }); - - // Workaround for blocked text selection in Editor - mxEvent.addListener(input, 'selectstart', function(evt) - { - if (evt.stopPropagation) - { - evt.stopPropagation(); - } - - evt.cancelBubble = true; - }); - - var outer = document.createElement('div'); - outer.appendChild(div); - this.container.appendChild(outer); - - // Keeps references to the DOM nodes - this.palettes['search'] = [elt, outer]; -}; - -/** - * Adds the general palette to the sidebar. - */ -Sidebar.prototype.insertSearchHint = function(div, searchTerm, count, page, results, len, more, terms) -{ - if (results.length == 0 && page == 1) - { - var err = document.createElement('div'); - err.className = 'geTitle'; - err.style.cssText = 'background-color:transparent;border-color:transparent;' + - 'color:gray;padding:6px 0px 0px 0px !important;margin:4px 8px 4px 8px;' + - 'text-align:center;cursor:default !important'; - - mxUtils.write(err, mxResources.get('noResultsFor', [searchTerm])); - div.appendChild(err); - } -}; - -/** - * Adds the general palette to the sidebar. - */ -Sidebar.prototype.addGeneralPalette = function(expand) -{ - var lineTags = 'line lines connector connectors connection connections arrow arrows '; - - var fns = [ - this.createVertexTemplateEntry('rounded=0;whiteSpace=wrap;html=1;', 120, 60, '', 'Rectangle', null, null, 'rect rectangle box'), - this.createVertexTemplateEntry('rounded=1;whiteSpace=wrap;html=1;', 120, 60, '', 'Rounded Rectangle', null, null, 'rounded rect rectangle box'), - // Explicit strokecolor/fillcolor=none is a workaround to maintain transparent background regardless of current style - this.createVertexTemplateEntry('text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;', - 40, 20, 'Text', 'Text', null, null, 'text textbox textarea label'), - this.createVertexTemplateEntry('text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;', 190, 120, - '

Heading

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

', - 'Textbox', null, null, 'text textbox textarea'), - this.createVertexTemplateEntry('ellipse;whiteSpace=wrap;html=1;', 120, 80, '', 'Ellipse', null, null, 'oval ellipse state'), - this.createVertexTemplateEntry('whiteSpace=wrap;html=1;aspect=fixed;', 80, 80, '', 'Square', null, null, 'square'), - this.createVertexTemplateEntry('ellipse;whiteSpace=wrap;html=1;aspect=fixed;', 80, 80, '', 'Circle', null, null, 'circle'), - this.createVertexTemplateEntry('shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;', 120, 60, '', 'Process', null, null, 'process task'), - this.createVertexTemplateEntry('rhombus;whiteSpace=wrap;html=1;', 80, 80, '', 'Diamond', null, null, 'diamond rhombus if condition decision conditional question test'), - this.createVertexTemplateEntry('shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;', 120, 60, '', 'Parallelogram'), - this.createVertexTemplateEntry('shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;', 120, 80, '', 'Hexagon', null, null, 'hexagon preparation'), - this.createVertexTemplateEntry('triangle;whiteSpace=wrap;html=1;', 60, 80, '', 'Triangle', null, null, 'triangle logic inverter buffer'), - this.createVertexTemplateEntry('shape=cylinder;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;', 60, 80, '', 'Cylinder', null, null, 'cylinder data database'), - this.createVertexTemplateEntry('ellipse;shape=cloud;whiteSpace=wrap;html=1;', 120, 80, '', 'Cloud', null, null, 'cloud network'), - this.createVertexTemplateEntry('shape=document;whiteSpace=wrap;html=1;boundedLbl=1;', 120, 80, '', 'Document'), - this.createVertexTemplateEntry('shape=internalStorage;whiteSpace=wrap;html=1;backgroundOutline=1;', 80, 80, '', 'Internal Storage'), - this.createVertexTemplateEntry('shape=cube;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;', 120, 80, '', 'Cube'), - this.createVertexTemplateEntry('shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;', 120, 80, '', 'Step'), - this.createVertexTemplateEntry('shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;', 120, 60, '', 'Trapezoid'), - this.createVertexTemplateEntry('shape=tape;whiteSpace=wrap;html=1;', 120, 100, '', 'Tape'), - this.createVertexTemplateEntry('shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;', 80, 100, '', 'Note'), - this.createVertexTemplateEntry('shape=card;whiteSpace=wrap;html=1;', 80, 100, '', 'Card'), - this.createVertexTemplateEntry('shape=callout;whiteSpace=wrap;html=1;perimeter=calloutPerimeter;', 120, 80, '', 'Callout', null, null, 'bubble chat thought speech message'), - this.createVertexTemplateEntry('shape=umlActor;verticalLabelPosition=bottom;labelBackgroundColor=#ffffff;verticalAlign=top;html=1;outlineConnect=0;', 30, 60, 'Actor', 'Actor', false, null, 'user person human stickman'), - this.addEntry('curve', mxUtils.bind(this, function() - { - var cell = new mxCell('', new mxGeometry(0, 0, 50, 50), 'curved=1;endArrow=classic;html=1;'); - cell.geometry.setTerminalPoint(new mxPoint(0, 50), true); - cell.geometry.setTerminalPoint(new mxPoint(50, 0), false); - cell.geometry.points = [new mxPoint(50, 50), new mxPoint(0, 0)]; - cell.geometry.relative = true; - cell.edge = true; - - return this.createEdgeTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Curve'); - })), - this.createEdgeTemplateEntry('shape=flexArrow;endArrow=classic;startArrow=classic;html=1;fillColor=#ffffff;', 50, 50, '', 'Bidirectional Arrow', null, lineTags + 'bidirectional'), - this.createEdgeTemplateEntry('shape=flexArrow;endArrow=classic;html=1;fillColor=#ffffff;', 50, 50, '', 'Arrow', null, lineTags + 'directional directed'), - this.createEdgeTemplateEntry('shape=link;html=1;', 50, 50, '', 'Link', null, lineTags + 'link'), - this.createEdgeTemplateEntry('endArrow=none;dashed=1;html=1;', 50, 50, '', 'Dashed Line', null, lineTags + 'dashed undirected no'), - this.createEdgeTemplateEntry('endArrow=none;html=1;', 50, 50, '', 'Line', null, lineTags + 'simple undirected plain blank no'), - this.createEdgeTemplateEntry('endArrow=classic;startArrow=classic;html=1;', 50, 50, '', 'Bidirectional Connector', null, lineTags + 'bidirectional'), - this.createEdgeTemplateEntry('endArrow=classic;html=1;', 50, 50, '', 'Directional Connector', null, lineTags + 'directional directed') - ]; - - this.addPaletteFunctions('general', mxResources.get('general'), (expand != null) ? expand : true, fns); -}; - -/** - * Adds the general palette to the sidebar. - */ -Sidebar.prototype.addBasicPalette = function(dir) -{ - this.addStencilPalette('basic', mxResources.get('basic'), dir + '/basic.xml', - ';whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#000000;strokeWidth=2', - null, null, null, null, [ - this.createVertexTemplateEntry('shape=partialRectangle;whiteSpace=wrap;html=1;top=0;bottom=0;fillColor=none;', 120, 60, '', 'Partial Rectangle'), - this.createVertexTemplateEntry('shape=partialRectangle;whiteSpace=wrap;html=1;right=0;top=0;bottom=0;fillColor=none;routingCenterX=-0.5;', 120, 60, '', 'Partial Rectangle'), - this.createVertexTemplateEntry('shape=partialRectangle;whiteSpace=wrap;html=1;bottom=0;right=0;fillColor=none;', 120, 60, '', 'Partial Rectangle'), - this.createVertexTemplateEntry('shape=partialRectangle;whiteSpace=wrap;html=1;top=0;left=0;fillColor=none;', 120, 60, '', 'Partial Rectangle') - ]); -}; - -/** - * Adds the general palette to the sidebar. - */ -Sidebar.prototype.addMiscPalette = function(expand) -{ - var sb = this; - var lineTags = 'line lines connector connectors connection connections arrow arrows ' - - var fns = [ - this.createVertexTemplateEntry('text;strokeColor=none;fillColor=none;html=1;fontSize=24;fontStyle=1;verticalAlign=middle;align=center;', 100, 40, 'Title', 'Title', null, null, 'text heading title'), - this.createVertexTemplateEntry('text;strokeColor=none;fillColor=none;html=1;whiteSpace=wrap;verticalAlign=middle;overflow=hidden;', 100, 80, - '
  • Value 1
  • Value 2
  • Value 3
', 'Unordered List'), - this.createVertexTemplateEntry('text;strokeColor=none;fillColor=none;html=1;whiteSpace=wrap;verticalAlign=middle;overflow=hidden;', 100, 80, - '
  1. Value 1
  2. Value 2
  3. Value 3
', 'Ordered List'), - this.createVertexTemplateEntry('text;html=1;strokeColor=#c0c0c0;fillColor=#ffffff;overflow=fill;rounded=0;', 280, 160, - '' + - '' + - '' + - '' + - '' + - '
Title 1Title 2Title 3
Value 1Value 2Value 3
Value 4Value 5Value 6
Value 7Value 8Value 9
Value 10Value 11Value 12
', 'Table 1'), - this.createVertexTemplateEntry('text;html=1;strokeColor=#c0c0c0;fillColor=none;overflow=fill;', 180, 140, - '' + - '' + - '' + - '
Value 1Value 2Value 3
Value 4Value 5Value 6
Value 7Value 8Value 9
', 'Table 2'), - this.createVertexTemplateEntry('text;html=1;strokeColor=none;fillColor=none;overflow=fill;', 180, 140, - '' + - '' + - '' + - '
Value 1Value 2Value 3
Value 4Value 5Value 6
Value 7Value 8Value 9
', 'Table 3'), - this.createVertexTemplateEntry('text;html=1;strokeColor=none;fillColor=none;overflow=fill;', 160, 140, - '' + - '' + - '' + - '
Title
Section 1.1\nSection 1.2\nSection 1.3
Section 2.1\nSection 2.2\nSection 2.3
', 'Table 4'), - this.addEntry('link hyperlink', mxUtils.bind(this, function() - { - var cell = new mxCell('Link', new mxGeometry(0, 0, 60, 40), 'text;html=1;strokeColor=none;fillColor=none;whiteSpace=wrap;align=center;verticalAlign=middle;fontColor=#0000EE;fontStyle=4;'); - cell.vertex = true; - this.graph.setLinkForCell(cell, 'https://www.draw.io'); - - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Link'); - })), - this.addEntry('timestamp date time text label', mxUtils.bind(this, function() - { - var cell = new mxCell('%date{ddd mmm dd yyyy HH:MM:ss}%', new mxGeometry(0, 0, 160, 20), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;'); - cell.vertex = true; - this.graph.setAttributeForCell(cell, 'placeholders', '1'); - - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Timestamp'); - })), - this.addEntry('variable placeholder metadata hello world text label', mxUtils.bind(this, function() - { - var cell = new mxCell('%name% Text', new mxGeometry(0, 0, 80, 20), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;'); - cell.vertex = true; - this.graph.setAttributeForCell(cell, 'placeholders', '1'); - this.graph.setAttributeForCell(cell, 'name', 'Variable'); - - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Variable'); - })), - this.createVertexTemplateEntry('shape=ext;double=1;rounded=0;whiteSpace=wrap;html=1;', 120, 80, '', 'Double Rectangle', null, null, 'rect rectangle box double'), - this.createVertexTemplateEntry('shape=ext;double=1;rounded=1;whiteSpace=wrap;html=1;', 120, 80, '', 'Double Rounded Rectangle', null, null, 'rounded rect rectangle box double'), - this.createVertexTemplateEntry('ellipse;shape=doubleEllipse;whiteSpace=wrap;html=1;', 100, 60, '', 'Double Ellipse', null, null, 'oval ellipse start end state double'), - this.createVertexTemplateEntry('shape=ext;double=1;whiteSpace=wrap;html=1;aspect=fixed;', 80, 80, '', 'Double Square', null, null, 'double square'), - this.createVertexTemplateEntry('ellipse;shape=doubleEllipse;whiteSpace=wrap;html=1;aspect=fixed;', 80, 80, '', 'Double Circle', null, null, 'double circle'), - this.createEdgeTemplateEntry('rounded=0;comic=1;strokeWidth=2;endArrow=blockThin;html=1;fontFamily=Comic Sans MS;fontStyle=1;', 50, 50, '', 'Comic Arrow'), - this.createVertexTemplateEntry('html=1;whiteSpace=wrap;comic=1;strokeWidth=2;fontFamily=Comic Sans MS;fontStyle=1;', 120, 60, 'RECTANGLE', 'Comic Rectangle', true, null, 'comic rectangle rect box text retro'), - this.createVertexTemplateEntry('rhombus;html=1;align=center;whiteSpace=wrap;comic=1;strokeWidth=2;fontFamily=Comic Sans MS;fontStyle=1;', 100, 100, 'DIAMOND', 'Comic Diamond', true, null, 'comic diamond rhombus if condition decision conditional question test retro'), - this.createVertexTemplateEntry('html=1;whiteSpace=wrap;aspect=fixed;shape=isoRectangle;', 150, 90, '', 'Isometric Square', true, null, 'rectangle rect box iso isometric'), - this.createVertexTemplateEntry('html=1;whiteSpace=wrap;aspect=fixed;shape=isoCube;backgroundOutline=1;', 90, 100, '', 'Isometric Cube', true, null, 'cube box iso isometric'), - this.createEdgeTemplateEntry('edgeStyle=isometricEdgeStyle;endArrow=none;html=1;', 50, 100, '', 'Isometric Edge 1'), - this.createEdgeTemplateEntry('edgeStyle=isometricEdgeStyle;endArrow=none;html=1;elbow=vertical;', 50, 100, '', 'Isometric Edge 2'), - this.createVertexTemplateEntry('shape=curlyBracket;whiteSpace=wrap;html=1;rounded=1;', 20, 120, '', 'Curly Bracket'), - this.createVertexTemplateEntry('line;strokeWidth=2;html=1;', 160, 10, '', 'Horizontal Line'), - this.createVertexTemplateEntry('line;strokeWidth=2;direction=south;html=1;', 10, 160, '', 'Vertical Line'), - this.createVertexTemplateEntry('line;strokeWidth=4;html=1;perimeter=backbonePerimeter;points=[];outlineConnect=0;', 160, 10, '', 'Horizontal Backbone', false, null, 'backbone bus network'), - this.createVertexTemplateEntry('line;strokeWidth=4;direction=south;html=1;perimeter=backbonePerimeter;points=[];outlineConnect=0;', 10, 160, '', 'Vertical Backbone', false, null, 'backbone bus network'), - this.createVertexTemplateEntry('shape=crossbar;whiteSpace=wrap;html=1;rounded=1;', 120, 20, '', 'Crossbar', false, null, 'crossbar distance measure dimension unit'), - this.createVertexTemplateEntry('shape=image;html=1;verticalLabelPosition=bottom;labelBackgroundColor=#ffffff;verticalAlign=top;imageAspect=1;aspect=fixed;image=' + this.gearImage, 52, 61, '', 'Image (Fixed Aspect)', false, null, 'fixed image icon symbol'), - this.createVertexTemplateEntry('shape=image;html=1;verticalLabelPosition=bottom;labelBackgroundColor=#ffffff;verticalAlign=top;imageAspect=0;image=' + this.gearImage, 50, 60, '', 'Image (Variable Aspect)', false, null, 'strechted image icon symbol'), - this.createVertexTemplateEntry('icon;html=1;image=' + this.gearImage, 60, 60, 'Icon', 'Icon', false, null, 'icon image symbol'), - this.createVertexTemplateEntry('label;whiteSpace=wrap;html=1;image=' + this.gearImage, 140, 60, 'Label', 'Label 1', null, null, 'label image icon symbol'), - this.createVertexTemplateEntry('label;whiteSpace=wrap;html=1;align=center;verticalAlign=bottom;spacingLeft=0;spacingBottom=4;imageAlign=center;imageVerticalAlign=top;image=' + this.gearImage, 120, 80, 'Label', 'Label 2', null, null, 'label image icon symbol'), - this.addEntry('shape group container', function() - { - var cell = new mxCell('Label', new mxGeometry(0, 0, 160, 70), - 'html=1;whiteSpace=wrap;container=1;recursiveResize=0;collapsible=0;'); - cell.vertex = true; - - var symbol = new mxCell('', new mxGeometry(20, 20, 20, 30), 'triangle;html=1;whiteSpace=wrap;'); - symbol.vertex = true; - cell.insert(symbol); - - return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Shape Group'); - }), - this.createVertexTemplateEntry('shape=partialRectangle;whiteSpace=wrap;html=1;left=0;right=0;fillColor=none;', 120, 60, '', 'Partial Rectangle'), - this.createVertexTemplateEntry('shape=partialRectangle;whiteSpace=wrap;html=1;bottom=1;right=1;top=0;bottom=1;fillColor=none;routingCenterX=-0.5;', 120, 60, '', 'Partial Rectangle'), - this.createEdgeTemplateEntry('edgeStyle=segmentEdgeStyle;endArrow=classic;html=1;', 50, 50, '', 'Manual Line', null, lineTags + 'manual'), - this.createEdgeTemplateEntry('shape=filledEdge;rounded=0;fixDash=1;endArrow=none;strokeWidth=10;fillColor=#ffffff;edgeStyle=orthogonalEdgeStyle;', 60, 40, '', 'Filled Edge'), - this.createEdgeTemplateEntry('edgeStyle=elbowEdgeStyle;elbow=horizontal;endArrow=classic;html=1;', 50, 50, '', 'Horizontal Elbow', null, lineTags + 'elbow horizontal'), - this.createEdgeTemplateEntry('edgeStyle=elbowEdgeStyle;elbow=vertical;endArrow=classic;html=1;', 50, 50, '', 'Vertical Elbow', null, lineTags + 'elbow vertical') - ]; - - this.addPaletteFunctions('misc', mxResources.get('misc'), (expand != null) ? expand : true, fns); -}; -/** - * Adds the container palette to the sidebar. - */ -Sidebar.prototype.addAdvancedPalette = function(expand) -{ - this.addPaletteFunctions('advanced', mxResources.get('advanced'), (expand != null) ? expand : false, this.createAdvancedShapes()); -}; - -/** - * Adds the container palette to the sidebar. - */ -Sidebar.prototype.createAdvancedShapes = function() -{ - // Avoids having to bind all functions to "this" - var sb = this; - - // Reusable cells - var field = new mxCell('List Item', new mxGeometry(0, 0, 60, 26), 'text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;'); - field.vertex = true; - - return [ - this.createVertexTemplateEntry('shape=xor;whiteSpace=wrap;html=1;', 60, 80, '', 'Or', null, null, 'logic or'), - this.createVertexTemplateEntry('shape=or;whiteSpace=wrap;html=1;', 60, 80, '', 'And', null, null, 'logic and'), - this.createVertexTemplateEntry('shape=dataStorage;whiteSpace=wrap;html=1;', 100, 80, '', 'Data Storage'), - this.createVertexTemplateEntry('shape=tapeData;whiteSpace=wrap;html=1;perimeter=ellipsePerimeter;', 80, 80, '', 'Tape Data'), - this.createVertexTemplateEntry('shape=manualInput;whiteSpace=wrap;html=1;', 80, 80, '', 'Manual Input'), - this.createVertexTemplateEntry('shape=loopLimit;whiteSpace=wrap;html=1;', 100, 80, '', 'Loop Limit'), - this.createVertexTemplateEntry('shape=offPageConnector;whiteSpace=wrap;html=1;', 80, 80, '', 'Off Page Connector'), - this.createVertexTemplateEntry('shape=delay;whiteSpace=wrap;html=1;', 80, 40, '', 'Delay'), - this.createVertexTemplateEntry('shape=display;whiteSpace=wrap;html=1;', 80, 40, '', 'Display'), - this.createVertexTemplateEntry('shape=singleArrow;direction=west;whiteSpace=wrap;html=1;', 100, 60, '', 'Arrow Left'), - this.createVertexTemplateEntry('shape=singleArrow;whiteSpace=wrap;html=1;', 100, 60, '', 'Arrow Right'), - this.createVertexTemplateEntry('shape=singleArrow;direction=north;whiteSpace=wrap;html=1;', 60, 100, '', 'Arrow Up'), - this.createVertexTemplateEntry('shape=singleArrow;direction=south;whiteSpace=wrap;html=1;', 60, 100, '', 'Arrow Down'), - this.createVertexTemplateEntry('shape=doubleArrow;whiteSpace=wrap;html=1;', 100, 60, '', 'Double Arrow'), - this.createVertexTemplateEntry('shape=doubleArrow;direction=south;whiteSpace=wrap;html=1;', 60, 100, '', 'Double Arrow Vertical', null, null, 'double arrow'), - this.createVertexTemplateEntry('shape=actor;whiteSpace=wrap;html=1;', 40, 60, '', 'User', null, null, 'user person human'), - this.createVertexTemplateEntry('shape=cross;whiteSpace=wrap;html=1;', 80, 80, '', 'Cross'), - this.createVertexTemplateEntry('shape=corner;whiteSpace=wrap;html=1;', 80, 80, '', 'Corner'), - this.createVertexTemplateEntry('shape=tee;whiteSpace=wrap;html=1;', 80, 80, '', 'Tee'), - this.createVertexTemplateEntry('shape=datastore;whiteSpace=wrap;html=1;', 60, 60, '', 'Data Store', null, null, 'data store cylinder database'), - this.createVertexTemplateEntry('shape=orEllipse;perimeter=ellipsePerimeter;whiteSpace=wrap;html=1;backgroundOutline=1;', 80, 80, '', 'Or', null, null, 'or circle oval ellipse'), - this.createVertexTemplateEntry('shape=sumEllipse;perimeter=ellipsePerimeter;whiteSpace=wrap;html=1;backgroundOutline=1;', 80, 80, '', 'Sum', null, null, 'sum circle oval ellipse'), - this.createVertexTemplateEntry('shape=lineEllipse;perimeter=ellipsePerimeter;whiteSpace=wrap;html=1;backgroundOutline=1;', 80, 80, '', 'Ellipse with horizontal divider', null, null, 'circle oval ellipse'), - this.createVertexTemplateEntry('shape=lineEllipse;line=vertical;perimeter=ellipsePerimeter;whiteSpace=wrap;html=1;backgroundOutline=1;', 80, 80, '', 'Ellipse with vertical divider', null, null, 'circle oval ellipse'), - this.createVertexTemplateEntry('shape=sortShape;perimeter=rhombusPerimeter;whiteSpace=wrap;html=1;', 80, 80, '', 'Sort', null, null, 'sort'), - this.createVertexTemplateEntry('shape=collate;whiteSpace=wrap;html=1;', 80, 80, '', 'Collate', null, null, 'collate'), - this.createVertexTemplateEntry('shape=switch;whiteSpace=wrap;html=1;', 60, 60, '', 'Switch', null, null, 'switch router'), - this.addEntry('process bar', function() - { - return sb.createVertexTemplateFromData('zZXRaoMwFIafJpcDjbNrb2233rRQ8AkyPdPQaCRJV+3T7yTG2rUVBoOtgpDzn/xJzncCIdGyateKNeVW5iBI9EqipZLS9KOqXYIQhAY8J9GKUBrgT+jbRDZ02aBhCmrzEwPtDZ9MHKBXdkpmoDWKCVN9VptO+Kw+8kqwGqMkK7nIN6yTB7uTNizbD1FSSsVPsjYMC1qFKHxwIZZSSIVxLZ1/nJNar5+oQPMT7IYCrqUta1ENzuqGaeOFTArBGs3f3Vmtoo2Se7ja1h00kSoHK4bBIKUNy3hdoPYU0mF91i9mT8EEL2ocZ3gKa00ayWujLZY4IfHKFonVDLsRGgXuQ90zBmWgneyTk3yT1iArMKrDKUeem9L3ajHrbSXwohxsQd/ggOleKM7ese048J2/fwuim1uQGmhQCW8vQMkacP3GCQgBFMftHEsr7cYYe95CnmKTPMFbYD8CQ++DGQy+/M5X4ku5wHYmdIktfvk9tecpavThqS3m/0YtnqIWPTy1cD77K2wYjo+Ay317I74A', 296, 100, 'Process Bar'); - }), - this.createVertexTemplateEntry('swimlane;', 200, 200, 'Container', 'Container', null, null, 'container swimlane lane pool group'), - this.addEntry('list group erd table', function() - { - var cell = new mxCell('List', new mxGeometry(0, 0, 140, 110), - 'swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;' + - 'resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;swimlaneFillColor=#ffffff;'); - cell.vertex = true; - cell.insert(sb.cloneCell(field, 'Item 1')); - cell.insert(sb.cloneCell(field, 'Item 2')); - cell.insert(sb.cloneCell(field, 'Item 3')); - - return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'List'); - }), - this.addEntry('list item entry value group erd table', function() - { - return sb.createVertexTemplateFromCells([sb.cloneCell(field, 'List Item')], field.geometry.width, field.geometry.height, 'List Item'); - }) - ]; -}; - -/** - * Adds the general palette to the sidebar. - */ -Sidebar.prototype.addUmlPalette = function(expand) -{ - // Avoids having to bind all functions to "this" - var sb = this; - - // Reusable cells - var field = new mxCell('+ field: type', new mxGeometry(0, 0, 100, 26), 'text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;'); - field.vertex = true; - - var divider = new mxCell('', new mxGeometry(0, 0, 40, 8), 'line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;'); - divider.vertex = true; - - // Default tags - var dt = 'uml static class '; - - var fns = [ - this.createVertexTemplateEntry('html=1;', 110, 50, 'Object', 'Object', null, null, dt + 'object instance'), - this.createVertexTemplateEntry('html=1;', 110, 50, '«interface»
Name', 'Interface', null, null, dt + 'interface object instance annotated annotation'), - this.addEntry(dt + 'object instance', function() - { - var cell = new mxCell('Classname', new mxGeometry(0, 0, 160, 90), - 'swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;swimlaneFillColor=#ffffff;'); - cell.vertex = true; - cell.insert(field.clone()); - cell.insert(divider.clone()); - cell.insert(sb.cloneCell(field, '+ method(type): type')); - - return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Class'); - }), - this.addEntry(dt + 'section subsection', function() - { - var cell = new mxCell('Classname', new mxGeometry(0, 0, 140, 110), - 'swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;swimlaneFillColor=#ffffff;'); - cell.vertex = true; - cell.insert(field.clone()); - cell.insert(field.clone()); - cell.insert(field.clone()); - - return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Class 2'); - }), - this.addEntry(dt + 'item member method function variable field attribute label', function() - { - return sb.createVertexTemplateFromCells([sb.cloneCell(field, '+ item: attribute')], field.geometry.width, field.geometry.height, 'Item 1'); - }), - this.addEntry(dt + 'item member method function variable field attribute label', function() - { - var cell = new mxCell('item: attribute', new mxGeometry(0, 0, 120, field.geometry.height), 'label;fontStyle=0;strokeColor=none;fillColor=none;align=left;verticalAlign=top;overflow=hidden;' + - 'spacingLeft=28;spacingRight=4;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;imageWidth=16;imageHeight=16;image=' + sb.gearImage); - cell.vertex = true; - - return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Item 2'); - }), - this.addEntry(dt + 'divider hline line separator', function() - { - return sb.createVertexTemplateFromCells([divider.clone()], divider.geometry.width, divider.geometry.height, 'Divider'); - }), - this.addEntry(dt + 'spacer space gap separator', function() - { - var cell = new mxCell('', new mxGeometry(0, 0, 20, 14), 'text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=4;spacingRight=4;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;'); - cell.vertex = true; - - return sb.createVertexTemplateFromCells([cell.clone()], cell.geometry.width, cell.geometry.height, 'Spacer'); - }), - this.createVertexTemplateEntry('text;align=center;fontStyle=1;verticalAlign=middle;spacingLeft=3;spacingRight=3;strokeColor=none;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;', - 80, 26, 'Title', 'Title', null, null, dt + 'title label'), - this.addEntry(dt + 'component', function() - { - var cell = new mxCell('«Annotation»
Component', new mxGeometry(0, 0, 180, 90), 'html=1;'); - cell.vertex = true; - - var symbol = new mxCell('', new mxGeometry(1, 0, 20, 20), 'shape=component;jettyWidth=8;jettyHeight=4;'); - symbol.vertex = true; - symbol.geometry.relative = true; - symbol.geometry.offset = new mxPoint(-27, 7); - cell.insert(symbol); - - return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Component'); - }), - this.addEntry(dt + 'component', function() - { - var cell = new mxCell('

Component

' + - '

+ Attribute1: Type
+ Attribute2: Type

', new mxGeometry(0, 0, 180, 90), - 'align=left;overflow=fill;html=1;'); - cell.vertex = true; - - var symbol = new mxCell('', new mxGeometry(1, 0, 20, 20), 'shape=component;jettyWidth=8;jettyHeight=4;'); - symbol.vertex = true; - symbol.geometry.relative = true; - symbol.geometry.offset = new mxPoint(-24, 4); - cell.insert(symbol); - - return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Component with Attributes'); - }), - this.createVertexTemplateEntry('verticalAlign=top;align=left;spacingTop=8;spacingLeft=2;spacingRight=12;shape=cube;size=10;direction=south;fontStyle=4;html=1;', - 180, 120, 'Block', 'Block', null, null, dt + 'block'), - this.createVertexTemplateEntry('shape=component;align=left;spacingLeft=36;', 120, 60, 'Module', 'Module', null, null, dt + 'module'), - this.createVertexTemplateEntry('shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;', 70, 50, - 'package', 'Package', null, null, dt + 'package'), - this.createVertexTemplateEntry('verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;', - 160, 90, '

Object:Type


' + - '

field1 = value1
field2 = value2
field3 = value3

', 'Object', - null, null, dt + 'object instance'), - this.createVertexTemplateEntry('verticalAlign=top;align=left;overflow=fill;html=1;',180, 90, - '
Tablename
' + - '' + - '
PKuniqueId
FK1' + - 'foreignKey
fieldname
', 'Entity', null, null, 'er entity table'), - this.addEntry(dt + 'object instance', function() - { - var cell = new mxCell('

' + - 'Class

' + - '
', new mxGeometry(0, 0, 140, 60), - 'verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;'); - cell.vertex = true; - - return sb.createVertexTemplateFromCells([cell.clone()], cell.geometry.width, cell.geometry.height, 'Class 3'); - }), - this.addEntry(dt + 'object instance', function() - { - var cell = new mxCell('

' + - 'Class

' + - '

', new mxGeometry(0, 0, 140, 60), - 'verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;'); - cell.vertex = true; - - return sb.createVertexTemplateFromCells([cell.clone()], cell.geometry.width, cell.geometry.height, 'Class 4'); - }), - this.addEntry(dt + 'object instance', function() - { - var cell = new mxCell('

' + - 'Class

' + - '

+ field: Type


' + - '

+ method(): Type

', new mxGeometry(0, 0, 160, 90), - 'verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;'); - cell.vertex = true; - - return sb.createVertexTemplateFromCells([cell.clone()], cell.geometry.width, cell.geometry.height, 'Class 5'); - }), - this.addEntry(dt + 'object instance', function() - { - var cell = new mxCell('

' + - '<<Interface>>
Interface

' + - '

+ field1: Type
' + - '+ field2: Type

' + - '

' + - '+ method1(Type): Type
' + - '+ method2(Type, Type): Type

', new mxGeometry(0, 0, 190, 140), - 'verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;'); - cell.vertex = true; - - return sb.createVertexTemplateFromCells([cell.clone()], cell.geometry.width, cell.geometry.height, 'Interface 2'); - }), - this.createVertexTemplateEntry('shape=lollipop;direction=south;html=1;', 30, 10, '', 'Provided Interface', null, null, dt + 'provided interface'), - this.createVertexTemplateEntry('shape=requires;direction=north;html=1;', 30, 20, '', 'Required Interface', null, null, dt + 'required interface'), - this.createVertexTemplateEntry('shape=umlBoundary;whiteSpace=wrap;html=1;', 100, 80, 'Boundary Object', 'Boundary Object', null, null, 'uml boundary object'), - this.createVertexTemplateEntry('ellipse;shape=umlEntity;whiteSpace=wrap;html=1;', 80, 80, 'Entity Object', 'Entity Object', null, null, 'uml entity object'), - this.createVertexTemplateEntry('ellipse;shape=umlControl;whiteSpace=wrap;html=1;', 70, 80, 'Control Object', 'Control Object', null, null, 'uml control object'), - this.createVertexTemplateEntry('shape=umlActor;verticalLabelPosition=bottom;labelBackgroundColor=#ffffff;verticalAlign=top;html=1;', 30, 60, 'Actor', 'Actor', false, null, 'uml actor'), - this.createVertexTemplateEntry('ellipse;whiteSpace=wrap;html=1;', 140, 70, 'Use Case', 'Use Case', null, null, 'uml use case usecase'), - this.addEntry('uml activity state start', function() - { - var cell = new mxCell('', new mxGeometry(0, 0, 30, 30), - 'ellipse;html=1;shape=startState;fillColor=#000000;strokeColor=#ff0000;'); - cell.vertex = true; - - var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;'); - edge.geometry.setTerminalPoint(new mxPoint(15, 90), false); - edge.geometry.relative = true; - edge.edge = true; - - cell.insertEdge(edge, true); - - return sb.createVertexTemplateFromCells([cell, edge], 30, 90, 'Start'); - }), - this.addEntry('uml activity state', function() - { - var cell = new mxCell('Activity', new mxGeometry(0, 0, 120, 40), - 'rounded=1;whiteSpace=wrap;html=1;arcSize=40;fillColor=#ffffc0;strokeColor=#ff0000;'); - cell.vertex = true; - - var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;'); - edge.geometry.setTerminalPoint(new mxPoint(60, 100), false); - edge.geometry.relative = true; - edge.edge = true; - - cell.insertEdge(edge, true); - - return sb.createVertexTemplateFromCells([cell, edge], 120, 100, 'Activity'); - }), - this.addEntry('uml activity composite state', function() - { - var cell = new mxCell('Composite State', new mxGeometry(0, 0, 160, 60), - 'swimlane;html=1;fontStyle=1;align=center;verticalAlign=middle;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=0;resizeLast=1;container=0;collapsible=0;rounded=1;arcSize=30;strokeColor=#ff0000;fillColor=#ffffc0;swimlaneFillColor=#ffffc0;'); - cell.vertex = true; - - var cell1 = new mxCell('Subtitle', new mxGeometry(0, 0, 200, 26), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;'); - cell1.vertex = true; - cell.insert(cell1); - - var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;'); - edge.geometry.setTerminalPoint(new mxPoint(80, 120), false); - edge.geometry.relative = true; - edge.edge = true; - - cell.insertEdge(edge, true); - - return sb.createVertexTemplateFromCells([cell, edge], 160, 120, 'Composite State'); - }), - this.addEntry('uml activity condition', function() - { - var cell = new mxCell('Condition', new mxGeometry(0, 0, 80, 40), 'rhombus;whiteSpace=wrap;html=1;fillColor=#ffffc0;strokeColor=#ff0000;'); - cell.vertex = true; - - var edge1 = new mxCell('no', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;html=1;align=left;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;'); - edge1.geometry.setTerminalPoint(new mxPoint(180, 20), false); - edge1.geometry.relative = true; - edge1.geometry.x = -1; - edge1.edge = true; - - cell.insertEdge(edge1, true); - - var edge2 = new mxCell('yes', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;html=1;align=left;verticalAlign=top;endArrow=open;endSize=8;strokeColor=#ff0000;'); - edge2.geometry.setTerminalPoint(new mxPoint(40, 100), false); - edge2.geometry.relative = true; - edge2.geometry.x = -1; - edge2.edge = true; - - cell.insertEdge(edge2, true); - - return sb.createVertexTemplateFromCells([cell, edge1, edge2], 180, 100, 'Condition'); - }), - this.addEntry('uml activity fork join', function() - { - var cell = new mxCell('', new mxGeometry(0, 0, 200, 10), 'shape=line;html=1;strokeWidth=6;strokeColor=#ff0000;'); - cell.vertex = true; - - var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;'); - edge.geometry.setTerminalPoint(new mxPoint(100, 80), false); - edge.geometry.relative = true; - edge.edge = true; - - cell.insertEdge(edge, true); - - return sb.createVertexTemplateFromCells([cell, edge], 200, 80, 'Fork/Join'); - }), - this.createVertexTemplateEntry('ellipse;html=1;shape=endState;fillColor=#000000;strokeColor=#ff0000;', 30, 30, '', 'End', null, null, 'uml activity state end'), - this.createVertexTemplateEntry('shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;outlineConnect=0;', 100, 300, ':Object', 'Lifeline', null, null, 'uml sequence participant lifeline'), - this.createVertexTemplateEntry('shape=umlLifeline;participant=umlActor;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;verticalAlign=top;spacingTop=36;labelBackgroundColor=#ffffff;outlineConnect=0;', - 20, 300, '', 'Actor Lifeline', null, null, 'uml sequence participant lifeline actor'), - this.createVertexTemplateEntry('shape=umlLifeline;participant=umlBoundary;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;verticalAlign=top;spacingTop=36;labelBackgroundColor=#ffffff;outlineConnect=0;', - 50, 300, '', 'Boundary Lifeline', null, null, 'uml sequence participant lifeline boundary'), - this.createVertexTemplateEntry('shape=umlLifeline;participant=umlEntity;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;verticalAlign=top;spacingTop=36;labelBackgroundColor=#ffffff;outlineConnect=0;', - 40, 300, '', 'Entity Lifeline', null, null, 'uml sequence participant lifeline entity'), - this.createVertexTemplateEntry('shape=umlLifeline;participant=umlControl;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;verticalAlign=top;spacingTop=36;labelBackgroundColor=#ffffff;outlineConnect=0;', - 40, 300, '', 'Control Lifeline', null, null, 'uml sequence participant lifeline control'), - this.createVertexTemplateEntry('shape=umlFrame;whiteSpace=wrap;html=1;', 300, 200, 'frame', 'Frame', null, null, 'uml sequence frame'), - this.createVertexTemplateEntry('shape=umlDestroy;whiteSpace=wrap;html=1;strokeWidth=3;', 30, 30, '', 'Destruction', null, null, 'uml sequence destruction destroy'), - this.createVertexTemplateEntry('shape=note;whiteSpace=wrap;html=1;size=14;verticalAlign=top;align=left;spacingTop=-6;', 100, 70, 'Note', 'Note', null, null, 'uml note'), - this.addEntry('uml sequence invoke invocation call activation', function() - { - var cell = new mxCell('', new mxGeometry(0, 0, 10, 80), 'html=1;points=[];perimeter=orthogonalPerimeter;'); - cell.vertex = true; - - var edge = new mxCell('dispatch', new mxGeometry(0, 0, 0, 0), 'html=1;verticalAlign=bottom;startArrow=oval;endArrow=block;startSize=8;'); - edge.geometry.setTerminalPoint(new mxPoint(-60, 0), true); - edge.geometry.relative = true; - edge.edge = true; - - cell.insertEdge(edge, false); - - return sb.createVertexTemplateFromCells([cell, edge], 10, 80, 'Found Message'); - }), - this.addEntry('uml sequence invoke call delegation synchronous invocation activation', function() - { - var cell = new mxCell('', new mxGeometry(0, 0, 10, 80), 'html=1;points=[];perimeter=orthogonalPerimeter;'); - cell.vertex = true; - - var edge1 = new mxCell('dispatch', new mxGeometry(0, 0, 0, 0), 'html=1;verticalAlign=bottom;endArrow=block;entryX=0;entryY=0;'); - edge1.geometry.setTerminalPoint(new mxPoint(-70, 0), true); - edge1.geometry.relative = true; - edge1.edge = true; - - cell.insertEdge(edge1, false); - - var edge2 = new mxCell('return', new mxGeometry(0, 0, 0, 0), 'html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;exitX=0;exitY=0.95;'); - edge2.geometry.setTerminalPoint(new mxPoint(-70, 76), false); - edge2.geometry.relative = true; - edge2.edge = true; - - cell.insertEdge(edge2, true); - - return sb.createVertexTemplateFromCells([cell, edge1, edge2], 10, 80, 'Synchronous Invocation'); - }), - this.addEntry('uml sequence self call recursion delegation activation', function() - { - var cell = new mxCell('', new mxGeometry(0, 20, 10, 40), 'html=1;points=[];perimeter=orthogonalPerimeter;'); - cell.vertex = true; - - var edge = new mxCell('self call', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;html=1;align=left;spacingLeft=2;endArrow=block;rounded=0;entryX=1;entryY=0;'); - edge.geometry.setTerminalPoint(new mxPoint(5, 0), true); - edge.geometry.points = [new mxPoint(30, 0)]; - edge.geometry.relative = true; - edge.edge = true; - - cell.insertEdge(edge, false); - - return sb.createVertexTemplateFromCells([cell, edge], 10, 60, 'Self Call'); - }), - this.addEntry('uml sequence invoke call delegation callback activation', function() - { - // TODO: Check if more entries should be converted to compressed XML - return sb.createVertexTemplateFromData('xZRNT8MwDIZ/Ta6oaymD47rBTkiTuMAxW6wmIm0q19s6fj1OE3V0Y2iCA4dK8euP2I+riGxedUuUjX52CqzIHkU2R+conKpuDtaKNDFKZAuRpgl/In264J303qSRCDVdk5CGhJ20WwhKEFo62ChoqritxURkReNMTa2X80LkC68AmgoIkEWHpF3pamlXR7WIFwASdBeb7KXY4RIc5+KBQ/ZGkY4RYY5Egyl1zLqLmmyDXQ6Zx4n5EIf+HkB2BmAjrV3LzftPIPw4hgNn1pQ1a2tH5Cp2QK1miG7vNeu4iJe4pdeY2BtvbCQDGlAljMCQxBJotJ8rWCFYSWY3LvUdmZi68rvkkLiU6QnL1m1xAzHoBOdw61WEb88II9AW67/ydQ2wq1Cy1aAGvOrFfPh6997qDA3g+dxzv3nIL6MPU/8T+kMw8+m4QPgdfrEJNo8PSQj/+s58Ag==', - 10, 60, 'Callback'); - }), - this.createVertexTemplateEntry('html=1;points=[];perimeter=orthogonalPerimeter;', 10, 80, '', 'Activation', null, null, 'uml sequence activation'), - this.createEdgeTemplateEntry('html=1;verticalAlign=bottom;startArrow=oval;startFill=1;endArrow=block;startSize=8;', 60, 0, 'dispatch', 'Found Message 1', null, 'uml sequence message call invoke dispatch'), - this.createEdgeTemplateEntry('html=1;verticalAlign=bottom;startArrow=circle;startFill=1;endArrow=open;startSize=6;endSize=8;', 80, 0, 'dispatch', 'Found Message 2', null, 'uml sequence message call invoke dispatch'), - this.createEdgeTemplateEntry('html=1;verticalAlign=bottom;endArrow=block;', 80, 0, 'dispatch', 'Message', null, 'uml sequence message call invoke dispatch'), - this.addEntry('uml sequence return message', function() - { - var edge = new mxCell('return', new mxGeometry(0, 0, 0, 0), 'html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;'); - edge.geometry.setTerminalPoint(new mxPoint(80, 0), true); - edge.geometry.setTerminalPoint(new mxPoint(0, 0), false); - edge.geometry.relative = true; - edge.edge = true; - - return sb.createEdgeTemplateFromCells([edge], 80, 0, 'Return'); - }), - this.addEntry('uml relation', function() - { - var edge = new mxCell('name', new mxGeometry(0, 0, 0, 0), 'endArrow=block;endFill=1;html=1;edgeStyle=orthogonalEdgeStyle;align=left;verticalAlign=top;'); - edge.geometry.setTerminalPoint(new mxPoint(0, 0), true); - edge.geometry.setTerminalPoint(new mxPoint(160, 0), false); - edge.geometry.relative = true; - edge.geometry.x = -1; - edge.edge = true; - - var cell = new mxCell('1', new mxGeometry(-1, 0, 0, 0), 'resizable=0;html=1;align=left;verticalAlign=bottom;labelBackgroundColor=#ffffff;fontSize=10;'); - cell.geometry.relative = true; - cell.setConnectable(false); - cell.vertex = true; - edge.insert(cell); - - return sb.createEdgeTemplateFromCells([edge], 160, 0, 'Relation 1'); - }), - this.addEntry('uml association', function() - { - var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'endArrow=none;html=1;edgeStyle=orthogonalEdgeStyle;'); - edge.geometry.setTerminalPoint(new mxPoint(0, 0), true); - edge.geometry.setTerminalPoint(new mxPoint(160, 0), false); - edge.geometry.relative = true; - edge.edge = true; - - var cell1 = new mxCell('parent', new mxGeometry(-1, 0, 0, 0), 'resizable=0;html=1;align=left;verticalAlign=bottom;labelBackgroundColor=#ffffff;fontSize=10;'); - cell1.geometry.relative = true; - cell1.setConnectable(false); - cell1.vertex = true; - edge.insert(cell1); - - var cell2 = new mxCell('child', new mxGeometry(1, 0, 0, 0), 'resizable=0;html=1;align=right;verticalAlign=bottom;labelBackgroundColor=#ffffff;fontSize=10;'); - cell2.geometry.relative = true; - cell2.setConnectable(false); - cell2.vertex = true; - edge.insert(cell2); - - return sb.createEdgeTemplateFromCells([edge], 160, 0, 'Association 1'); - }), - this.addEntry('uml aggregation', function() - { - var edge = new mxCell('1', new mxGeometry(0, 0, 0, 0), 'endArrow=open;html=1;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;align=left;verticalAlign=bottom;'); - edge.geometry.setTerminalPoint(new mxPoint(0, 0), true); - edge.geometry.setTerminalPoint(new mxPoint(160, 0), false); - edge.geometry.relative = true; - edge.geometry.x = -1; - edge.geometry.y = 3; - edge.edge = true; - - return sb.createEdgeTemplateFromCells([edge], 160, 0, 'Aggregation 1'); - }), - this.addEntry('uml composition', function() - { - var edge = new mxCell('1', new mxGeometry(0, 0, 0, 0), 'endArrow=open;html=1;endSize=12;startArrow=diamondThin;startSize=14;startFill=1;edgeStyle=orthogonalEdgeStyle;align=left;verticalAlign=bottom;'); - edge.geometry.setTerminalPoint(new mxPoint(0, 0), true); - edge.geometry.setTerminalPoint(new mxPoint(160, 0), false); - edge.geometry.relative = true; - edge.geometry.x = -1; - edge.geometry.y = 3; - edge.edge = true; - - return sb.createEdgeTemplateFromCells([edge], 160, 0, 'Composition 1'); - }), - this.addEntry('uml relation', function() - { - var edge = new mxCell('Relation', new mxGeometry(0, 0, 0, 0), 'endArrow=open;html=1;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;'); - edge.geometry.setTerminalPoint(new mxPoint(0, 0), true); - edge.geometry.setTerminalPoint(new mxPoint(160, 0), false); - edge.geometry.relative = true; - edge.edge = true; - - var cell1 = new mxCell('0..n', new mxGeometry(-1, 0, 0, 0), 'resizable=0;html=1;align=left;verticalAlign=top;labelBackgroundColor=#ffffff;fontSize=10;'); - cell1.geometry.relative = true; - cell1.setConnectable(false); - cell1.vertex = true; - edge.insert(cell1); - - var cell2 = new mxCell('1', new mxGeometry(1, 0, 0, 0), 'resizable=0;html=1;align=right;verticalAlign=top;labelBackgroundColor=#ffffff;fontSize=10;'); - cell2.geometry.relative = true; - cell2.setConnectable(false); - cell2.vertex = true; - edge.insert(cell2); - - return sb.createEdgeTemplateFromCells([edge], 160, 0, 'Relation 2'); - }), - this.createEdgeTemplateEntry('endArrow=open;endSize=12;dashed=1;html=1;', 160, 0, 'Use', 'Dependency', null, 'uml dependency use'), - this.createEdgeTemplateEntry('endArrow=block;endSize=16;endFill=0;html=1;', 160, 0, 'Extends', 'Generalization', null, 'uml generalization extend'), - this.createEdgeTemplateEntry('endArrow=block;startArrow=block;endFill=1;startFill=1;html=1;', 160, 0, '', 'Association 2', null, 'uml association'), - this.createEdgeTemplateEntry('endArrow=open;startArrow=circlePlus;endFill=0;startFill=0;endSize=8;html=1;', 160, 0, '', 'Inner Class', null, 'inner class'), - this.createEdgeTemplateEntry('endArrow=open;startArrow=cross;endFill=0;startFill=0;endSize=8;startSize=10;html=1;', 160, 0, '', 'Terminate', null, 'terminate'), - this.createEdgeTemplateEntry('endArrow=block;dashed=1;endFill=0;endSize=12;html=1;', 160, 0, '', 'Implementation', null, 'realization implementation'), - this.createEdgeTemplateEntry('endArrow=diamondThin;endFill=0;endSize=24;html=1;', 160, 0, '', 'Aggregation 2', null, 'aggregation'), - this.createEdgeTemplateEntry('endArrow=diamondThin;endFill=1;endSize=24;html=1;', 160, 0, '', 'Composition 2', null, 'composition'), - this.createEdgeTemplateEntry('endArrow=open;endFill=1;endSize=12;html=1;', 160, 0, '', 'Association 3', null, 'association') - ]; - - this.addPaletteFunctions('uml', mxResources.get('uml'), expand || false, fns); -}; - -/** - * Adds the BPMN library to the sidebar. - */ -Sidebar.prototype.addBpmnPalette = function(dir, expand) -{ - // Avoids having to bind all functions to "this" - var sb = this; - - var fns = - [ - this.createVertexTemplateEntry('shape=ext;rounded=1;html=1;whiteSpace=wrap;', 120, 80, 'Task', 'Process', null, null, 'bpmn task process'), - this.createVertexTemplateEntry('shape=ext;rounded=1;html=1;whiteSpace=wrap;double=1;', 120, 80, 'Transaction', 'Transaction', null, null, 'bpmn transaction'), - this.createVertexTemplateEntry('shape=ext;rounded=1;html=1;whiteSpace=wrap;dashed=1;dashPattern=1 4;', 120, 80, 'Event\nSub-Process', 'Event Sub-Process', null, null, 'bpmn event subprocess sub process sub-process'), - this.createVertexTemplateEntry('shape=ext;rounded=1;html=1;whiteSpace=wrap;strokeWidth=3;', 120, 80, 'Call Activity', 'Call Activity', null, null, 'bpmn call activity'), - this.addEntry('bpmn subprocess sub process sub-process', function() - { - var cell = new mxCell('Sub-Process', new mxGeometry(0, 0, 120, 80), 'html=1;whiteSpace=wrap;rounded=1;'); - cell.vertex = true; - - var cell1 = new mxCell('', new mxGeometry(0.5, 1, 14, 14), 'html=1;shape=plus;outlineConnect=0;'); - cell1.vertex = true; - cell1.geometry.relative = true; - cell1.geometry.offset = new mxPoint(-7, -14); - cell.insert(cell1); - - return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Sub-Process'); - }), - this.addEntry(this.getTagsForStencil('mxgraph.bpmn', 'loop', 'subprocess sub process sub-process looped').join(' '), function() - { - var cell = new mxCell('Looped\nSub-Process', new mxGeometry(0, 0, 120, 80), 'html=1;whiteSpace=wrap;rounded=1'); - cell.vertex = true; - - var cell1 = new mxCell('', new mxGeometry(0.5, 1, 14, 14), 'html=1;shape=mxgraph.bpmn.loop;outlineConnect=0;'); - cell1.vertex = true; - cell1.geometry.relative = true; - cell1.geometry.offset = new mxPoint(-15, -14); - cell.insert(cell1); - - var cell2 = new mxCell('', new mxGeometry(0.5, 1, 14, 14), 'html=1;shape=plus;'); - cell2.vertex = true; - cell2.geometry.relative = true; - cell2.geometry.offset = new mxPoint(1, -14); - cell.insert(cell2); - - return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Looped Sub-Process'); - }), - this.addEntry('bpmn receive task', function() - { - var cell = new mxCell('Receive', new mxGeometry(0, 0, 120, 80), 'html=1;whiteSpace=wrap;rounded=1;'); - cell.vertex = true; - - var cell1 = new mxCell('', new mxGeometry(0, 0, 20, 14), 'html=1;shape=message;outlineConnect=0;'); - cell1.vertex = true; - cell1.geometry.relative = true; - cell1.geometry.offset = new mxPoint(7, 7); - cell.insert(cell1); - - return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Receive Task'); - }), - this.addEntry(this.getTagsForStencil('mxgraph.bpmn', 'user_task').join(' '), function() - { - var cell = new mxCell('User', new mxGeometry(0, 0, 120, 80), 'html=1;whiteSpace=wrap;rounded=1;'); - cell.vertex = true; - - var cell1 = new mxCell('', new mxGeometry(0, 0, 14, 14), 'html=1;shape=mxgraph.bpmn.user_task;outlineConnect=0;'); - cell1.vertex = true; - cell1.geometry.relative = true; - cell1.geometry.offset = new mxPoint(7, 7); - cell.insert(cell1); - - var cell2 = new mxCell('', new mxGeometry(0.5, 1, 14, 14), 'html=1;shape=plus;outlineConnect=0;'); - cell2.vertex = true; - cell2.geometry.relative = true; - cell2.geometry.offset = new mxPoint(-7, -14); - cell.insert(cell2); - - return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'User Task'); - }), - this.addEntry(this.getTagsForStencil('mxgraph.bpmn', 'timer_start', 'attached').join(' '), function() - { - var cell = new mxCell('Process', new mxGeometry(0, 0, 120, 80), 'html=1;whiteSpace=wrap;rounded=1;'); - cell.vertex = true; - - var cell1 = new mxCell('', new mxGeometry(1, 1, 30, 30), 'shape=mxgraph.bpmn.timer_start;perimeter=ellipsePerimeter;html=1;verticalLabelPosition=bottom;labelBackgroundColor=#ffffff;verticalAlign=top;outlineConnect=0;'); - cell1.vertex = true; - cell1.geometry.relative = true; - cell1.geometry.offset = new mxPoint(-40, -15); - cell.insert(cell1); - - return sb.createVertexTemplateFromCells([cell], 120, 95, 'Attached Timer Event 1'); - }), - this.addEntry(this.getTagsForStencil('mxgraph.bpmn', 'timer_start', 'attached').join(' '), function() - { - var cell = new mxCell('Process', new mxGeometry(0, 0, 120, 80), 'html=1;whiteSpace=wrap;rounded=1;'); - cell.vertex = true; - - var cell1 = new mxCell('', new mxGeometry(1, 0, 30, 30), 'shape=mxgraph.bpmn.timer_start;perimeter=ellipsePerimeter;html=1;labelPosition=right;labelBackgroundColor=#ffffff;align=left;outlineConnect=0;'); - cell1.vertex = true; - cell1.geometry.relative = true; - cell1.geometry.offset = new mxPoint(-15, 10); - cell.insert(cell1); - - return sb.createVertexTemplateFromCells([cell], 135, 80, 'Attached Timer Event 2'); - }), - this.createVertexTemplateEntry('swimlane;html=1;horizontal=0;startSize=20;', 320, 240, 'Pool', 'Pool', null, null, 'bpmn pool'), - this.createVertexTemplateEntry('swimlane;html=1;horizontal=0;swimlaneFillColor=white;swimlaneLine=0;', 300, 120, 'Lane', 'Lane', null, null, 'bpmn lane'), - this.createVertexTemplateEntry('shape=hexagon;html=1;whiteSpace=wrap;perimeter=hexagonPerimeter;rounded=0;', 60, 50, '', 'Conversation', null, null, 'bpmn conversation'), - this.createVertexTemplateEntry('shape=hexagon;html=1;whiteSpace=wrap;perimeter=hexagonPerimeter;strokeWidth=4;rounded=0;', 60, 50, '', 'Call Conversation', null, null, 'bpmn call conversation'), - this.addEntry('bpmn subconversation sub conversation sub-conversation', function() - { - var cell = new mxCell('', new mxGeometry(0, 0, 60, 50), 'shape=hexagon;whiteSpace=wrap;html=1;perimeter=hexagonPerimeter;rounded=0;'); - cell.vertex = true; - - var cell1 = new mxCell('', new mxGeometry(0.5, 1, 14, 14), 'html=1;shape=plus;'); - cell1.vertex = true; - cell1.geometry.relative = true; - cell1.geometry.offset = new mxPoint(-7, -14); - cell.insert(cell1); - - return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Sub-Conversation'); - }), - this.addEntry('bpmn data object', function() - { - var cell = new mxCell('', new mxGeometry(0, 0, 40, 60), 'shape=note;whiteSpace=wrap;size=16;html=1;'); - cell.vertex = true; - - var cell1 = new mxCell('', new mxGeometry(0, 0, 14, 14), 'html=1;shape=singleArrow;arrowWidth=0.4;arrowSize=0.4;outlineConnect=0;'); - cell1.vertex = true; - cell1.geometry.relative = true; - cell1.geometry.offset = new mxPoint(2, 2); - cell.insert(cell1); - - var cell2 = new mxCell('', new mxGeometry(0.5, 1, 14, 14), 'html=1;whiteSpace=wrap;shape=parallelMarker;outlineConnect=0;'); - cell2.vertex = true; - cell2.geometry.relative = true; - cell2.geometry.offset = new mxPoint(-7, -14); - cell.insert(cell2); - - return sb.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Data Object'); - }), - this.createVertexTemplateEntry('shape=datastore;whiteSpace=wrap;html=1;', 60, 60, '', 'Data Store', null, null, 'bpmn data store'), - this.createVertexTemplateEntry('shape=plus;html=1;outlineConnect=0;', 14, 14, '', 'Sub-Process Marker', null, null, 'bpmn subprocess sub process sub-process marker'), - this.createVertexTemplateEntry('shape=mxgraph.bpmn.loop;html=1;outlineConnect=0;', 14, 14, '', 'Loop Marker', null, null, 'bpmn loop marker'), - this.createVertexTemplateEntry('shape=parallelMarker;html=1;outlineConnect=0;', 14, 14, '', 'Parallel MI Marker', null, null, 'bpmn parallel mi marker'), - this.createVertexTemplateEntry('shape=parallelMarker;direction=south;html=1;outlineConnect=0;', 14, 14, '', 'Sequential MI Marker', null, null, 'bpmn sequential mi marker'), - this.createVertexTemplateEntry('shape=mxgraph.bpmn.ad_hoc;fillColor=#000000;html=1;outlineConnect=0;', 14, 14, '', 'Ad Hoc Marker', null, null, 'bpmn ad hoc marker'), - this.createVertexTemplateEntry('shape=mxgraph.bpmn.compensation;html=1;outlineConnect=0;', 14, 14, '', 'Compensation Marker', null, null, 'bpmn compensation marker'), - this.createVertexTemplateEntry('shape=message;whiteSpace=wrap;html=1;outlineConnect=0;fillColor=#000000;strokeColor=#ffffff;strokeWidth=2;', 40, 30, '', 'Send Task', null, null, 'bpmn send task'), - this.createVertexTemplateEntry('shape=message;whiteSpace=wrap;html=1;outlineConnect=0;', 40, 30, '', 'Receive Task', null, null, 'bpmn receive task'), - this.createVertexTemplateEntry('shape=mxgraph.bpmn.user_task;html=1;outlineConnect=0;', 14, 14, '', 'User Task', null, null, this.getTagsForStencil('mxgraph.bpmn', 'user_task').join(' ')), - this.createVertexTemplateEntry('shape=mxgraph.bpmn.manual_task;html=1;outlineConnect=0;', 14, 14, '', 'Manual Task', null, null, this.getTagsForStencil('mxgraph.bpmn', 'user_task').join(' ')), - this.createVertexTemplateEntry('shape=mxgraph.bpmn.business_rule_task;html=1;outlineConnect=0;', 14, 14, '', 'Business Rule Task', null, null, this.getTagsForStencil('mxgraph.bpmn', 'business_rule_task').join(' ')), - this.createVertexTemplateEntry('shape=mxgraph.bpmn.service_task;html=1;outlineConnect=0;', 14, 14, '', 'Service Task', null, null, this.getTagsForStencil('mxgraph.bpmn', 'service_task').join(' ')), - this.createVertexTemplateEntry('shape=mxgraph.bpmn.script_task;html=1;outlineConnect=0;', 14, 14, '', 'Script Task', null, null, this.getTagsForStencil('mxgraph.bpmn', 'script_task').join(' ')), - this.createVertexTemplateEntry('html=1;shape=mxgraph.flowchart.annotation_2;align=left;', 50, 100, '', 'Annotation', null, null, this.getTagsForStencil('bpmn', 'annotation_1', 'bpmn business process model ').join(' ')), - this.createVertexTemplateEntry('rounded=1;arcSize=10;dashed=1;strokeColor=#000000;fillColor=none;gradientColor=none;dashPattern=8 3 1 3;strokeWidth=2;', - 200, 200, '', 'Group', null, null, this.getTagsForStencil('bpmn', 'group', 'bpmn business process model ').join(' ')), - this.createEdgeTemplateEntry('endArrow=block;endFill=1;endSize=6;html=1;', 100, 0, '', 'Sequence Flow', null, 'bpmn sequence flow'), - this.createEdgeTemplateEntry('startArrow=dash;startSize=8;endArrow=block;endFill=1;endSize=6;html=1;', 100, 0, '', 'Default Flow', null, 'bpmn default flow'), - this.createEdgeTemplateEntry('startArrow=diamondThin;startFill=0;startSize=14;endArrow=block;endFill=1;endSize=6;html=1;', 100, 0, '', 'Conditional Flow', null, 'bpmn conditional flow'), - this.createEdgeTemplateEntry('startArrow=oval;startFill=0;startSize=7;endArrow=block;endFill=0;endSize=10;dashed=1;html=1;', 100, 0, '', 'Message Flow 1', null, 'bpmn message flow'), - this.addEntry('bpmn message flow', function() - { - var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'startArrow=oval;startFill=0;startSize=7;endArrow=block;endFill=0;endSize=10;dashed=1;html=1;'); - edge.geometry.setTerminalPoint(new mxPoint(0, 0), true); - edge.geometry.setTerminalPoint(new mxPoint(100, 0), false); - edge.geometry.relative = true; - edge.edge = true; - - var cell = new mxCell('', new mxGeometry(0, 0, 20, 14), 'shape=message;html=1;outlineConnect=0;'); - cell.geometry.relative = true; - cell.vertex = true; - cell.geometry.offset = new mxPoint(-10, -7); - edge.insert(cell); - - return sb.createEdgeTemplateFromCells([edge], 100, 0, 'Message Flow 2'); - }), - this.createEdgeTemplateEntry('shape=link;html=1;', 100, 0, '', 'Link', null, 'bpmn link') - ]; - - this.addPaletteFunctions('bpmn', 'BPMN ' + mxResources.get('general'), false, fns); -}; - -/** - * Creates and returns the given title element. - */ -Sidebar.prototype.createTitle = function(label) -{ - var elt = document.createElement('a'); - elt.setAttribute('href', 'javascript:void(0);'); - elt.setAttribute('title', mxResources.get('sidebarTooltip')); - elt.className = 'geTitle'; - mxUtils.write(elt, label); - - return elt; -}; - -/** - * Creates a thumbnail for the given cells. - */ -Sidebar.prototype.createThumb = function(cells, width, height, parent, title, showLabel, showTitle, realWidth, realHeight) -{ - this.graph.labelsVisible = (showLabel == null || showLabel); - var fo = mxClient.NO_FO; - mxClient.NO_FO = Editor.prototype.originalNoForeignObject; - this.graph.view.scaleAndTranslate(1, 0, 0); - this.graph.addCells(cells); - var bounds = this.graph.getGraphBounds(); - var s = Math.floor(Math.min((width - 2 * this.thumbBorder) / bounds.width, - (height - 2 * this.thumbBorder) / bounds.height) * 100) / 100; - this.graph.view.scaleAndTranslate(s, Math.floor((width - bounds.width * s) / 2 / s - bounds.x), - Math.floor((height - bounds.height * s) / 2 / s - bounds.y)); - var node = null; - - // For supporting HTML labels in IE9 standards mode the container is cloned instead - if (this.graph.dialect == mxConstants.DIALECT_SVG && !mxClient.NO_FO) - { - node = this.graph.view.getCanvas().ownerSVGElement.cloneNode(true); - } - // LATER: Check if deep clone can be used for quirks if container in DOM - else - { - node = this.graph.container.cloneNode(false); - node.innerHTML = this.graph.container.innerHTML; - - // Workaround for clipping in older IE versions - if (mxClient.IS_QUIRKS || document.documentMode == 8) - { - node.firstChild.style.overflow = 'visible'; - } - } - - this.graph.getModel().clear(); - mxClient.NO_FO = fo; - - // Catch-all event handling - if (mxClient.IS_IE6) - { - parent.style.backgroundImage = 'url(' + this.editorUi.editor.transparentImage + ')'; - } - - node.style.position = 'relative'; - node.style.overflow = 'hidden'; - node.style.cursor = 'move'; - node.style.left = this.thumbBorder + 'px'; - node.style.top = this.thumbBorder + 'px'; - node.style.width = width + 'px'; - node.style.height = height + 'px'; - node.style.visibility = ''; - node.style.minWidth = ''; - node.style.minHeight = ''; - - parent.appendChild(node); - - // Adds title for sidebar entries - if (this.sidebarTitles && title != null && showTitle != false) - { - var border = (mxClient.IS_QUIRKS) ? 2 * this.thumbPadding + 2: 0; - parent.style.height = (this.thumbHeight + border + this.sidebarTitleSize + 8) + 'px'; - - var div = document.createElement('div'); - div.style.fontSize = this.sidebarTitleSize + 'px'; - div.style.color = '#303030'; - div.style.textAlign = 'center'; - div.style.whiteSpace = 'nowrap'; - - if (mxClient.IS_IE) - { - div.style.height = (this.sidebarTitleSize + 12) + 'px'; - } - - div.style.paddingTop = '4px'; - mxUtils.write(div, title); - parent.appendChild(div); - } - - return bounds; -}; - -/** - * Creates and returns a new palette item for the given image. - */ -Sidebar.prototype.createItem = function(cells, title, showLabel, showTitle, width, height, allowCellsInserted) -{ - var elt = document.createElement('a'); - elt.setAttribute('href', 'javascript:void(0);'); - elt.className = 'geItem'; - elt.style.overflow = 'hidden'; - var border = (mxClient.IS_QUIRKS) ? 8 + 2 * this.thumbPadding : 2 * this.thumbBorder; - elt.style.width = (this.thumbWidth + border) + 'px'; - elt.style.height = (this.thumbHeight + border) + 'px'; - elt.style.padding = this.thumbPadding + 'px'; - - if (mxClient.IS_IE6) - { - elt.style.border = 'none'; - } - - // Blocks default click action - mxEvent.addListener(elt, 'click', function(evt) - { - mxEvent.consume(evt); - }); - - this.createThumb(cells, this.thumbWidth, this.thumbHeight, elt, title, showLabel, showTitle, width, height); - var bounds = new mxRectangle(0, 0, width, height); - - if (cells.length > 1 || cells[0].vertex) - { - var ds = this.createDragSource(elt, this.createDropHandler(cells, true, allowCellsInserted, - bounds), this.createDragPreview(width, height), cells, bounds); - this.addClickHandler(elt, ds, cells); - - // Uses guides for vertices only if enabled in graph - ds.isGuidesEnabled = mxUtils.bind(this, function() - { - return this.editorUi.editor.graph.graphHandler.guidesEnabled; - }); - } - else if (cells[0] != null && cells[0].edge) - { - var ds = this.createDragSource(elt, this.createDropHandler(cells, false, allowCellsInserted, - bounds), this.createDragPreview(width, height), cells, bounds); - this.addClickHandler(elt, ds, cells); - } - - // Shows a tooltip with the rendered cell - if (!mxClient.IS_IOS) - { - mxEvent.addGestureListeners(elt, null, mxUtils.bind(this, function(evt) - { - if (mxEvent.isMouseEvent(evt)) - { - this.showTooltip(elt, cells, bounds.width, bounds.height, title, showLabel); - } - })); - } - - return elt; -}; - -/** - * Creates a drop handler for inserting the given cells. - */ -Sidebar.prototype.updateShapes = function(source, targets) -{ - var graph = this.editorUi.editor.graph; - var sourceCellStyle = graph.getCellStyle(source); - var result = []; - - graph.model.beginUpdate(); - try - { - var cellStyle = graph.getModel().getStyle(source); - - // Lists the styles to carry over from the existing shape - var styles = ['shadow', 'dashed', 'dashPattern', 'fontFamily', 'fontSize', 'fontColor', 'align', 'startFill', - 'startSize', 'endFill', 'endSize', 'strokeColor', 'strokeWidth', 'fillColor', 'gradientColor', - 'html', 'part', 'noEdgeStyle', 'edgeStyle', 'elbow', 'childLayout', 'recursiveResize', - 'container', 'collapsible', 'connectable']; - - for (var i = 0; i < targets.length; i++) - { - var targetCell = targets[i]; - - if ((graph.getModel().isVertex(targetCell) == graph.getModel().isVertex(source)) || - (graph.getModel().isEdge(targetCell) == graph.getModel().isEdge(source))) - { - var state = graph.view.getState(targetCell); - var style = (state != null) ? state.style : graph.getCellStyle(targets[i]); - graph.getModel().setStyle(targetCell, cellStyle); - - // Removes all children of composite cells - if (state != null && mxUtils.getValue(state.style, 'composite', '0') == '1') - { - var childCount = graph.model.getChildCount(targetCell); - - for (var j = childCount; j >= 0; j--) - { - graph.model.remove(graph.model.getChildAt(targetCell, j)); - } - } - - if (style != null) - { - // Replaces the participant style in the lifeline shape with the target shape - if (style[mxConstants.STYLE_SHAPE] == 'umlLifeline' && - sourceCellStyle[mxConstants.STYLE_SHAPE] != 'umlLifeline') - { - graph.setCellStyles(mxConstants.STYLE_SHAPE, 'umlLifeline', [targetCell]); - graph.setCellStyles('participant', sourceCellStyle[mxConstants.STYLE_SHAPE], [targetCell]); - } - - for (var j = 0; j < styles.length; j++) - { - var value = style[styles[j]]; - - if (value != null) - { - graph.setCellStyles(styles[j], value, [targetCell]); - } - } - } - - result.push(targetCell); - } - } - } - finally - { - graph.model.endUpdate(); - } - - return result; -}; - -/** - * Creates a drop handler for inserting the given cells. - */ -Sidebar.prototype.createDropHandler = function(cells, allowSplit, allowCellsInserted, bounds) -{ - allowCellsInserted = (allowCellsInserted != null) ? allowCellsInserted : true; - - return mxUtils.bind(this, function(graph, evt, target, x, y, force) - { - var elt = (force) ? null : ((mxEvent.isTouchEvent(evt) || mxEvent.isPenEvent(evt)) ? - document.elementFromPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt)) : - mxEvent.getSource(evt)); - - while (elt != null && elt != this.container) - { - elt = elt.parentNode; - } - - if (elt == null && graph.isEnabled()) - { - cells = graph.getImportableCells(cells); - - if (cells.length > 0) - { - graph.stopEditing(); - - // Holding alt while mouse is released ignores drop target - var validDropTarget = (target != null && !mxEvent.isAltDown(evt)) ? - graph.isValidDropTarget(target, cells, evt) : false; - var select = null; - - if (target != null && !validDropTarget) - { - target = null; - } - - if (!graph.isCellLocked(target || graph.getDefaultParent())) - { - graph.model.beginUpdate(); - try - { - x = Math.round(x); - y = Math.round(y); - - // Splits the target edge or inserts into target group - if (allowSplit && graph.isSplitTarget(target, cells, evt)) - { - var clones = graph.cloneCells(cells); - graph.splitEdge(target, clones, null, - x - bounds.width / 2, y - bounds.height / 2); - select = clones; - } - else if (cells.length > 0) - { - select = graph.importCells(cells, x, y, target); - } - - // Executes parent layout hooks for position/order - if (graph.layoutManager != null) - { - var layout = graph.layoutManager.getLayout(target); - - if (layout != null) - { - var s = graph.view.scale; - var tr = graph.view.translate; - var tx = (x + tr.x) * s; - var ty = (y + tr.y) * s; - - for (var i = 0; i < select.length; i++) - { - layout.moveCell(select[i], tx, ty); - } - } - } - - if (allowCellsInserted) - { - graph.fireEvent(new mxEventObject('cellsInserted', 'cells', select)); - } - } - finally - { - graph.model.endUpdate(); - } - - if (select != null && select.length > 0) - { - graph.scrollCellToVisible(select[0]); - graph.setSelectionCells(select); - } - - if (graph.editAfterInsert && evt != null && mxEvent.isMouseEvent(evt) && - select != null && select.length == 1) - { - window.setTimeout(function() - { - graph.startEditing(select[0]); - }, 0); - } - } - } - - mxEvent.consume(evt); - } - }); -}; - -/** - * Creates and returns a preview element for the given width and height. - */ -Sidebar.prototype.createDragPreview = function(width, height) -{ - var elt = document.createElement('div'); - elt.style.border = this.dragPreviewBorder; - elt.style.width = width + 'px'; - elt.style.height = height + 'px'; - - return elt; -}; - -/** - * Creates a drag source for the given element. - */ -Sidebar.prototype.dropAndConnect = function(source, targets, direction, dropCellIndex, evt) -{ - var geo = this.getDropAndConnectGeometry(source, targets[dropCellIndex], direction, targets); - - // Targets without the new edge for selection - var tmp = []; - - if (geo != null) - { - var graph = this.editorUi.editor.graph; - var editingCell = null; - - graph.model.beginUpdate(); - try - { - var sourceGeo = graph.getCellGeometry(source); - var geo2 = graph.getCellGeometry(targets[dropCellIndex]); - - // Handles special case where target should be ignored for stack layouts - var targetParent = graph.model.getParent(source); - var validLayout = true; - - // Ignores parent if it has a stack layout - if (graph.layoutManager != null) - { - var layout = graph.layoutManager.getLayout(targetParent); - - // LATER: Use parent of parent if valid layout - if (layout != null && layout.constructor == mxStackLayout) - { - validLayout = false; - - var tmp = graph.view.getState(targetParent); - - // Offsets by parent position - if (tmp != null) - { - var offset = new mxPoint((tmp.x / graph.view.scale - graph.view.translate.x), - (tmp.y / graph.view.scale - graph.view.translate.y)); - geo.x += offset.x; - geo.y += offset.y; - var pt = geo.getTerminalPoint(false); - - if (pt != null) - { - pt.x += offset.x; - pt.y += offset.y; - } - } - } - } - - var dx = geo2.x; - var dy = geo2.y; - - // Ignores geometry of edges - if (graph.model.isEdge(targets[dropCellIndex])) - { - dx = 0; - dy = 0; - } - - var useParent = graph.model.isEdge(source) || (sourceGeo != null && !sourceGeo.relative && validLayout); - targets = graph.importCells(targets, (geo.x - (useParent ? dx : 0)), - (geo.y - (useParent ? dy : 0)), (useParent) ? targetParent : null); - tmp = targets; - - if (graph.model.isEdge(source)) - { - // Adds new terminal to edge - // LATER: Push new terminal out radially from edge start point - graph.model.setTerminal(source, targets[dropCellIndex], direction == mxConstants.DIRECTION_NORTH); - } - else if (graph.model.isEdge(targets[dropCellIndex])) - { - // Adds new outgoing connection to vertex and clears points - graph.model.setTerminal(targets[dropCellIndex], source, true); - var geo3 = graph.getCellGeometry(targets[dropCellIndex]); - geo3.points = null; - - if (geo3.getTerminalPoint(false) != null) - { - geo3.setTerminalPoint(geo.getTerminalPoint(false), false); - } - else if (useParent && graph.model.isVertex(targetParent)) - { - // Adds parent offset to other nodes - var tmpState = graph.view.getState(targetParent); - var offset = (tmpState.cell != graph.view.currentRoot) ? - new mxPoint((tmpState.x / graph.view.scale - graph.view.translate.x), - (tmpState.y / graph.view.scale - graph.view.translate.y)) : new mxPoint(0, 0); - - graph.cellsMoved(targets, offset.x, offset.y, null, null, true); - } - } - else - { - geo2 = graph.getCellGeometry(targets[dropCellIndex]); - dx = geo.x - Math.round(geo2.x); - dy = geo.y - Math.round(geo2.y); - geo.x = Math.round(geo2.x); - geo.y = Math.round(geo2.y); - graph.model.setGeometry(targets[dropCellIndex], geo); - graph.cellsMoved(targets, dx, dy, null, null, true); - tmp = targets.slice(); - editingCell = (tmp.length == 1) ? tmp[0] : null; - targets.push(graph.insertEdge(null, null, '', source, targets[dropCellIndex], - graph.createCurrentEdgeStyle())); - } - - graph.fireEvent(new mxEventObject('cellsInserted', 'cells', targets)); - } - finally - { - graph.model.endUpdate(); - } - - if (graph.editAfterInsert && evt != null && mxEvent.isMouseEvent(evt) && - editingCell != null) - { - window.setTimeout(function() - { - graph.startEditing(editingCell); - }, 0); - } - } - - return tmp; -}; - -/** - * Creates a drag source for the given element. - */ -Sidebar.prototype.getDropAndConnectGeometry = function(source, target, direction, targets) -{ - var graph = this.editorUi.editor.graph; - var view = graph.view; - var keepSize = targets.length > 1; - var geo = graph.getCellGeometry(source); - var geo2 = graph.getCellGeometry(target); - - if (geo != null && geo2 != null) - { - geo2 = geo2.clone(); - - if (graph.model.isEdge(source)) - { - var state = graph.view.getState(source); - var pts = state.absolutePoints; - var p0 = pts[0]; - var pe = pts[pts.length - 1]; - - if (direction == mxConstants.DIRECTION_NORTH) - { - geo2.x = p0.x / view.scale - view.translate.x - geo2.width / 2; - geo2.y = p0.y / view.scale - view.translate.y - geo2.height / 2; - } - else - { - geo2.x = pe.x / view.scale - view.translate.x - geo2.width / 2; - geo2.y = pe.y / view.scale - view.translate.y - geo2.height / 2; - } - } - else - { - if (geo.relative) - { - var state = graph.view.getState(source); - geo = geo.clone(); - geo.x = (state.x - view.translate.x) / view.scale; - geo.y = (state.y - view.translate.y) / view.scale; - } - - var length = graph.defaultEdgeLength; - - // Maintains edge length - if (graph.model.isEdge(target) && geo2.getTerminalPoint(true) != null && geo2.getTerminalPoint(false) != null) - { - var p0 = geo2.getTerminalPoint(true); - var pe = geo2.getTerminalPoint(false); - var dx = pe.x - p0.x; - var dy = pe.y - p0.y; - - length = Math.sqrt(dx * dx + dy * dy); - - geo2.x = geo.getCenterX(); - geo2.y = geo.getCenterY(); - geo2.width = 1; - geo2.height = 1; - - if (direction == mxConstants.DIRECTION_NORTH) - { - geo2.height = length - geo2.y = geo.y - length; - geo2.setTerminalPoint(new mxPoint(geo2.x, geo2.y), false); - } - else if (direction == mxConstants.DIRECTION_EAST) - { - geo2.width = length - geo2.x = geo.x + geo.width; - geo2.setTerminalPoint(new mxPoint(geo2.x + geo2.width, geo2.y), false); - } - else if (direction == mxConstants.DIRECTION_SOUTH) - { - geo2.height = length - geo2.y = geo.y + geo.height; - geo2.setTerminalPoint(new mxPoint(geo2.x, geo2.y + geo2.height), false); - } - else if (direction == mxConstants.DIRECTION_WEST) - { - geo2.width = length - geo2.x = geo.x - length; - geo2.setTerminalPoint(new mxPoint(geo2.x, geo2.y), false); - } - } - else - { - // Try match size or ignore if width or height < 45 which - // is considered special enough to be ignored here - if (!keepSize && geo2.width > 45 && geo2.height > 45 && - geo.width > 45 && geo.height > 45) - { - geo2.width = geo2.width * (geo.height / geo2.height); - geo2.height = geo.height; - } - - geo2.x = geo.x + geo.width / 2 - geo2.width / 2; - geo2.y = geo.y + geo.height / 2 - geo2.height / 2; - - if (direction == mxConstants.DIRECTION_NORTH) - { - geo2.y = geo2.y - geo.height / 2 - geo2.height / 2 - length; - } - else if (direction == mxConstants.DIRECTION_EAST) - { - geo2.x = geo2.x + geo.width / 2 + geo2.width / 2 + length; - } - else if (direction == mxConstants.DIRECTION_SOUTH) - { - geo2.y = geo2.y + geo.height / 2 + geo2.height / 2 + length; - } - else if (direction == mxConstants.DIRECTION_WEST) - { - geo2.x = geo2.x - geo.width / 2 - geo2.width / 2 - length; - } - - // Adds offset to match cells without connecting edge - if (graph.model.isEdge(target) && geo2.getTerminalPoint(true) != null && target.getTerminal(false) != null) - { - var targetGeo = graph.getCellGeometry(target.getTerminal(false)); - - if (targetGeo != null) - { - if (direction == mxConstants.DIRECTION_NORTH) - { - geo2.x -= targetGeo.getCenterX(); - geo2.y -= targetGeo.getCenterY() + targetGeo.height / 2; - } - else if (direction == mxConstants.DIRECTION_EAST) - { - geo2.x -= targetGeo.getCenterX() - targetGeo.width / 2; - geo2.y -= targetGeo.getCenterY(); - } - else if (direction == mxConstants.DIRECTION_SOUTH) - { - geo2.x -= targetGeo.getCenterX(); - geo2.y -= targetGeo.getCenterY() - targetGeo.height / 2; - } - else if (direction == mxConstants.DIRECTION_WEST) - { - geo2.x -= targetGeo.getCenterX() + targetGeo.width / 2; - geo2.y -= targetGeo.getCenterY(); - } - } - } - } - } - } - - return geo2; -}; - -/** - * Creates a drag source for the given element. - */ -Sidebar.prototype.createDragSource = function(elt, dropHandler, preview, cells, bounds) -{ - // Checks if the cells contain any vertices - var ui = this.editorUi; - var graph = ui.editor.graph; - var freeSourceEdge = null; - var firstVertex = null; - var sidebar = this; - - for (var i = 0; i < cells.length; i++) - { - if (firstVertex == null && this.editorUi.editor.graph.model.isVertex(cells[i])) - { - firstVertex = i; - } - else if (freeSourceEdge == null && this.editorUi.editor.graph.model.isEdge(cells[i]) && - this.editorUi.editor.graph.model.getTerminal(cells[i], true) == null) - { - freeSourceEdge = i; - } - - if (firstVertex != null && freeSourceEdge != null) - { - break; - } - } - - var dragSource = mxUtils.makeDraggable(elt, this.editorUi.editor.graph, mxUtils.bind(this, function(graph, evt, target, x, y) - { - if (this.updateThread != null) - { - window.clearTimeout(this.updateThread); - } - - if (cells != null && currentStyleTarget != null && activeArrow == styleTarget) - { - var tmp = graph.isCellSelected(currentStyleTarget.cell) ? graph.getSelectionCells() : [currentStyleTarget.cell]; - var updatedCells = this.updateShapes((graph.model.isEdge(currentStyleTarget.cell)) ? cells[0] : cells[firstVertex], tmp); - graph.setSelectionCells(updatedCells); - } - else if (cells != null && activeArrow != null && currentTargetState != null && activeArrow != styleTarget) - { - var index = (graph.model.isEdge(currentTargetState.cell) || freeSourceEdge == null) ? firstVertex : freeSourceEdge; - graph.setSelectionCells(this.dropAndConnect(currentTargetState.cell, cells, direction, index, evt)); - } - else - { - dropHandler.apply(this, arguments); - } - - if (this.editorUi.hoverIcons != null) - { - this.editorUi.hoverIcons.update(graph.view.getState(graph.getSelectionCell())); - } - }), preview, 0, 0, graph.autoscroll, true, true); - - // Stops dragging if cancel is pressed - graph.addListener(mxEvent.ESCAPE, function(sender, evt) - { - if (dragSource.isActive()) - { - dragSource.reset(); - } - }); - - // Overrides mouseDown to ignore popup triggers - var mouseDown = dragSource.mouseDown; - - dragSource.mouseDown = function(evt) - { - if (!mxEvent.isPopupTrigger(evt) && !mxEvent.isMultiTouchEvent(evt)) - { - graph.stopEditing(); - mouseDown.apply(this, arguments); - } - }; - - // Workaround for event redirection via image tag in quirks and IE8 - function createArrow(img, tooltip) - { - var arrow = null; - - if (mxClient.IS_IE && !mxClient.IS_SVG) - { - // Workaround for PNG images in IE6 - if (mxClient.IS_IE6 && document.compatMode != 'CSS1Compat') - { - arrow = document.createElement(mxClient.VML_PREFIX + ':image'); - arrow.setAttribute('src', img.src); - arrow.style.borderStyle = 'none'; - } - else - { - arrow = document.createElement('div'); - arrow.style.backgroundImage = 'url(' + img.src + ')'; - arrow.style.backgroundPosition = 'center'; - arrow.style.backgroundRepeat = 'no-repeat'; - } - - arrow.style.width = (img.width + 4) + 'px'; - arrow.style.height = (img.height + 4) + 'px'; - arrow.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; - } - else - { - arrow = mxUtils.createImage(img.src); - arrow.style.width = img.width + 'px'; - arrow.style.height = img.height + 'px'; - } - - if (tooltip != null) - { - arrow.setAttribute('title', tooltip); - } - - mxUtils.setOpacity(arrow, (img == this.refreshTarget) ? 30 : 20); - arrow.style.position = 'absolute'; - arrow.style.cursor = 'crosshair'; - - return arrow; - }; - - var currentTargetState = null; - var currentStateHandle = null; - var currentStyleTarget = null; - var activeTarget = false; - - var arrowUp = createArrow(this.triangleUp, mxResources.get('connect')); - var arrowRight = createArrow(this.triangleRight, mxResources.get('connect')); - var arrowDown = createArrow(this.triangleDown, mxResources.get('connect')); - var arrowLeft = createArrow(this.triangleLeft, mxResources.get('connect')); - var styleTarget = createArrow(this.refreshTarget, mxResources.get('replace')); - // Workaround for actual parentNode not being updated in old IE - var styleTargetParent = null; - var roundSource = createArrow(this.roundDrop); - var roundTarget = createArrow(this.roundDrop); - var direction = mxConstants.DIRECTION_NORTH; - var activeArrow = null; - - function checkArrow(x, y, bounds, arrow) - { - if (arrow.parentNode != null) - { - if (mxUtils.contains(bounds, x, y)) - { - mxUtils.setOpacity(arrow, 100); - activeArrow = arrow; - } - else - { - mxUtils.setOpacity(arrow, (arrow == styleTarget) ? 30 : 20); - } - } - - return bounds; - }; - - // Hides guides and preview if target is active - var dsCreatePreviewElement = dragSource.createPreviewElement; - - // Stores initial size of preview element - dragSource.createPreviewElement = function(graph) - { - var elt = dsCreatePreviewElement.apply(this, arguments); - - // Pass-through events required to tooltip on replace shape - if (mxClient.IS_SVG) - { - elt.style.pointerEvents = 'none'; - } - - this.previewElementWidth = elt.style.width; - this.previewElementHeight = elt.style.height; - - return elt; - }; - - // Shows/hides hover icons - var dragEnter = dragSource.dragEnter; - dragSource.dragEnter = function(graph, evt) - { - if (ui.hoverIcons != null) - { - ui.hoverIcons.setDisplay('none'); - } - - dragEnter.apply(this, arguments); - }; - - var dragExit = dragSource.dragExit; - dragSource.dragExit = function(graph, evt) - { - if (ui.hoverIcons != null) - { - ui.hoverIcons.setDisplay(''); - } - - dragExit.apply(this, arguments); - }; - - dragSource.dragOver = function(graph, evt) - { - mxDragSource.prototype.dragOver.apply(this, arguments); - - if (this.currentGuide != null && activeArrow != null) - { - this.currentGuide.hide(); - } - - if (this.previewElement != null) - { - var view = graph.view; - - if (currentStyleTarget != null && activeArrow == styleTarget) - { - this.previewElement.style.display = (graph.model.isEdge(currentStyleTarget.cell)) ? 'none' : ''; - - this.previewElement.style.left = currentStyleTarget.x + 'px'; - this.previewElement.style.top = currentStyleTarget.y + 'px'; - this.previewElement.style.width = currentStyleTarget.width + 'px'; - this.previewElement.style.height = currentStyleTarget.height + 'px'; - } - else if (currentTargetState != null && activeArrow != null) - { - var index = (graph.model.isEdge(currentTargetState.cell) || freeSourceEdge == null) ? firstVertex : freeSourceEdge; - var geo = sidebar.getDropAndConnectGeometry(currentTargetState.cell, cells[index], direction, cells); - var geo2 = (!graph.model.isEdge(currentTargetState.cell)) ? graph.getCellGeometry(currentTargetState.cell) : null; - var geo3 = graph.getCellGeometry(cells[index]); - var parent = graph.model.getParent(currentTargetState.cell); - var dx = view.translate.x * view.scale; - var dy = view.translate.y * view.scale; - - if (geo2 != null && !geo2.relative && graph.model.isVertex(parent) && parent != view.currentRoot) - { - var pState = view.getState(parent); - - dx = pState.x; - dy = pState.y; - } - - var dx2 = geo3.x; - var dy2 = geo3.y; - - // Ignores geometry of edges - if (graph.model.isEdge(cells[index])) - { - dx2 = 0; - dy2 = 0; - } - - // Shows preview at drop location - this.previewElement.style.left = ((geo.x - dx2) * view.scale + dx) + 'px'; - this.previewElement.style.top = ((geo.y - dy2) * view.scale + dy) + 'px'; - - if (cells.length == 1) - { - this.previewElement.style.width = (geo.width * view.scale) + 'px'; - this.previewElement.style.height = (geo.height * view.scale) + 'px'; - } - - this.previewElement.style.display = ''; - } - else if (dragSource.currentHighlight.state != null && - graph.model.isEdge(dragSource.currentHighlight.state.cell)) - { - // Centers drop cells when splitting edges - this.previewElement.style.left = Math.round(parseInt(this.previewElement.style.left) - - bounds.width * view.scale / 2) + 'px'; - this.previewElement.style.top = Math.round(parseInt(this.previewElement.style.top) - - bounds.height * view.scale / 2) + 'px'; - } - else - { - this.previewElement.style.width = this.previewElementWidth; - this.previewElement.style.height = this.previewElementHeight; - this.previewElement.style.display = ''; - } - } - }; - - var startTime = new Date().getTime(); - var timeOnTarget = 0; - var prev = null; - - // Gets source cell style to compare shape below - var sourceCellStyle = this.editorUi.editor.graph.getCellStyle(cells[0]); - - // Allows drop into cell only if target is a valid root - dragSource.getDropTarget = mxUtils.bind(this, function(graph, x, y, evt) - { - // Alt means no targets at all - // LATER: Show preview where result will go - var cell = (!mxEvent.isAltDown(evt) && cells != null) ? graph.getCellAt(x, y) : null; - - // Uses connectable parent vertex if one exists - if (cell != null && !this.graph.isCellConnectable(cell)) - { - var parent = this.graph.getModel().getParent(cell); - - if (this.graph.getModel().isVertex(parent) && this.graph.isCellConnectable(parent)) - { - cell = parent; - } - } - - // Ignores locked cells - if (graph.isCellLocked(cell)) - { - cell = null; - } - - var state = graph.view.getState(cell); - activeArrow = null; - var bbox = null; - - // Time on target - if (prev != state) - { - prev = state; - startTime = new Date().getTime(); - timeOnTarget = 0; - - if (this.updateThread != null) - { - window.clearTimeout(this.updateThread); - } - - if (state != null) - { - this.updateThread = window.setTimeout(function() - { - if (activeArrow == null) - { - prev = state; - dragSource.getDropTarget(graph, x, y, evt); - } - }, this.dropTargetDelay + 10); - } - } - else - { - timeOnTarget = new Date().getTime() - startTime; - } - - // Shift means disabled, delayed on cells with children, shows after this.dropTargetDelay, hides after 2500ms - if (timeOnTarget < 2500 && state != null && !mxEvent.isShiftDown(evt) && - // If shape is equal or target has no stroke, fill and gradient then use longer delay except for images - (((mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE) != mxUtils.getValue(sourceCellStyle, mxConstants.STYLE_SHAPE) && - (mxUtils.getValue(state.style, mxConstants.STYLE_STROKECOLOR, mxConstants.NONE) != mxConstants.NONE || - mxUtils.getValue(state.style, mxConstants.STYLE_FILLCOLOR, mxConstants.NONE) != mxConstants.NONE || - mxUtils.getValue(state.style, mxConstants.STYLE_GRADIENTCOLOR, mxConstants.NONE) != mxConstants.NONE)) || - mxUtils.getValue(sourceCellStyle, mxConstants.STYLE_SHAPE) == 'image') || - timeOnTarget > 1500 || graph.model.isEdge(state.cell)) && (timeOnTarget > this.dropTargetDelay) && - ((graph.model.isVertex(state.cell) && firstVertex != null) || - (graph.model.isEdge(state.cell) && graph.model.isEdge(cells[0])))) - { - currentStyleTarget = state; - var tmp = (graph.model.isEdge(state.cell)) ? graph.view.getPoint(state) : - new mxPoint(state.getCenterX(), state.getCenterY()); - tmp = new mxRectangle(tmp.x - this.refreshTarget.width / 2, tmp.y - this.refreshTarget.height / 2, - this.refreshTarget.width, this.refreshTarget.height); - - styleTarget.style.left = Math.floor(tmp.x) + 'px'; - styleTarget.style.top = Math.floor(tmp.y) + 'px'; - - if (styleTargetParent == null) - { - graph.container.appendChild(styleTarget); - styleTargetParent = styleTarget.parentNode; - } - - checkArrow(x, y, tmp, styleTarget); - } - // Does not reset on ignored edges - else if (currentStyleTarget == null || !mxUtils.contains(currentStyleTarget, x, y) || - (timeOnTarget > 1500 && !mxEvent.isShiftDown(evt))) - { - currentStyleTarget = null; - - if (styleTargetParent != null) - { - styleTarget.parentNode.removeChild(styleTarget); - styleTargetParent = null; - } - } - else if (currentStyleTarget != null && styleTargetParent != null) - { - // Sets active Arrow as side effect - var tmp = (graph.model.isEdge(currentStyleTarget.cell)) ? graph.view.getPoint(currentStyleTarget) : new mxPoint(currentStyleTarget.getCenterX(), currentStyleTarget.getCenterY()); - tmp = new mxRectangle(tmp.x - this.refreshTarget.width / 2, tmp.y - this.refreshTarget.height / 2, - this.refreshTarget.width, this.refreshTarget.height); - checkArrow(x, y, tmp, styleTarget); - } - - // Checks if inside bounds - if (activeTarget && currentTargetState != null && !mxEvent.isAltDown(evt) && activeArrow == null) - { - // LATER: Use hit-detection for edges - bbox = mxRectangle.fromRectangle(currentTargetState); - - if (graph.model.isEdge(currentTargetState.cell)) - { - var pts = currentTargetState.absolutePoints; - - if (roundSource.parentNode != null) - { - var p0 = pts[0]; - bbox.add(checkArrow(x, y, new mxRectangle(p0.x - this.roundDrop.width / 2, - p0.y - this.roundDrop.height / 2, this.roundDrop.width, this.roundDrop.height), roundSource)); - } - - if (roundTarget.parentNode != null) - { - var pe = pts[pts.length - 1]; - bbox.add(checkArrow(x, y, new mxRectangle(pe.x - this.roundDrop.width / 2, - pe.y - this.roundDrop.height / 2, - this.roundDrop.width, this.roundDrop.height), roundTarget)); - } - } - else - { - var bds = mxRectangle.fromRectangle(currentTargetState); - - // Uses outer bounding box to take rotation into account - if (currentTargetState.shape != null && currentTargetState.shape.boundingBox != null) - { - bds = mxRectangle.fromRectangle(currentTargetState.shape.boundingBox); - } - - bds.grow(this.graph.tolerance); - bds.grow(HoverIcons.prototype.arrowSpacing); - - var handler = this.graph.selectionCellsHandler.getHandler(currentTargetState.cell); - - if (handler != null) - { - bds.x -= handler.horizontalOffset / 2; - bds.y -= handler.verticalOffset / 2; - bds.width += handler.horizontalOffset; - bds.height += handler.verticalOffset; - - // Adds bounding box of rotation handle to avoid overlap - if (handler.rotationShape != null && handler.rotationShape.node != null && - handler.rotationShape.node.style.visibility != 'hidden' && - handler.rotationShape.node.style.display != 'none' && - handler.rotationShape.boundingBox != null) - { - bds.add(handler.rotationShape.boundingBox); - } - } - - bbox.add(checkArrow(x, y, new mxRectangle(currentTargetState.getCenterX() - this.triangleUp.width / 2, - bds.y - this.triangleUp.height, this.triangleUp.width, this.triangleUp.height), arrowUp)); - bbox.add(checkArrow(x, y, new mxRectangle(bds.x + bds.width, - currentTargetState.getCenterY() - this.triangleRight.height / 2, - this.triangleRight.width, this.triangleRight.height), arrowRight)); - bbox.add(checkArrow(x, y, new mxRectangle(currentTargetState.getCenterX() - this.triangleDown.width / 2, - bds.y + bds.height, this.triangleDown.width, this.triangleDown.height), arrowDown)); - bbox.add(checkArrow(x, y, new mxRectangle(bds.x - this.triangleLeft.width, - currentTargetState.getCenterY() - this.triangleLeft.height / 2, - this.triangleLeft.width, this.triangleLeft.height), arrowLeft)); - } - - // Adds tolerance - if (bbox != null) - { - bbox.grow(10); - } - } - - direction = mxConstants.DIRECTION_NORTH; - - if (activeArrow == arrowRight) - { - direction = mxConstants.DIRECTION_EAST; - } - else if (activeArrow == arrowDown || activeArrow == roundTarget) - { - direction = mxConstants.DIRECTION_SOUTH; - } - else if (activeArrow == arrowLeft) - { - direction = mxConstants.DIRECTION_WEST; - } - - if (currentStyleTarget != null && activeArrow == styleTarget) - { - state = currentStyleTarget; - } - - var validTarget = (firstVertex == null || graph.isCellConnectable(cells[firstVertex])) && - ((graph.model.isEdge(cell) && firstVertex != null) || - (graph.model.isVertex(cell) && graph.isCellConnectable(cell))); - - // Drop arrows shown after this.dropTargetDelay, hidden after 5 secs, switches arrows after 500ms - if ((currentTargetState != null && timeOnTarget >= 5000) || - (currentTargetState != state && - (bbox == null || !mxUtils.contains(bbox, x, y) || - (timeOnTarget > 500 && activeArrow == null && validTarget)))) - { - activeTarget = false; - currentTargetState = ((timeOnTarget < 5000 && timeOnTarget > this.dropTargetDelay) || graph.model.isEdge(cell)) ? state : null; - - if (currentTargetState != null && validTarget) - { - var elts = [roundSource, roundTarget, arrowUp, arrowRight, arrowDown, arrowLeft]; - - for (var i = 0; i < elts.length; i++) - { - if (elts[i].parentNode != null) - { - elts[i].parentNode.removeChild(elts[i]); - } - } - - if (graph.model.isEdge(cell)) - { - var pts = state.absolutePoints; - - if (pts != null) - { - var p0 = pts[0]; - var pe = pts[pts.length - 1]; - var tol = graph.tolerance; - var box = new mxRectangle(x - tol, y - tol, 2 * tol, 2 * tol); - - roundSource.style.left = Math.floor(p0.x - this.roundDrop.width / 2) + 'px'; - roundSource.style.top = Math.floor(p0.y - this.roundDrop.height / 2) + 'px'; - - roundTarget.style.left = Math.floor(pe.x - this.roundDrop.width / 2) + 'px'; - roundTarget.style.top = Math.floor(pe.y - this.roundDrop.height / 2) + 'px'; - - if (graph.model.getTerminal(cell, true) == null) - { - graph.container.appendChild(roundSource); - } - - if (graph.model.getTerminal(cell, false) == null) - { - graph.container.appendChild(roundTarget); - } - } - } - else - { - var bds = mxRectangle.fromRectangle(state); - - // Uses outer bounding box to take rotation into account - if (state.shape != null && state.shape.boundingBox != null) - { - bds = mxRectangle.fromRectangle(state.shape.boundingBox); - } - - bds.grow(this.graph.tolerance); - bds.grow(HoverIcons.prototype.arrowSpacing); - - var handler = this.graph.selectionCellsHandler.getHandler(state.cell); - - if (handler != null) - { - bds.x -= handler.horizontalOffset / 2; - bds.y -= handler.verticalOffset / 2; - bds.width += handler.horizontalOffset; - bds.height += handler.verticalOffset; - - // Adds bounding box of rotation handle to avoid overlap - if (handler.rotationShape != null && handler.rotationShape.node != null && - handler.rotationShape.node.style.visibility != 'hidden' && - handler.rotationShape.node.style.display != 'none' && - handler.rotationShape.boundingBox != null) - { - bds.add(handler.rotationShape.boundingBox); - } - } - - arrowUp.style.left = Math.floor(state.getCenterX() - this.triangleUp.width / 2) + 'px'; - arrowUp.style.top = Math.floor(bds.y - this.triangleUp.height) + 'px'; - - arrowRight.style.left = Math.floor(bds.x + bds.width) + 'px'; - arrowRight.style.top = Math.floor(state.getCenterY() - this.triangleRight.height / 2) + 'px'; - - arrowDown.style.left = arrowUp.style.left - arrowDown.style.top = Math.floor(bds.y + bds.height) + 'px'; - - arrowLeft.style.left = Math.floor(bds.x - this.triangleLeft.width) + 'px'; - arrowLeft.style.top = arrowRight.style.top; - - if (state.style['portConstraint'] != 'eastwest') - { - graph.container.appendChild(arrowUp); - graph.container.appendChild(arrowDown); - } - - graph.container.appendChild(arrowRight); - graph.container.appendChild(arrowLeft); - } - - // Hides handle for cell under mouse - if (state != null) - { - currentStateHandle = graph.selectionCellsHandler.getHandler(state.cell); - - if (currentStateHandle != null && currentStateHandle.setHandlesVisible != null) - { - currentStateHandle.setHandlesVisible(false); - } - } - - activeTarget = true; - } - else - { - var elts = [roundSource, roundTarget, arrowUp, arrowRight, arrowDown, arrowLeft]; - - for (var i = 0; i < elts.length; i++) - { - if (elts[i].parentNode != null) - { - elts[i].parentNode.removeChild(elts[i]); - } - } - } - } - - if (!activeTarget && currentStateHandle != null) - { - currentStateHandle.setHandlesVisible(true); - } - - // Handles drop target - var target = ((!mxEvent.isAltDown(evt) || mxEvent.isShiftDown(evt)) && - !(currentStyleTarget != null && activeArrow == styleTarget)) ? - mxDragSource.prototype.getDropTarget.apply(this, arguments) : null; - var model = graph.getModel(); - - if (target != null) - { - if (activeArrow != null || !graph.isSplitTarget(target, cells, evt)) - { - // Selects parent group as drop target - while (target != null && !graph.isValidDropTarget(target, cells, evt) && model.isVertex(model.getParent(target))) - { - target = model.getParent(target); - } - - if (graph.view.currentRoot == target || (!graph.isValidRoot(target) && - graph.getModel().getChildCount(target) == 0) || - graph.isCellLocked(target) || model.isEdge(target)) - { - target = null; - } - } - } - - return target; - }); - - dragSource.stopDrag = function() - { - mxDragSource.prototype.stopDrag.apply(this, arguments); - - var elts = [roundSource, roundTarget, styleTarget, arrowUp, arrowRight, arrowDown, arrowLeft]; - - for (var i = 0; i < elts.length; i++) - { - if (elts[i].parentNode != null) - { - elts[i].parentNode.removeChild(elts[i]); - } - } - - if (currentTargetState != null && currentStateHandle != null) - { - currentStateHandle.reset(); - } - - currentStateHandle = null; - currentTargetState = null; - currentStyleTarget = null; - styleTargetParent = null; - activeArrow = null; - }; - - return dragSource; -}; - -/** - * Adds a handler for inserting the cell with a single click. - */ -Sidebar.prototype.itemClicked = function(cells, ds, evt, elt) -{ - var graph = this.editorUi.editor.graph; - graph.container.focus(); - - // Alt+Click inserts and connects - if (mxEvent.isAltDown(evt)) - { - if (graph.getSelectionCount() == 1 && graph.model.isVertex(graph.getSelectionCell())) - { - var firstVertex = null; - - for (var i = 0; i < cells.length && firstVertex == null; i++) - { - if (graph.model.isVertex(cells[i])) - { - firstVertex = i; - } - } - - if (firstVertex != null) - { - graph.setSelectionCells(this.dropAndConnect(graph.getSelectionCell(), cells, (mxEvent.isMetaDown(evt) || mxEvent.isControlDown(evt)) ? - (mxEvent.isShiftDown(evt) ? mxConstants.DIRECTION_WEST : mxConstants.DIRECTION_NORTH) : - (mxEvent.isShiftDown(evt) ? mxConstants.DIRECTION_EAST : mxConstants.DIRECTION_SOUTH), - firstVertex, evt)); - graph.scrollCellToVisible(graph.getSelectionCell()); - } - } - } - // Shift+Click updates shape - else if (mxEvent.isShiftDown(evt) && !graph.isSelectionEmpty()) - { - this.updateShapes(cells[0], graph.getSelectionCells()); - graph.scrollCellToVisible(graph.getSelectionCell()); - } - else - { - var pt = graph.getFreeInsertPoint(); - ds.drop(graph, evt, null, pt.x, pt.y, true); - - if (this.editorUi.hoverIcons != null && (mxEvent.isTouchEvent(evt) || mxEvent.isPenEvent(evt))) - { - this.editorUi.hoverIcons.update(graph.view.getState(graph.getSelectionCell())); - } - } -}; - -/** - * Adds a handler for inserting the cell with a single click. - */ -Sidebar.prototype.addClickHandler = function(elt, ds, cells) -{ - var graph = this.editorUi.editor.graph; - var oldMouseDown = ds.mouseDown; - var oldMouseMove = ds.mouseMove; - var oldMouseUp = ds.mouseUp; - var tol = graph.tolerance; - var first = null; - var sb = this; - - ds.mouseDown =function(evt) - { - oldMouseDown.apply(this, arguments); - first = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt)); - - if (this.dragElement != null) - { - this.dragElement.style.display = 'none'; - mxUtils.setOpacity(elt, 50); - } - }; - - ds.mouseMove = function(evt) - { - if (this.dragElement != null && this.dragElement.style.display == 'none' && - first != null && (Math.abs(first.x - mxEvent.getClientX(evt)) > tol || - Math.abs(first.y - mxEvent.getClientY(evt)) > tol)) - { - this.dragElement.style.display = ''; - mxUtils.setOpacity(elt, 100); - } - - oldMouseMove.apply(this, arguments); - }; - - ds.mouseUp = function(evt) - { - if (!mxEvent.isPopupTrigger(evt) && this.currentGraph == null && - this.dragElement != null && this.dragElement.style.display == 'none') - { - sb.itemClicked(cells, ds, evt, elt); - } - - oldMouseUp.apply(ds, arguments); - mxUtils.setOpacity(elt, 100); - first = null; - - // Blocks tooltips on this element after single click - sb.currentElt = elt; - }; -}; - -/** - * Creates a drop handler for inserting the given cells. - */ -Sidebar.prototype.createVertexTemplateEntry = function(style, width, height, value, title, showLabel, showTitle, tags) -{ - tags = (tags != null && tags.length > 0) ? tags : title.toLowerCase(); - - return this.addEntry(tags, mxUtils.bind(this, function() - { - return this.createVertexTemplate(style, width, height, value, title, showLabel, showTitle); - })); -} - -/** - * Creates a drop handler for inserting the given cells. - */ -Sidebar.prototype.createVertexTemplate = function(style, width, height, value, title, showLabel, showTitle, allowCellsInserted) -{ - var cells = [new mxCell((value != null) ? value : '', new mxGeometry(0, 0, width, height), style)]; - cells[0].vertex = true; - - return this.createVertexTemplateFromCells(cells, width, height, title, showLabel, showTitle, allowCellsInserted); -}; - -/** - * Creates a drop handler for inserting the given cells. - */ -Sidebar.prototype.createVertexTemplateFromData = function(data, width, height, title, showLabel, showTitle, allowCellsInserted) -{ - var doc = mxUtils.parseXml(this.graph.decompress(data)); - var codec = new mxCodec(doc); - - var model = new mxGraphModel(); - codec.decode(doc.documentElement, model); - - var cells = this.graph.cloneCells(model.root.getChildAt(0).children); - - return this.createVertexTemplateFromCells(cells, width, height, title, showLabel, showTitle, allowCellsInserted); -}; - -/** - * Creates a drop handler for inserting the given cells. - */ -Sidebar.prototype.createVertexTemplateFromCells = function(cells, width, height, title, showLabel, showTitle, allowCellsInserted) -{ - // Use this line to convert calls to this function with lots of boilerplate code for creating cells - //console.trace('xml', this.graph.compress(mxUtils.getXml(this.graph.encodeCells(cells))), cells); - return this.createItem(cells, title, showLabel, showTitle, width, height, allowCellsInserted); -}; - -/** - * - */ -Sidebar.prototype.createEdgeTemplateEntry = function(style, width, height, value, title, showLabel, tags, allowCellsInserted) -{ - tags = (tags != null && tags.length > 0) ? tags : title.toLowerCase(); - - return this.addEntry(tags, mxUtils.bind(this, function() - { - return this.createEdgeTemplate(style, width, height, value, title, showLabel, allowCellsInserted); - })); -}; - -/** - * Creates a drop handler for inserting the given cells. - */ -Sidebar.prototype.createEdgeTemplate = function(style, width, height, value, title, showLabel, allowCellsInserted) -{ - var cell = new mxCell((value != null) ? value : '', new mxGeometry(0, 0, width, height), style); - cell.geometry.setTerminalPoint(new mxPoint(0, height), true); - cell.geometry.setTerminalPoint(new mxPoint(width, 0), false); - cell.geometry.relative = true; - cell.edge = true; - - return this.createEdgeTemplateFromCells([cell], width, height, title, showLabel, allowCellsInserted); -}; - -/** - * Creates a drop handler for inserting the given cells. - */ -Sidebar.prototype.createEdgeTemplateFromCells = function(cells, width, height, title, showLabel, allowCellsInserted) -{ - return this.createItem(cells, title, showLabel, true, width, height, allowCellsInserted); -}; - -/** - * Adds the given palette. - */ -Sidebar.prototype.addPaletteFunctions = function(id, title, expanded, fns) -{ - this.addPalette(id, title, expanded, mxUtils.bind(this, function(content) - { - for (var i = 0; i < fns.length; i++) - { - content.appendChild(fns[i](content)); - } - })); -}; - -/** - * Adds the given palette. - */ -Sidebar.prototype.addPalette = function(id, title, expanded, onInit) -{ - var elt = this.createTitle(title); - this.container.appendChild(elt); - - var div = document.createElement('div'); - div.className = 'geSidebar'; - - // Disables built-in pan and zoom in IE10 and later - if (mxClient.IS_POINTER) - { - div.style.touchAction = 'none'; - } - - if (expanded) - { - onInit(div); - onInit = null; - } - else - { - div.style.display = 'none'; - } - - this.addFoldingHandler(elt, div, onInit); - - var outer = document.createElement('div'); - outer.appendChild(div); - this.container.appendChild(outer); - - // Keeps references to the DOM nodes - if (id != null) - { - this.palettes[id] = [elt, outer]; - } - - return div; -}; - -/** - * Create the given title element. - */ -Sidebar.prototype.addFoldingHandler = function(title, content, funct) -{ - var initialized = false; - - // Avoids mixed content warning in IE6-8 - if (!mxClient.IS_IE || document.documentMode >= 8) - { - title.style.backgroundImage = (content.style.display == 'none') ? - 'url(\'' + this.collapsedImage + '\')' : 'url(\'' + this.expandedImage + '\')'; - } - - title.style.backgroundRepeat = 'no-repeat'; - title.style.backgroundPosition = '0% 50%'; - - mxEvent.addListener(title, 'click', mxUtils.bind(this, function(evt) - { - if (content.style.display == 'none') - { - if (!initialized) - { - initialized = true; - - if (funct != null) - { - // Wait cursor does not show up on Mac - title.style.cursor = 'wait'; - var prev = title.innerHTML; - title.innerHTML = mxResources.get('loading') + '...'; - - window.setTimeout(function() - { - var fo = mxClient.NO_FO; - mxClient.NO_FO = Editor.prototype.originalNoForeignObject; - funct(content); - mxClient.NO_FO = fo; - content.style.display = 'block'; - title.style.cursor = ''; - title.innerHTML = prev; - }, 0); - } - else - { - content.style.display = 'block'; - } - } - else - { - content.style.display = 'block'; - } - - title.style.backgroundImage = 'url(\'' + this.expandedImage + '\')'; - } - else - { - title.style.backgroundImage = 'url(\'' + this.collapsedImage + '\')'; - content.style.display = 'none'; - } - - mxEvent.consume(evt); - })); -}; - -/** - * Removes the palette for the given ID. - */ -Sidebar.prototype.removePalette = function(id) -{ - var elts = this.palettes[id]; - - if (elts != null) - { - this.palettes[id] = null; - - for (var i = 0; i < elts.length; i++) - { - this.container.removeChild(elts[i]); - } - - return true; - } - - return false; -}; - -/** - * Adds the given image palette. - */ -Sidebar.prototype.addImagePalette = function(id, title, prefix, postfix, items, titles, tags) -{ - var showTitles = titles != null; - var fns = []; - - for (var i = 0; i < items.length; i++) - { - (mxUtils.bind(this, function(item, title, tmpTags) - { - if (tmpTags == null) - { - var slash = item.lastIndexOf('/'); - var dot = item.lastIndexOf('.'); - tmpTags = item.substring((slash >= 0) ? slash + 1 : 0, (dot >= 0) ? dot : item.length).replace(/[-_]/g, ' '); - } - - fns.push(this.createVertexTemplateEntry('image;html=1;labelBackgroundColor=#ffffff;image=' + prefix + item + postfix, - this.defaultImageWidth, this.defaultImageHeight, '', title, title != null, null, this.filterTags(tmpTags))); - }))(items[i], (titles != null) ? titles[i] : null, (tags != null) ? tags[items[i]] : null); - } - - this.addPaletteFunctions(id, title, false, fns); -}; - -/** - * Creates the array of tags for the given stencil. Duplicates are allowed and will be filtered out later. - */ -Sidebar.prototype.getTagsForStencil = function(packageName, stencilName, moreTags) -{ - var tags = packageName.split('.'); - - for (var i = 1; i < tags.length; i++) - { - tags[i] = tags[i].replace(/_/g, ' ') - } - - tags.push(stencilName.replace(/_/g, ' ')); - - if (moreTags != null) - { - tags.push(moreTags); - } - - return tags.slice(1, tags.length); -}; - -/** - * Adds the given stencil palette. - */ -Sidebar.prototype.addStencilPalette = function(id, title, stencilFile, style, ignore, onInit, scale, tags, customFns) -{ - scale = (scale != null) ? scale : 1; - - if (this.addStencilsToIndex) - { - // LATER: Handle asynchronous loading dependency - var fns = []; - - if (customFns != null) - { - for (var i = 0; i < customFns.length; i++) - { - fns.push(customFns[i]); - } - } - - mxStencilRegistry.loadStencilSet(stencilFile, mxUtils.bind(this, function(packageName, stencilName, displayName, w, h) - { - if (ignore == null || mxUtils.indexOf(ignore, stencilName) < 0) - { - var tmp = this.getTagsForStencil(packageName, stencilName); - var tmpTags = (tags != null) ? tags[stencilName] : null; - - if (tmpTags != null) - { - tmp.push(tmpTags); - } - - fns.push(this.createVertexTemplateEntry('shape=' + packageName + stencilName.toLowerCase() + style, - Math.round(w * scale), Math.round(h * scale), '', stencilName.replace(/_/g, ' '), null, null, - this.filterTags(tmp.join(' ')))); - } - }), true, true); - - this.addPaletteFunctions(id, title, false, fns); - } - else - { - this.addPalette(id, title, false, mxUtils.bind(this, function(content) - { - if (style == null) - { - style = ''; - } - - if (onInit != null) - { - onInit.call(this, content); - } - - if (customFns != null) - { - for (var i = 0; i < customFns.length; i++) - { - customFns[i](content); - } - } - - mxStencilRegistry.loadStencilSet(stencilFile, mxUtils.bind(this, function(packageName, stencilName, displayName, w, h) - { - if (ignore == null || mxUtils.indexOf(ignore, stencilName) < 0) - { - content.appendChild(this.createVertexTemplate('shape=' + packageName + stencilName.toLowerCase() + style, - Math.round(w * scale), Math.round(h * scale), '', stencilName.replace(/_/g, ' '), true)); - } - }), true); - })); - } -}; - -/** - * Adds the given stencil palette. - */ -Sidebar.prototype.destroy = function() -{ - if (this.graph != null) - { - if (this.graph.container != null && this.graph.container.parentNode != null) - { - this.graph.container.parentNode.removeChild(this.graph.container); - } - - this.graph.destroy(); - this.graph = null; - } - - if (this.pointerUpHandler != null) - { - mxEvent.removeListener(document, (mxClient.IS_POINTER) ? 'pointerup' : 'mouseup', this.pointerUpHandler); - this.pointerUpHandler = null; - } - - if (this.pointerDownHandler != null) - { - mxEvent.removeListener(document, (mxClient.IS_POINTER) ? 'pointerdown' : 'mousedown', this.pointerDownHandler); - this.pointerDownHandler = null; - } - - if (this.pointerMoveHandler != null) - { - mxEvent.removeListener(document, (mxClient.IS_POINTER) ? 'pointermove' : 'mousemove', this.pointerMoveHandler); - this.pointerMoveHandler = null; - } - - if (this.pointerOutHandler != null) - { - mxEvent.removeListener(document, (mxClient.IS_POINTER) ? 'pointerout' : 'mouseout', this.pointerOutHandler); - this.pointerOutHandler = null; - } -}; diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Toolbar.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Toolbar.js deleted file mode 100644 index 273b2a82..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/js/Toolbar.js +++ /dev/null @@ -1,954 +0,0 @@ -/** - * Copyright (c) 2006-2012, JGraph Ltd - */ -/** - * Construcs a new toolbar for the given editor. - */ -function Toolbar(editorUi, container) -{ - this.editorUi = editorUi; - this.container = container; - this.staticElements = []; - this.init(); - - // Global handler to hide the current menu - this.gestureHandler = mxUtils.bind(this, function(evt) - { - if (this.editorUi.currentMenu != null && mxEvent.getSource(evt) != this.editorUi.currentMenu.div) - { - this.hideMenu(); - } - }); - - mxEvent.addGestureListeners(document, this.gestureHandler); -}; - -/** - * Image for the dropdown arrow. - */ -Toolbar.prototype.dropdownImage = (!mxClient.IS_SVG) ? IMAGE_PATH + '/dropdown.gif' : 'data:image/gif;base64,R0lGODlhDQANAIABAHt7e////yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCREM1NkJFMjE0NEMxMUU1ODk1Q0M5MjQ0MTA4QjNDMSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCREM1NkJFMzE0NEMxMUU1ODk1Q0M5MjQ0MTA4QjNDMSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQzOUMzMjZCMTQ0QjExRTU4OTVDQzkyNDQxMDhCM0MxIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQzOUMzMjZDMTQ0QjExRTU4OTVDQzkyNDQxMDhCM0MxIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAQAAAQAsAAAAAA0ADQAAAhGMj6nL3QAjVHIu6azbvPtWAAA7'; - -/** - * Image element for the dropdown arrow. - */ -Toolbar.prototype.dropdownImageHtml = ''; - -/** - * Defines the background for selected buttons. - */ -Toolbar.prototype.selectedBackground = '#d0d0d0'; - -/** - * Defines the background for selected buttons. - */ -Toolbar.prototype.unselectedBackground = 'none'; - -/** - * Array that contains the DOM nodes that should never be removed. - */ -Toolbar.prototype.staticElements = null; - -/** - * Adds the toolbar elements. - */ -Toolbar.prototype.init = function() -{ - var sw = screen.width; - - // Takes into account initial compact mode - sw -= (screen.height > 740) ? 56 : 0; - - if (sw >= 700) - { - var formatMenu = this.addMenu('', mxResources.get('view') + ' (' + mxResources.get('panTooltip') + ')', true, 'viewPanels', null, true); - this.addDropDownArrow(formatMenu, 'geSprite-formatpanel', 38, 50, -4, -3, 36, -8); - this.addSeparator(); - } - - var viewMenu = this.addMenu('', mxResources.get('zoom') + ' (Alt+Mousewheel)', true, 'viewZoom', null, true); - viewMenu.showDisabled = true; - viewMenu.style.whiteSpace = 'nowrap'; - viewMenu.style.position = 'relative'; - viewMenu.style.overflow = 'hidden'; - - if (EditorUi.compactUi) - { - viewMenu.style.width = (mxClient.IS_QUIRKS) ? '58px' : '50px'; - } - else - { - viewMenu.style.width = (mxClient.IS_QUIRKS) ? '62px' : '36px'; - } - - if (sw >= 420) - { - this.addSeparator(); - var elts = this.addItems(['zoomIn', 'zoomOut']); - elts[0].setAttribute('title', mxResources.get('zoomIn') + ' (' + this.editorUi.actions.get('zoomIn').shortcut + ')'); - elts[1].setAttribute('title', mxResources.get('zoomOut') + ' (' + this.editorUi.actions.get('zoomOut').shortcut + ')'); - } - - // Updates the label if the scale changes - this.updateZoom = mxUtils.bind(this, function() - { - viewMenu.innerHTML = Math.round(this.editorUi.editor.graph.view.scale * 100) + '%' + - this.dropdownImageHtml; - - if (EditorUi.compactUi) - { - viewMenu.getElementsByTagName('img')[0].style.right = '1px'; - viewMenu.getElementsByTagName('img')[0].style.top = '5px'; - } - }); - - this.editorUi.editor.graph.view.addListener(mxEvent.EVENT_SCALE, this.updateZoom); - this.editorUi.editor.addListener('resetGraphView', this.updateZoom); - - var elts = this.addItems(['-', 'undo', 'redo']); - elts[1].setAttribute('title', mxResources.get('undo') + ' (' + this.editorUi.actions.get('undo').shortcut + ')'); - elts[2].setAttribute('title', mxResources.get('redo') + ' (' + this.editorUi.actions.get('redo').shortcut + ')'); - - if (sw >= 320) - { - var elts = this.addItems(['-', 'delete']); - elts[1].setAttribute('title', mxResources.get('delete') + ' (' + this.editorUi.actions.get('delete').shortcut + ')'); - } - - if (sw >= 550) - { - this.addItems(['-', 'toFront', 'toBack']); - } - - if (sw >= 740) - { - this.addItems(['-', 'fillColor']); - - if (sw >= 780) - { - this.addItems(['strokeColor']); - - if (sw >= 820) - { - this.addItems(['shadow']); - } - } - } - - if (sw >= 400) - { - this.addSeparator(); - - if (sw >= 440) - { - this.edgeShapeMenu = this.addMenuFunction('', mxResources.get('connection'), false, mxUtils.bind(this, function(menu) - { - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_SHAPE, 'width'], [null, null], 'geIcon geSprite geSprite-connection', null, true).setAttribute('title', mxResources.get('line')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_SHAPE, 'width'], ['link', null], 'geIcon geSprite geSprite-linkedge', null, true).setAttribute('title', mxResources.get('link')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_SHAPE, 'width'], ['flexArrow', null], 'geIcon geSprite geSprite-arrow', null, true).setAttribute('title', mxResources.get('arrow')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_SHAPE, 'width'], ['arrow', null], 'geIcon geSprite geSprite-simplearrow', null, true).setAttribute('title', mxResources.get('simpleArrow')); - })); - - this.addDropDownArrow(this.edgeShapeMenu, 'geSprite-connection', 44, 50, 0, 0, 22, -4); - } - - this.edgeStyleMenu = this.addMenuFunction('geSprite-orthogonal', mxResources.get('waypoints'), false, mxUtils.bind(this, function(menu) - { - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], [null, null, null], 'geIcon geSprite geSprite-straight', null, true).setAttribute('title', mxResources.get('straight')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['orthogonalEdgeStyle', null, null], 'geIcon geSprite geSprite-orthogonal', null, true).setAttribute('title', mxResources.get('orthogonal')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['elbowEdgeStyle', null, null, null], 'geIcon geSprite geSprite-horizontalelbow', null, true).setAttribute('title', mxResources.get('simple')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['elbowEdgeStyle', 'vertical', null, null], 'geIcon geSprite geSprite-verticalelbow', null, true).setAttribute('title', mxResources.get('simple')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['isometricEdgeStyle', null, null, null], 'geIcon geSprite geSprite-horizontalisometric', null, true).setAttribute('title', mxResources.get('isometric')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['isometricEdgeStyle', 'vertical', null, null], 'geIcon geSprite geSprite-verticalisometric', null, true).setAttribute('title', mxResources.get('isometric')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['orthogonalEdgeStyle', '1', null], 'geIcon geSprite geSprite-curved', null, true).setAttribute('title', mxResources.get('curved')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['entityRelationEdgeStyle', null, null], 'geIcon geSprite geSprite-entity', null, true).setAttribute('title', mxResources.get('entityRelation')); - })); - - this.addDropDownArrow(this.edgeStyleMenu, 'geSprite-orthogonal', 44, 50, 0, 0, 22, -4); - } - - this.addSeparator(); - - var insertMenu = this.addMenu('', mxResources.get('insert') + ' (' + mxResources.get('doubleClickTooltip') + ')', true, 'insert', null, true); - this.addDropDownArrow(insertMenu, 'geSprite-plus', 38, 48, -4, -3, 36, -8); -}; - -/** - * Adds the toolbar elements. - */ -Toolbar.prototype.addDropDownArrow = function(menu, sprite, width, atlasWidth, left, top, atlasDelta, atlasLeft) -{ - atlasDelta = (atlasDelta != null) ? atlasDelta : 32; - left = (EditorUi.compactUi) ? left : atlasLeft; - - menu.style.whiteSpace = 'nowrap'; - menu.style.overflow = 'hidden'; - menu.style.position = 'relative'; - menu.innerHTML = '
' + - this.dropdownImageHtml; - menu.style.width = (mxClient.IS_QUIRKS) ? atlasWidth + 'px' : (atlasWidth - atlasDelta) + 'px'; - - if (mxClient.IS_QUIRKS) - { - menu.style.height = (EditorUi.compactUi) ? '24px' : '26px'; - } - - // Fix for item size in kennedy theme - if (EditorUi.compactUi) - { - menu.getElementsByTagName('img')[0].style.left = '24px'; - menu.getElementsByTagName('img')[0].style.top = '5px'; - menu.style.width = (mxClient.IS_QUIRKS) ? width + 'px' : (width - 10) + 'px'; - } -}; - -/** - * Sets the current font name. - */ -Toolbar.prototype.setFontName = function(value) -{ - if (this.fontMenu != null) - { - this.fontMenu.innerHTML = '
' + - mxUtils.htmlEntities(value) + '
' + this.dropdownImageHtml; - } -}; - -/** - * Sets the current font name. - */ -Toolbar.prototype.setFontSize = function(value) -{ - if (this.sizeMenu != null) - { - this.sizeMenu.innerHTML = '
' + - value + '
' + this.dropdownImageHtml; - } -}; - -/** - * Hides the current menu. - */ -Toolbar.prototype.createTextToolbar = function() -{ - var graph = this.editorUi.editor.graph; - - var styleElt = this.addMenu('', mxResources.get('style'), true, 'formatBlock'); - styleElt.style.position = 'relative'; - styleElt.style.whiteSpace = 'nowrap'; - styleElt.style.overflow = 'hidden'; - styleElt.innerHTML = mxResources.get('style') + this.dropdownImageHtml; - - if (EditorUi.compactUi) - { - styleElt.style.paddingRight = '18px'; - styleElt.getElementsByTagName('img')[0].style.right = '1px'; - styleElt.getElementsByTagName('img')[0].style.top = '5px'; - } - - this.addSeparator(); - - this.fontMenu = this.addMenu('', mxResources.get('fontFamily'), true, 'fontFamily'); - this.fontMenu.style.position = 'relative'; - this.fontMenu.style.whiteSpace = 'nowrap'; - this.fontMenu.style.overflow = 'hidden'; - this.fontMenu.style.width = (mxClient.IS_QUIRKS) ? '80px' : '60px'; - - this.setFontName(Menus.prototype.defaultFont); - - if (EditorUi.compactUi) - { - this.fontMenu.style.paddingRight = '18px'; - this.fontMenu.getElementsByTagName('img')[0].style.right = '1px'; - this.fontMenu.getElementsByTagName('img')[0].style.top = '5px'; - } - - this.addSeparator(); - - this.sizeMenu = this.addMenu(Menus.prototype.defaultFontSize, mxResources.get('fontSize'), true, 'fontSize'); - this.sizeMenu.style.position = 'relative'; - this.sizeMenu.style.whiteSpace = 'nowrap'; - this.sizeMenu.style.overflow = 'hidden'; - this.sizeMenu.style.width = (mxClient.IS_QUIRKS) ? '44px' : '24px'; - - this.setFontSize(Menus.prototype.defaultFontSize); - - if (EditorUi.compactUi) - { - this.sizeMenu.style.paddingRight = '18px'; - this.sizeMenu.getElementsByTagName('img')[0].style.right = '1px'; - this.sizeMenu.getElementsByTagName('img')[0].style.top = '5px'; - } - - var elts = this.addItems(['-', 'undo', 'redo','-', 'bold', 'italic', 'underline']); - elts[1].setAttribute('title', mxResources.get('undo') + ' (' + this.editorUi.actions.get('undo').shortcut + ')'); - elts[2].setAttribute('title', mxResources.get('redo') + ' (' + this.editorUi.actions.get('redo').shortcut + ')'); - elts[4].setAttribute('title', mxResources.get('bold') + ' (' + this.editorUi.actions.get('bold').shortcut + ')'); - elts[5].setAttribute('title', mxResources.get('italic') + ' (' + this.editorUi.actions.get('italic').shortcut + ')'); - elts[6].setAttribute('title', mxResources.get('underline') + ' (' + this.editorUi.actions.get('underline').shortcut + ')'); - - // KNOWN: Lost focus after click on submenu with text (not icon) in quirks and IE8. This is because the TD seems - // to catch the focus on click in these browsers. NOTE: Workaround in mxPopupMenu for icon items (without text). - var alignMenu = this.addMenuFunction('', mxResources.get('align'), false, mxUtils.bind(this, function(menu) - { - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - document.execCommand('justifyleft', false, null); - }), null, 'geIcon geSprite geSprite-left'); - elt.setAttribute('title', mxResources.get('left')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - document.execCommand('justifycenter', false, null); - }), null, 'geIcon geSprite geSprite-center'); - elt.setAttribute('title', mxResources.get('center')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - document.execCommand('justifyright', false, null); - }), null, 'geIcon geSprite geSprite-right'); - elt.setAttribute('title', mxResources.get('right')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - document.execCommand('justifyfull', false, null); - }), null, 'geIcon geSprite geSprite-justifyfull'); - elt.setAttribute('title', mxResources.get('justifyfull')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - document.execCommand('insertorderedlist', false, null); - }), null, 'geIcon geSprite geSprite-orderedlist'); - elt.setAttribute('title', mxResources.get('numberedList')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - document.execCommand('insertunorderedlist', false, null); - }), null, 'geIcon geSprite geSprite-unorderedlist'); - elt.setAttribute('title', mxResources.get('bulletedList')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - document.execCommand('outdent', false, null); - }), null, 'geIcon geSprite geSprite-outdent'); - elt.setAttribute('title', mxResources.get('decreaseIndent')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - document.execCommand('indent', false, null); - }), null, 'geIcon geSprite geSprite-indent'); - elt.setAttribute('title', mxResources.get('increaseIndent')); - })); - - alignMenu.style.position = 'relative'; - alignMenu.style.whiteSpace = 'nowrap'; - alignMenu.style.overflow = 'hidden'; - alignMenu.innerHTML = '
' + this.dropdownImageHtml; - alignMenu.style.width = (mxClient.IS_QUIRKS) ? '50px' : '30px'; - - if (EditorUi.compactUi) - { - alignMenu.getElementsByTagName('img')[0].style.left = '22px'; - alignMenu.getElementsByTagName('img')[0].style.top = '5px'; - } - - var formatMenu = this.addMenuFunction('', mxResources.get('format'), false, mxUtils.bind(this, function(menu) - { - elt = menu.addItem('', null, this.editorUi.actions.get('subscript').funct, - null, 'geIcon geSprite geSprite-subscript'); - elt.setAttribute('title', mxResources.get('subscript') + ' (' + Editor.ctrlKey + '+,)'); - - elt = menu.addItem('', null, this.editorUi.actions.get('superscript').funct, - null, 'geIcon geSprite geSprite-superscript'); - elt.setAttribute('title', mxResources.get('superscript') + ' (' + Editor.ctrlKey + '+.)'); - - // KNOWN: IE+FF don't return keyboard focus after color dialog (calling focus doesn't help) - elt = menu.addItem('', null, this.editorUi.actions.get('fontColor').funct, - null, 'geIcon geSprite geSprite-fontcolor'); - elt.setAttribute('title', mxResources.get('fontColor')); - - elt = menu.addItem('', null, this.editorUi.actions.get('backgroundColor').funct, - null, 'geIcon geSprite geSprite-fontbackground'); - elt.setAttribute('title', mxResources.get('backgroundColor')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - document.execCommand('removeformat', false, null); - }), null, 'geIcon geSprite geSprite-removeformat'); - elt.setAttribute('title', mxResources.get('removeFormat')); - })); - - formatMenu.style.position = 'relative'; - formatMenu.style.whiteSpace = 'nowrap'; - formatMenu.style.overflow = 'hidden'; - formatMenu.innerHTML = '
' + - this.dropdownImageHtml; - formatMenu.style.width = (mxClient.IS_QUIRKS) ? '50px' : '30px'; - - if (EditorUi.compactUi) - { - formatMenu.getElementsByTagName('img')[0].style.left = '22px'; - formatMenu.getElementsByTagName('img')[0].style.top = '5px'; - } - - this.addSeparator(); - - this.addButton('geIcon geSprite geSprite-code', mxResources.get('html'), function() - { - graph.cellEditor.toggleViewMode(); - - if (graph.cellEditor.textarea.innerHTML.length > 0 && (graph.cellEditor.textarea.innerHTML != ' ' || !graph.cellEditor.clearOnChange)) - { - window.setTimeout(function() - { - document.execCommand('selectAll', false, null); - }); - } - }); - - this.addSeparator(); - - // FIXME: Uses geButton here and geLabel in main menu - var insertMenu = this.addMenuFunction('', mxResources.get('insert'), true, mxUtils.bind(this, function(menu) - { - menu.addItem(mxResources.get('insertLink'), null, mxUtils.bind(this, function() - { - this.editorUi.actions.get('link').funct(); - })); - - menu.addItem(mxResources.get('insertImage'), null, mxUtils.bind(this, function() - { - this.editorUi.actions.get('image').funct(); - })); - - menu.addItem(mxResources.get('insertHorizontalRule'), null, mxUtils.bind(this, function() - { - document.execCommand('inserthorizontalrule', false, null); - })); - })); - - insertMenu.style.whiteSpace = 'nowrap'; - insertMenu.style.overflow = 'hidden'; - insertMenu.style.position = 'relative'; - insertMenu.innerHTML = '
' + - this.dropdownImageHtml; - insertMenu.style.width = (mxClient.IS_QUIRKS) ? '36px' : '16px'; - - // Fix for item size in kennedy theme - if (EditorUi.compactUi) - { - insertMenu.getElementsByTagName('img')[0].style.left = '24px'; - insertMenu.getElementsByTagName('img')[0].style.top = '5px'; - insertMenu.style.width = (mxClient.IS_QUIRKS) ? '50px' : '30px'; - } - - this.addSeparator(); - - // KNOWN: All table stuff does not work with undo/redo - // KNOWN: Lost focus after click on submenu with text (not icon) in quirks and IE8. This is because the TD seems - // to catch the focus on click in these browsers. NOTE: Workaround in mxPopupMenu for icon items (without text). - var elt = this.addMenuFunction('geIcon geSprite geSprite-table', mxResources.get('table'), false, mxUtils.bind(this, function(menu) - { - var elt = graph.getSelectedElement(); - var cell = graph.getParentByName(elt, 'TD', graph.cellEditor.text2); - var row = graph.getParentByName(elt, 'TR', graph.cellEditor.text2); - - if (row == null) - { - this.editorUi.menus.addInsertTableItem(menu); - } - else - { - var table = graph.getParentByName(row, 'TABLE', graph.cellEditor.text2); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - try - { - graph.selectNode(graph.insertColumn(table, (cell != null) ? cell.cellIndex : 0)); - } - catch (e) - { - mxUtils.alert(mxResources.get('error') + ': ' + e.message); - } - }), null, 'geIcon geSprite geSprite-insertcolumnbefore'); - elt.setAttribute('title', mxResources.get('insertColumnBefore')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - try - { - graph.selectNode(graph.insertColumn(table, (cell != null) ? cell.cellIndex + 1 : -1)); - } - catch (e) - { - mxUtils.alert(mxResources.get('error') + ': ' + e.message); - } - }), null, 'geIcon geSprite geSprite-insertcolumnafter'); - elt.setAttribute('title', mxResources.get('insertColumnAfter')); - - elt = menu.addItem('Delete column', null, mxUtils.bind(this, function() - { - if (cell != null) - { - try - { - graph.deleteColumn(table, cell.cellIndex); - } - catch (e) - { - mxUtils.alert(mxResources.get('error') + ': ' + e.message); - } - } - }), null, 'geIcon geSprite geSprite-deletecolumn'); - elt.setAttribute('title', mxResources.get('deleteColumn')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - try - { - graph.selectNode(graph.insertRow(table, row.sectionRowIndex)); - } - catch (e) - { - mxUtils.alert(mxResources.get('error') + ': ' + e.message); - } - }), null, 'geIcon geSprite geSprite-insertrowbefore'); - elt.setAttribute('title', mxResources.get('insertRowBefore')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - try - { - graph.selectNode(graph.insertRow(table, row.sectionRowIndex + 1)); - } - catch (e) - { - mxUtils.alert(mxResources.get('error') + ': ' + e.message); - } - }), null, 'geIcon geSprite geSprite-insertrowafter'); - elt.setAttribute('title', mxResources.get('insertRowAfter')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - try - { - graph.deleteRow(table, row.sectionRowIndex); - } - catch (e) - { - mxUtils.alert(mxResources.get('error') + ': ' + e.message); - } - }), null, 'geIcon geSprite geSprite-deleterow'); - elt.setAttribute('title', mxResources.get('deleteRow')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - // Converts rgb(r,g,b) values - var color = table.style.borderColor.replace( - /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g, - function($0, $1, $2, $3) { - return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2); - }); - this.editorUi.pickColor(color, function(newColor) - { - if (newColor == null || newColor == mxConstants.NONE) - { - table.removeAttribute('border'); - table.style.border = ''; - table.style.borderCollapse = ''; - } - else - { - table.setAttribute('border', '1'); - table.style.border = '1px solid ' + newColor; - table.style.borderCollapse = 'collapse'; - } - }); - }), null, 'geIcon geSprite geSprite-strokecolor'); - elt.setAttribute('title', mxResources.get('borderColor')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - // Converts rgb(r,g,b) values - var color = table.style.backgroundColor.replace( - /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g, - function($0, $1, $2, $3) { - return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2); - }); - this.editorUi.pickColor(color, function(newColor) - { - if (newColor == null || newColor == mxConstants.NONE) - { - table.style.backgroundColor = ''; - } - else - { - table.style.backgroundColor = newColor; - } - }); - }), null, 'geIcon geSprite geSprite-fillcolor'); - elt.setAttribute('title', mxResources.get('backgroundColor')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - var value = table.getAttribute('cellPadding') || 0; - - var dlg = new FilenameDialog(this.editorUi, value, mxResources.get('apply'), mxUtils.bind(this, function(newValue) - { - if (newValue != null && newValue.length > 0) - { - table.setAttribute('cellPadding', newValue); - } - else - { - table.removeAttribute('cellPadding'); - } - }), mxResources.get('spacing')); - this.editorUi.showDialog(dlg.container, 300, 80, true, true); - dlg.init(); - }), null, 'geIcon geSprite geSprite-fit'); - elt.setAttribute('title', mxResources.get('spacing')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - table.setAttribute('align', 'left'); - }), null, 'geIcon geSprite geSprite-left'); - elt.setAttribute('title', mxResources.get('left')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - table.setAttribute('align', 'center'); - }), null, 'geIcon geSprite geSprite-center'); - elt.setAttribute('title', mxResources.get('center')); - - elt = menu.addItem('', null, mxUtils.bind(this, function() - { - table.setAttribute('align', 'right'); - }), null, 'geIcon geSprite geSprite-right'); - elt.setAttribute('title', mxResources.get('right')); - } - })); - - elt.style.position = 'relative'; - elt.style.whiteSpace = 'nowrap'; - elt.style.overflow = 'hidden'; - elt.innerHTML = '
' + this.dropdownImageHtml; - elt.style.width = (mxClient.IS_QUIRKS) ? '50px' : '30px'; - - // Fix for item size in kennedy theme - if (EditorUi.compactUi) - { - elt.getElementsByTagName('img')[0].style.left = '22px'; - elt.getElementsByTagName('img')[0].style.top = '5px'; - } -}; - -/** - * Hides the current menu. - */ -Toolbar.prototype.hideMenu = function() -{ - this.editorUi.hideCurrentMenu(); -}; - -/** - * Adds a label to the toolbar. - */ -Toolbar.prototype.addMenu = function(label, tooltip, showLabels, name, c, showAll) -{ - var menu = this.editorUi.menus.get(name); - var elt = this.addMenuFunction(label, tooltip, showLabels, function() - { - menu.funct.apply(menu, arguments); - }, c, showAll); - - menu.addListener('stateChanged', function() - { - elt.setEnabled(menu.enabled); - }); - - return elt; -}; - -/** - * Adds a label to the toolbar. - */ -Toolbar.prototype.addMenuFunction = function(label, tooltip, showLabels, funct, c, showAll) -{ - return this.addMenuFunctionInContainer((c != null) ? c : this.container, label, tooltip, showLabels, funct, showAll); -}; - -/** - * Adds a label to the toolbar. - */ -Toolbar.prototype.addMenuFunctionInContainer = function(container, label, tooltip, showLabels, funct, showAll) -{ - var elt = (showLabels) ? this.createLabel(label) : this.createButton(label); - this.initElement(elt, tooltip); - this.addMenuHandler(elt, showLabels, funct, showAll); - container.appendChild(elt); - - return elt; -}; - -/** - * Adds a separator to the separator. - */ -Toolbar.prototype.addSeparator = function(c) -{ - c = (c != null) ? c : this.container; - var elt = document.createElement('div'); - elt.className = 'geSeparator'; - c.appendChild(elt); - - return elt; -}; - -/** - * Adds given action item - */ -Toolbar.prototype.addItems = function(keys, c, ignoreDisabled) -{ - var items = []; - - for (var i = 0; i < keys.length; i++) - { - var key = keys[i]; - - if (key == '-') - { - items.push(this.addSeparator(c)); - } - else - { - items.push(this.addItem('geSprite-' + key.toLowerCase(), key, c, ignoreDisabled)); - } - } - - return items; -}; - -/** - * Adds given action item - */ -Toolbar.prototype.addItem = function(sprite, key, c, ignoreDisabled) -{ - var action = this.editorUi.actions.get(key); - var elt = null; - - if (action != null) - { - var tooltip = action.label; - - if (action.shortcut != null) - { - tooltip += ' (' + action.shortcut + ')'; - } - - elt = this.addButton(sprite, tooltip, action.funct, c); - - if (!ignoreDisabled) - { - elt.setEnabled(action.enabled); - - action.addListener('stateChanged', function() - { - elt.setEnabled(action.enabled); - }); - } - } - - return elt; -}; - -/** - * Adds a button to the toolbar. - */ -Toolbar.prototype.addButton = function(classname, tooltip, funct, c) -{ - var elt = this.createButton(classname); - c = (c != null) ? c : this.container; - - this.initElement(elt, tooltip); - this.addClickHandler(elt, funct); - c.appendChild(elt); - - return elt; -}; - -/** - * Initializes the given toolbar element. - */ -Toolbar.prototype.initElement = function(elt, tooltip) -{ - // Adds tooltip - if (tooltip != null) - { - elt.setAttribute('title', tooltip); - } - - this.addEnabledState(elt); -}; - -/** - * Adds enabled state with setter to DOM node (avoids JS wrapper). - */ -Toolbar.prototype.addEnabledState = function(elt) -{ - var classname = elt.className; - - elt.setEnabled = function(value) - { - elt.enabled = value; - - if (value) - { - elt.className = classname; - } - else - { - elt.className = classname + ' mxDisabled'; - } - }; - - elt.setEnabled(true); -}; - -/** - * Adds enabled state with setter to DOM node (avoids JS wrapper). - */ -Toolbar.prototype.addClickHandler = function(elt, funct) -{ - if (funct != null) - { - mxEvent.addListener(elt, 'click', function(evt) - { - if (elt.enabled) - { - funct(evt); - } - - mxEvent.consume(evt); - }); - - if (document.documentMode != null && document.documentMode >= 9) - { - // Prevents focus - mxEvent.addListener(elt, 'mousedown', function(evt) - { - evt.preventDefault(); - }); - } - } -}; - -/** - * Creates and returns a new button. - */ -Toolbar.prototype.createButton = function(classname) -{ - var elt = document.createElement('a'); - elt.setAttribute('href', 'javascript:void(0);'); - elt.className = 'geButton'; - - var inner = document.createElement('div'); - - if (classname != null) - { - inner.className = 'geSprite ' + classname; - } - - elt.appendChild(inner); - - return elt; -}; - -/** - * Creates and returns a new button. - */ -Toolbar.prototype.createLabel = function(label, tooltip) -{ - var elt = document.createElement('a'); - elt.setAttribute('href', 'javascript:void(0);'); - elt.className = 'geLabel'; - mxUtils.write(elt, label); - - return elt; -}; - -/** - * Adds a handler for showing a menu in the given element. - */ -Toolbar.prototype.addMenuHandler = function(elt, showLabels, funct, showAll) -{ - if (funct != null) - { - var graph = this.editorUi.editor.graph; - var menu = null; - var show = true; - - mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt) - { - if (show && (elt.enabled == null || elt.enabled)) - { - graph.popupMenuHandler.hideMenu(); - menu = new mxPopupMenu(funct); - menu.div.className += ' geToolbarMenu'; - menu.showDisabled = showAll; - menu.labels = showLabels; - menu.autoExpand = true; - - var offset = mxUtils.getOffset(elt); - menu.popup(offset.x, offset.y + elt.offsetHeight, null, evt); - this.editorUi.setCurrentMenu(menu, elt); - - // Workaround for scrollbar hiding menu items - if (!showLabels && menu.div.scrollHeight > menu.div.clientHeight) - { - menu.div.style.width = '40px'; - } - - menu.hideMenu = mxUtils.bind(this, function() - { - mxPopupMenu.prototype.hideMenu.apply(menu, arguments); - this.editorUi.resetCurrentMenu(); - menu.destroy(); - }); - - // Extends destroy to reset global state - menu.addListener(mxEvent.EVENT_HIDE, mxUtils.bind(this, function() - { - this.currentElt = null; - })); - } - - show = true; - mxEvent.consume(evt); - })); - - // Hides menu if already showing - mxEvent.addListener(elt, 'mousedown', mxUtils.bind(this, function(evt) - { - show = this.currentElt != elt; - - // Prevents focus - if (document.documentMode != null && document.documentMode >= 9) - { - evt.preventDefault(); - } - })); - } -}; - -/** - * Adds a handler for showing a menu in the given element. - */ -Toolbar.prototype.destroy = function() -{ - if (this.gestureHandler != null) - { - mxEvent.removeGestureListeners(document, this.gestureHandler); - this.gestureHandler = null; - } -}; diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/jscolor/arrow.gif b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/jscolor/arrow.gif deleted file mode 100644 index 246478a864f812d93d4cd0e0d0ad1c8e2d09c825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66 zcmZ?wbhEHbWM|-JSjfZx1poj4Utv=LM2bII7`Ygj7<53QAbAERVV@R>f}L*~a`L;Z PKCZl?^}@uHk--`OML81Y diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/jscolor/cross.gif b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/jscolor/cross.gif deleted file mode 100644 index 0ee9c7ac517bee40b78aea03afa809631f0b69fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83 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 YzFqsNg>|5V=vOIWZ|#VBZRvIQe;Bk#LI3~& diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/jscolor/hv.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/jscolor/hv.png deleted file mode 100644 index 1c5e01f8bcecc4cf835e8eeeaa43ef2c06789022..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2865 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 E0LKozl>h($ diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/jscolor/jscolor.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/jscolor/jscolor.js deleted file mode 100644 index b8093d88..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/jscolor/jscolor.js +++ /dev/null @@ -1,913 +0,0 @@ -/** - * jscolor, JavaScript Color Picker - * - * @version 1.3.13 - * @license GNU Lesser General Public License, http://www.gnu.org/copyleft/lesser.html - * @author Jan Odvarko, http://odvarko.cz - * @created 2008-06-15 - * @updated 2012-01-19 - * @link http://jscolor.com - */ - - -var jscolor = { - - - dir : '', // location of jscolor directory (leave empty to autodetect) - bindClass : 'color', // class name - binding : true, // automatic binding via - preloading : true, // use image preloading? - - - install : function() { - //jscolor.addEvent(window, 'load', jscolor.init); - }, - - - init : function() { - if(jscolor.preloading) { - jscolor.preload(); - } - }, - - - getDir : function() { - if(!jscolor.dir) { - var detected = jscolor.detectDir(); - jscolor.dir = detected!==false ? detected : 'jscolor/'; - } - return jscolor.dir; - }, - - - detectDir : function() { - var base = location.href; - - var e = document.getElementsByTagName('base'); - for(var i=0; i vs[a] ? - (-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) : - tp[a], - -vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ? - (-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) : - (tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c) - ]; - } - drawPicker(0, 0); - } - }; - - - this.importColor = function() { - if(!valueElement) { - this.exportColor(); - } else { - if(!this.adjust) { - if(!this.fromString(valueElement.value, leaveValue)) { - styleElement.style.backgroundImage = styleElement.jscStyle.backgroundImage; - styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor; - styleElement.style.color = styleElement.jscStyle.color; - this.exportColor(leaveValue | leaveStyle); - } - } else if(!this.required && /^\s*$/.test(valueElement.value)) { - valueElement.value = ''; - styleElement.style.backgroundImage = styleElement.jscStyle.backgroundImage; - styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor; - styleElement.style.color = styleElement.jscStyle.color; - this.exportColor(leaveValue | leaveStyle); - - } else if(this.fromString(valueElement.value)) { - // OK - } else { - this.exportColor(); - } - } - }; - - - this.exportColor = function(flags) { - if(!(flags & leaveValue) && valueElement) { - var value = this.toString(); - if(this.caps) { value = value.toUpperCase(); } - if(this.hash) { value = '#'+value; } - valueElement.value = value; - } - if(!(flags & leaveStyle) && styleElement) { - styleElement.style.backgroundImage = "none"; - styleElement.style.backgroundColor = - '#'+this.toString(); - styleElement.style.color = - 0.213 * this.rgb[0] + - 0.715 * this.rgb[1] + - 0.072 * this.rgb[2] - < 0.5 ? '#FFF' : '#000'; - } - if(!(flags & leavePad) && isPickerOwner()) { - redrawPad(); - } - if(!(flags & leaveSld) && isPickerOwner()) { - redrawSld(); - } - }; - - - this.fromHSV = function(h, s, v, flags) { // null = don't change - h<0 && (h=0) || h>6 && (h=6); - s<0 && (s=0) || s>1 && (s=1); - v<0 && (v=0) || v>1 && (v=1); - this.rgb = HSV_RGB( - h===null ? this.hsv[0] : (this.hsv[0]=h), - s===null ? this.hsv[1] : (this.hsv[1]=s), - v===null ? this.hsv[2] : (this.hsv[2]=v) - ); - this.exportColor(flags); - }; - - - this.fromRGB = function(r, g, b, flags) { // null = don't change - r<0 && (r=0) || r>1 && (r=1); - g<0 && (g=0) || g>1 && (g=1); - b<0 && (b=0) || b>1 && (b=1); - var hsv = RGB_HSV( - r===null ? this.rgb[0] : (this.rgb[0]=r), - g===null ? this.rgb[1] : (this.rgb[1]=g), - b===null ? this.rgb[2] : (this.rgb[2]=b) - ); - if(hsv[0] !== null) { - this.hsv[0] = hsv[0]; - } - if(hsv[2] !== 0) { - this.hsv[1] = hsv[1]; - } - this.hsv[2] = hsv[2]; - this.exportColor(flags); - }; - - - this.fromString = function(hex, flags) { - var m = hex.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i); - if(!m) { - return false; - } else { - if(m[1].length === 6) { // 6-char notation - this.fromRGB( - parseInt(m[1].substr(0,2),16) / 255, - parseInt(m[1].substr(2,2),16) / 255, - parseInt(m[1].substr(4,2),16) / 255, - flags - ); - } else { // 3-char notation - this.fromRGB( - parseInt(m[1].charAt(0)+m[1].charAt(0),16) / 255, - parseInt(m[1].charAt(1)+m[1].charAt(1),16) / 255, - parseInt(m[1].charAt(2)+m[1].charAt(2),16) / 255, - flags - ); - } - return true; - } - }; - - - this.toString = function() { - return ( - (0x100 | Math.round(255*this.rgb[0])).toString(16).substr(1) + - (0x100 | Math.round(255*this.rgb[1])).toString(16).substr(1) + - (0x100 | Math.round(255*this.rgb[2])).toString(16).substr(1) - ); - }; - - - function RGB_HSV(r, g, b) { - var n = Math.min(Math.min(r,g),b); - var v = Math.max(Math.max(r,g),b); - var m = v - n; - if(m === 0) { return [ null, 0, v ]; } - var h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m); - return [ h===6?0:h, m/v, v ]; - } - - - function HSV_RGB(h, s, v) { - if(h === null) { return [ v, v, v ]; } - var i = Math.floor(h); - var f = i%2 ? h-i : 1-(h-i); - var m = v * (1 - s); - var n = v * (1 - s*f); - switch(i) { - case 6: - case 0: return [v,n,m]; - case 1: return [n,v,m]; - case 2: return [m,v,n]; - case 3: return [m,n,v]; - case 4: return [n,m,v]; - case 5: return [v,m,n]; - } - } - - - function removePicker() { - delete jscolor.picker.owner; - document.getElementsByTagName('body')[0].removeChild(jscolor.picker.boxB); - } - - - function drawPicker(x, y) { - if(!jscolor.picker) { - jscolor.picker = { - box : document.createElement('div'), - boxB : document.createElement('div'), - pad : document.createElement('div'), - padB : document.createElement('div'), - padM : document.createElement('div'), - sld : document.createElement('div'), - sldB : document.createElement('div'), - sldM : document.createElement('div'), - btn : document.createElement('div'), - btnS : document.createElement('span'), - btnT : document.createTextNode(THIS.pickerCloseText) - }; - for(var i=0,segSize=4; i - - - Open Diagram - - - - - -
- - - - - - - - - - - -
- -
-
- - - -
-
- - diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/grapheditor.txt b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/grapheditor.txt deleted file mode 100644 index 25c90c15..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/grapheditor.txt +++ /dev/null @@ -1,321 +0,0 @@ -# Resources from graph.properties -alreadyConnected=Nodes already connected -cancel=Cancel -close=Close -collapse-expand=Collapse/Expand -containsValidationErrors=Contains validation errors -done=Done -doubleClickOrientation=Doubleclick to Change Orientation -error=Error -errorSavingFile=Error saving file -ok=OK -updatingDocument=Updating Document. Please wait... -updatingSelection=Updating Selection. Please wait... -# Custom resources -about=About -actualSize=Actual Size -add=Add -addLayer=Add Layer -addProperty=Add Property -addToExistingDrawing=Add to Existing Drawing -addWaypoint=Add Waypoint -advanced=Advanced -align=Align -alignment=Alignment -allChangesLost=All changes will be lost! -angle=Angle -apply=Apply -arc=Arc -arrange=Arrange -arrow=Arrow -arrows=Arrows -automatic=Automatic -autosave=Autosave -autosize=Autosize -background=Background -backgroundColor=Background Color -backgroundImage=Background Image -basic=Basic -block=Block -blockquote=Blockquote -bold=Bold -border=Border -borderWidth=Borderwidth -borderColor=Border Color -bottom=Bottom -bottomAlign=Bottom Align -bottomLeft=Bottom Left -bottomRight=Bottom Right -bulletedList=Bulleted List -cannotOpenFile=Cannot open file -center=Center -change=Change -changeOrientation=Change Orientation -circle=Circle -classic=Classic -clearDefaultStyle=Clear Default Style -clearWaypoints=Clear Waypoints -clipart=Clipart -collapse=Collapse -collapseExpand=Collapse/Expand -collapsible=Collapsible -comic=Comic -configure=Configure -connect=Connect -connection=Connection -connectionPoints=Connection points -connectionArrows=Connection arrows -constrainProportions=Constrain Proportions -copy=Copy -copyConnect=Copy on Connect -copySize=Copy Size -create=Create -curved=Curved -custom=Custom -cut=Cut -dashed=Dashed -decreaseIndent=Decrease Indent -default=Default -delete=Delete -deleteColumn=Delete Column -deleteRow=Delete Row -diagram=Diagram -diamond=Diamond -diamondThin=Diamond (thin) -direction=Direction -distribute=Distribute -divider=Divider -documentProperties=Document Properties -dotted=Dotted -drawing=Drawing{1} -drawingEmpty=Drawing is empty -drawingTooLarge=Drawing is too large -duplicate=Duplicate -duplicateIt=Duplicate {1} -east=East -edit=Edit -editData=Edit Data -editDiagram=Edit Diagram -editImage=Edit Image -editLink=Edit Link -editStyle=Edit Style -editTooltip=Edit Tooltip -enterGroup=Enter Group -enterValue=Enter Value -enterName=Enter Name -enterPropertyName=Enter Property Name -entityRelation=Entity Relation -exitGroup=Exit Group -expand=Expand -export=Export -extras=Extras -file=File -fileNotFound=File not found -filename=Filename -fill=Fill -fillColor=Fill Color -fitPage=One Page -fitPageWidth=Page Width -fitTwoPages=Two Pages -fitWindow=Fit Window -flip=Flip -flipH=Flip Horizontal -flipV=Flip Vertical -font=Font -fontFamily=Font Family -fontColor=Font Color -fontSize=Font Size -format=Format -formatPanel=Format Panel -general=Allgemein -formatPdf=PDF -formatPng=PNG -formatGif=GIF -formatJpg=JPEG -formatSvg=SVG -formatXml=XML -formatted=Formatted -formattedText=Formatted Text -gap=Gap -glass=Glass -general=General -global=Global -gradient=Gradient -gradientColor=Color -grid=Grid -gridSize=Grid Size -group=Group -guides=Guides -heading=Heading -height=Height -help=Help -hide=Hide -hideIt=Hide {1} -hidden=Hidden -home=Home -horizontal=Horizontal -horizontalFlow=Horizontal Flow -horizontalTree=Horizontal Tree -html=HTML -id=ID -image=Image -images=Images -import=Import -increaseIndent=Increase Indent -insert=Insert -insertColumnBefore=Insert Column Left -insertColumnAfter=Insert Column Right -insertHorizontalRule=Insert Horizontal Rule -insertImage=Insert Image -insertLink=Insert Link -insertRowBefore=Insert Row Above -insertRowAfter=Insert Row Below -invalidName=Invalid name -invalidOrMissingFile=Invalid or missing file -isometric=Isometric -italic=Italic -layers=Layers -landscape=Landscape -laneColor=Lanecolor -layout=Layout -left=Left -leftAlign=Left Align -leftToRight=Left to Right -line=Line -link=Link -lineJumps=Line jumps -lineend=Line End -lineheight=Line Height -linestart=Line Start -linewidth=Linewidth -loading=Loading -lockUnlock=Lock/Unlock -manual=Manual -middle=Middle -misc=Misc -more=More -moreResults=More Results -move=Move -moveSelectionTo=Move Selection to {1} -navigation=Navigation -new=New -noColor=No Color -noFiles=No files -noMoreResults=No more results -none=None -noResultsFor=No results for '{1}' -normal=Normal -north=North -numberedList=Numbered List -opacity=Opacity -open=Open -openArrow=Open Arrow -openFile=Open File -openLink=Open Link -openSupported=Supported format is .XML files saved from this software -openInNewWindow=Open in New Window -openInThisWindow=Open in this Window -options=Options -organic=Organic -orthogonal=Orthogonal -outline=Outline -oval=Oval -pages=Pages -pageView=Page View -pageScale=Page Scale -pageSetup=Page Setup -panTooltip=Space+Drag to Scroll -paperSize=Paper Size -paste=Paste -pasteHere=Paste Here -pasteSize=Paste Size -pattern=Pattern -perimeter=Perimeter -placeholders=Placeholders -plusTooltip=Click to connect and clone (ctrl+click to clone, shift+click to connect). Drag to connect (ctrl+drag to clone). -portrait=Portrait -position=Position -posterPrint=Poster Print -preview=Preview -print=Print -radialTree=Radial Tree -redo=Redo -removeFormat=Clear Formatting -removeFromGroup=Remove from Group -removeIt=Remove {1} -removeWaypoint=Remove Waypoint -rename=Rename -renameIt=Rename {1} -replace=Replace -replaceIt={1} already exists. Do you want to replace it? -replaceExistingDrawing=Replace existing drawing -reset=Reset -resetView=Reset View -reverse=Reverse -right=Right -rightAlign=Right Align -rightToLeft=Right to Left -rotate=Rotate -rotateTooltip=Click and drag to rotate, click to turn by 90 degrees -rotation=Rotation -rounded=Rounded -save=Save -saveAs=Save as -saved=Saved -scrollbars=Scrollbars -search=Search -searchShapes=Search Shapes -selectAll=Select All -selectEdges=Select Edges -selectFont=Select a Font -selectNone=Select None -selectVertices=Select Vertices -setAsDefaultStyle=Set as Default Style -shadow=Shadow -shape=Shape -sharp=Sharp -sidebarTooltip=Click to expand. Drag and drop shapes into the diagram. Shift+click to change selection. Alt+click to insert and connect. -simple=Simple -simpleArrow=Simple Arrow -size=Size -solid=Solid -sourceSpacing=Source Spacing -south=South -spacing=Spacing -straight=Straight -strokeColor=Line Color -style=Style -subscript=Subscript -superscript=Superscript -table=Table -targetSpacing=Target Spacing -text=Text -textAlignment=Text Alignment -textOpacity=Text Opacity -toBack=To Back -toFront=To Front -tooltips=Tooltips -top=Top -topAlign=Top Align -topLeft=Top Left -topRight=Top Right -transparent=Transparent -turn=Rotate 90° -uml=UML -underline=Underline -undo=Undo -ungroup=Ungroup -url=URL -untitledLayer=Untitled Layer -vertical=Vertical -verticalFlow=Vertical Flow -verticalTree=Vertical Tree -view=View -waypoints=Waypoints -west=West -width=Width -wordWrap=Word Wrap -writingDirection=Writing Direction -zoom=Zoom -zoomIn=Zoom In -zoomOut=Zoom Out diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/grapheditor_de.txt b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/grapheditor_de.txt deleted file mode 100644 index 9755f885..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/grapheditor_de.txt +++ /dev/null @@ -1,320 +0,0 @@ -# Resources from graph.properties -alreadyConnected=Knoten schon verbunden -cancel=Abbrechen -close=Schliessen -collapse-expand=Einklappen/Ausklappen -containsValidationErrors=Enthält Validierungsfehler -done=Fertig -doubleClickOrientation=Doppelklicken um Orientierung zu ändern -error=Fehler -errorSavingFile=Fehler beim Speichern der Datei -ok=OK -updatingDocument=Aktualisiere Dokument. Bitte warten... -updatingSelection=Aktualisiere Markierung. Bitte warten... -# Custom resources -about=Über -actualSize=Tatsächliche Grösse -add=Hinzufügen -addLayer=Ebene einfügen -addProperty=Eigenschaft einfügen -addToExistingDrawing=In vorhandene Zeichnung einfügen -addWaypoint=Wegpunkt einfügen -advanced=Erweitert -align=Ausrichten -alignment=Ausrichtung -allChangesLost=Alle Änderungen gehen verloren! -angle=Winkel -apply=Anwenden -arc=Bogen -arrange=Anordnen -arrow=Pfeil -arrows=Pfeile -automatic=Automatisch -autosave=Automatisch Speichern -autosize=Grösse anpassen -background=Hintergrund -backgroundColor=Hintergrundfarbe -backgroundImage=Hintergrundbild -basic=Einfach -block=Block -blockquote=Zitat -bold=Fett -border=Rahmen -borderWidth=Rahmenbreite -borderColor=Rahmenfarbe -bottom=Unten -bottomAlign=Unten -bottomLeft=Unten links -bottomRight=Unten rechts -bulletedList=Aufzählungsliste -cannotOpenFile=Kann Datei nicht öffnen -center=Zentriert -change=Ändern -changeOrientation=Orientierung ändern -circle=Kreis -classic=Klassisch -clearDefaultStyle=Standardstyle löschen -clearWaypoints=Wegpunkte löschen -clipart=Clipart -collapse=Einklappen -collapseExpand=Ein-/Ausklappen -collapsible=Einklappbar -comic=Comic -connect=Verbinden -connection=Verbindung -connectionPoints=Verbindungspunkte -connectionArrows=Verbindungspfeile -constrainProportions=Proportionen beibehalten -copy=Kopieren -copyConnect=Beim Verbinden kopieren -copySize=Grösse kopieren -create=Erstellen -curved=Gebogen -custom=Benutzerdefiniert -cut=Ausschneiden -dashed=Gestrichelt -decreaseIndent=Einzug verringern -default=Vorgegeben -delete=Löschen -deleteColumn=Spalte löschen -deleteRow=Zeile löschen -diagram=Diagramm -diamond=Diamant -diamondThin=Diamant (Schmal) -direction=Richtung -distribute=Verteilen -divider=Treelinie -dotted=Punktiert -documentProperties=Dokumenteigenschaften -drawing=Zeichnung{1} -drawingEmpty=Zeichnung ist leer -drawingTooLarge=Zeichnung ist zu gross -duplicate=Duplizieren -duplicateIt={1} duplizieren -east=Ost -edit=Bearbeiten -editData=Metadaten bearbeiten -editDiagram=Diagramm bearbeiten -editImage=Bild bearbeiten -editLink=Link bearbeiten -editStyle=Style bearbeiten -editTooltip=Tooltip bearbeiten -enterGroup=In Gruppe hinein -enterValue=Wert eingeben -enterName=Namen eingeben -enterPropertyName=Eigenschaftsname eingeben -entityRelation=Entity Relation -exitGroup=Aus Gruppe heraus -expand=Ausklappen -export=Exportieren -extras=Extras -file=Datei -fileNotFound=Datei nicht gefunden -filename=Dateiname -fill=Füllen -fillColor=Füllfarbe -fitPage=Ganze Seite -fitPageWidth=Seitenbreite -fitTwoPages=Zwei Seiten -fitWindow=An Fenstergrösse anpassen -flip=Spiegeln -flipH=Horizontal Spiegeln -flipV=Vertikal Spiegeln -font=Schrift -fontFamily=Schriftart -fontColor=Schriftfarbe -fontSize=Schriftgrösse -format=Format -formatPanel=Bereich "Formatieren" -general=Allgemein -formatPdf=PDF -formatPng=PNG -formatGif=GIF -formatJpg=JPEG -formatSvg=SVG -formatXml=XML -formatted=Formatiert -formattedText=Formatierter Text -gap=Gap -glass=Glas -general=Allgemein -global=Global -gradient=Verlauf -gradientColor=Farbe -grid=Gitternetz -gridSize=Gitternetzgrösse -group=Gruppieren -guides=Führungslinien -heading=Überschrift -height=Höhe -help=Hilfe -hide=Verstecken -hideIt={1} verstecken -hidden=Versteckt -home=Ursprung -horizontal=Horizontal -horizontalFlow=Horizontaler Fluss -horizontalTree=Horizontaler Baum -html=HTML -id=ID -image=Bild -images=Bilder -import=Importieren -increaseIndent=Einzug vergrössern -insert=Einfügen -insertColumnBefore=Spalte links einfügen -insertColumnAfter=Spalte rechts einfügen -insertHorizontalRule=Horizontale Linie einfügen -insertImage=Bild einfügen -insertLink=Link einfügen -insertRowBefore=Zeile oberhalb einfügen -insertRowAfter=Zeile unterhalb einfügen -invalidName=Ungültiger Name -invalidOrMissingFile=Ungültige oder fehlende Datei -isometric=Isometrisch -italic=Kursiv -layers=Ebenen -landscape=Querformat -laneColor=Lane-Farbe -layout=Layout -left=Links -leftAlign=Links -leftToRight=Von links nach rechts -line=Linie -lineJumps=Liniensprünge -link=Link -lineend=Linienende -lineheight=Zeilenhöhe -linestart=Linienanfang -linewidth=Linienbreite -loading=Wird geladen -lockUnlock=Sperren/Entsperren -manual=Manuell -middle=Mitte -misc=Verschiedenes -more=Mehr -moreResults=Mehr Resultate -move=Verschieben -moveSelectionTo=Markierung in {1} einfügen -navigation=Navigation -new=Neu -noColor=Keine Farbe -noFiles=Keine Dateien -noMoreResults=Keine Weiteren Resultate -none=Ohne -noResultsFor=Keine Resultate für '{1}' -normal=Normal -north=Nord -numberedList=Nummerierte Liste -opacity=Deckkraft -open=Öffnen -openArrow=Offen -openFile=Datei öffnen -openLink=Link öffnen -openSupported=Unterstützte Formate sind mit dieser Anwendung erstellte .XML Dateien -openInNewWindow=In neuem Fenster öffnen -openInThisWindow=In diesem Fenster öffnen -options=Optionen -organic=Organisch -orthogonal=Orthogonal -outline=Übersicht -oval=Oval -pages=Seiten -pageView=Seitenansicht -pageScale=Seitenskalierung -pageSetup=Seite einrichten -panTooltip=Leertaste+Ziehen um zu scrollen -paperSize=Papiergrösse -paste=Einfügen -pasteHere=Hier einfügen -pasteSize=Grösse einfügen -pattern=Muster -perimeter=Umfang -placeholders=Platzhalter -plusTooltip=Klicken zum Verbinden und Klonen (Ctrl-Taste gedrückt halten zum Klonen, Shift+Klick zum Verbinden). Ziehen zum verbinden (Ctrl-Taste gedrückt halten zum Klonen). -portrait=Hochformat -position=Position -posterPrint=Posterdruck -preview=Vorschau -print=Drucken -radialTree=Radialer Baum -redo=Wiederherstellen -removeFormat=Formatierung entfernen -removeFromGroup=Aus Gruppe entfernen -removeIt={1} entfernen -removeWaypoint=Wegpunkt entfernen -rename=Umbenennen -renameIt={1} umbenennen -replace=Ersetzen -replaceIt={1} existiert bereits. Soll die Datei überschrieben werden? -replaceExistingDrawing=Vorhandene Zeichnung ersetzen -reset=Zurücksetzen -resetView=Ansicht zurücksetzen -reverse=Umdrehen -right=Rechts -rightAlign=Rechts -rightToLeft=Von rechts nach links -rotate=Rotieren -rotateTooltip=Klicken und ziehen um zu rotieren, klicken für 90 Grad Drehung -rotation=Rotation -rounded=Abgerundet -save=Speichern -saveAs=Speichern unter -saved=Gespeichert -scrollbars=Scrollbars -search=Suchen -searchShapes=Formen suchen -selectAll=Alles markieren -selectEdges=Kanten markieren -selectFont=Schriftart wählen -selectNone=Markierung aufheben -selectVertices=Knoten markieren -setAsDefaultStyle=Als Standardstyle festlegen -shadow=Schatten -shape=Shape -sharp=Eckig -sidebarTooltip=Klicken um zu erweitern. Objekte per Drag & Drop ins Diagramm einfügen. Shift+Klick um die Markierung zu ändern. Alt+Klick zum Einfügen und Verbinden. -simple=Einfach -simpleArrow=Einfacher Pfeil -size=Grösse -solid=Durchgehend -sourceSpacing=Anfangsabstand -south=Süd -spacing=Abstand -straight=Gerade -strokeColor=Linienfarbe -style=Style -subscript=Tiefgestellt -superscript=Hochgestellt -table=Tabelle -targetSpacing=Endabstand -text=Text -textAlignment=Text Ausrichtung -textOpacity=Text Deckkraft -toBack=Nach hinten -toFront=Nach vorne -tooltips=Tooltips -top=Oben -topLeft=Oben links -topRight=Oben rechts -topAlign=Oben -transparent=Transparent -turn=Drehen 90° -uml=UML -underline=Unterstrichen -undo=Rückgängig -ungroup=Gruppierung aufheben -untitledLayer=Unbenannte Ebene -url=URL -vertical=Vertikal -verticalFlow=Vertikaler Fluss -verticalTree=Vertikaler Baum -view=Ansicht -waypoints=Wegpunkte -west=West -width=Breite -wordWrap=Autom. Zeilenumbruch -writingDirection=Textrichtung -zoom=Zoom -zoomIn=Hineinzoomen -zoomOut=Herauszoomen diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/grapheditor_zh.txt b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/grapheditor_zh.txt deleted file mode 100644 index 6eb84556..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/grapheditor_zh.txt +++ /dev/null @@ -1,321 +0,0 @@ -# Resources from graph.properties -alreadyConnected=Nodes already connected -cancel=取消 -close=关闭 -collapse-expand=折叠/展开 -containsValidationErrors=Contains validation errors -done=完成 -doubleClickOrientation=双击改变方向 -error=错误 -errorSavingFile=保存文件时发生错误 -ok=确定 -updatingDocument=正在更新文档. 请等待 ... -updatingSelection=正在更新选择的内容. 请等待 ... -# Custom resources -about=关于 -actualSize=实际大小 -add=添加 -addLayer=添加层 -addProperty=添加属性 -addToExistingDrawing=添加到当前图表中 -addWaypoint=添加路径点 -advanced=高级 -align=对齐 -alignment=对齐 -allChangesLost=将丢失所有更改! -angle=角度 -apply=应用 -arc=Arc -arrange=排列 -arrow=Arrow -arrows=Arrows -automatic=自动 -autosave=自动保存 -autosize=自动大小 -background=背景 -backgroundColor=背景色 -backgroundImage=背景图片 -basic=基本 -block=块 -blockquote=块引用 -bold=粗体 -border=边框 -borderWidth=边框宽度 -borderColor=边框颜色 -bottom=下 -bottomAlign=底部对齐 -bottomLeft=左下 -bottomRight=右下 -bulletedList=Bulleted List -cannotOpenFile=不能打开文件 -center=水平居中 -change=改变 -changeOrientation=改变方向 -circle=圆 -classic=经典 -clearDefaultStyle=清除默认样式 -clearWaypoints=清除路径点 -clipart=Clipart -collapse=折叠 -collapseExpand=折叠/展开 -collapsible=可折叠 -comic=手稿 -configure=配置 -connect=连接 -connection=连接 -connectionPoints=鼠标移动到组件上时,显示连接点 -connectionArrows=鼠标移动到组件上时,显示连接箭头 -constrainProportions=强制比例 -copy=复制 -copyConnect=Copy on Connect -copySize=复制大小 -create=创建 -curved=弧形 -custom=定制 -cut=剪切 -dashed=虚线 -decreaseIndent=减少缩进 -default=默认 -delete=删除 -deleteColumn=删除列 -deleteRow=删除行 -diagram=图表 -diamond=菱形 -diamondThin=Diamond (thin) -direction=Direction -distribute=Distribute -divider=Divider -documentProperties=文档属性 -dotted=Dotted -drawing=Drawing{1} -drawingEmpty=Drawing is empty -drawingTooLarge=Drawing is too large -duplicate=Duplicate -duplicateIt=Duplicate {1} -east=东 -edit=编辑 -editData=编辑数据 -editDiagram=编辑图表XML -editImage=编辑图片 -editLink=编辑链接 -editStyle=编辑样式 -editTooltip=Edit Tooltip -enterGroup=Enter Group -enterValue=Enter Value -enterName=Enter Name -enterPropertyName=Enter Property Name -entityRelation=Entity Relation -exitGroup=Exit Group -expand=Expand -export=导出 -extras=Extras -file=文件 -fileNotFound=文件未发现 -filename=文件名 -fill=填充 -fillColor=填充颜色 -fitPage=一页 -fitPageWidth=页宽度 -fitTwoPages=两页 -fitWindow=适合窗口 -flip=翻转 -flipH=Flip Horizontal -flipV=Flip Vertical -font=字体 -fontFamily=字体族 -fontColor=字体颜色 -fontSize=字体大小 -format=格式 -formatPanel=格式面板 -general=Allgemein -formatPdf=PDF -formatPng=PNG -formatGif=GIF -formatJpg=JPEG -formatSvg=SVG -formatXml=XML -formatted=Formatted -formattedText=格式化文本 -gap=Gap -glass=高斯模糊 -general=General -global=全局 -gradient=渐变 -gradientColor=渐变色 -grid=网格 -gridSize=网格大小 -group=Group -guides=显示对齐参考线 -heading=Heading -height=高度 -help=帮助 -hide=隐藏 -hideIt=Hide {1} -hidden=隐藏 -home=Home -horizontal=水平 -horizontalFlow=Horizontal Flow -horizontalTree=Horizontal Tree -html=HTML -id=ID -image=图片 -images=Images -import=Import -increaseIndent=增加缩进 -insert=插入 -insertColumnBefore=在左边插入列 -insertColumnAfter=在右边插入列 -insertHorizontalRule=Insert Horizontal Rule -insertImage=插入图片 -insertLink=插入链接 -insertRowBefore=在上面插入行 -insertRowAfter=在下面插入行 -invalidName=不合法的名称 -invalidOrMissingFile=不合法或缺少文件 -isometric=Isometric -italic=斜体 -layers=Layers -landscape=横向 -laneColor=Lanecolor -layout=布局 -left=左 -leftAlign=左对齐 -leftToRight=从左到右 -line=线条 -link=链接 -lineJumps=相交线跳跃 -lineend=终点 -lineheight=Line Height -linestart=起点 -linewidth=Linewidth -loading=正在加载 -lockUnlock=锁定/解锁 -manual=手工 -middle=垂直居中 -misc=Misc -more=更多 -moreResults=更多结果 -move=移动 -moveSelectionTo=Move Selection to {1} -navigation=Navigation -new=新建 -noColor=No Color -noFiles=No files -noMoreResults=No more results -none=None -noResultsFor=No results for '{1}' -normal=Normal -north=North -numberedList=Numbered List -opacity=透明粗 -open=打开 -openArrow=Open Arrow -openFile=Open File -openLink=Open Link -openSupported=Supported format is .XML files saved from this software -openInNewWindow=在新窗口打开 -openInThisWindow=在当前窗口打开 -options=选项 -organic=Organic -orthogonal=Orthogonal -outline=Outline -oval=Oval -pages=Pages -pageView=页面视图 -pageScale=Page Scale -pageSetup=Page Setup -panTooltip=Space+Drag to Scroll -paperSize=纸张大小 -paste=Paste -pasteHere=Paste Here -pasteSize=Paste Size -pattern=Pattern -perimeter=Perimeter -placeholders=Placeholders -plusTooltip=Click to connect and clone (ctrl+click to clone, shift+click to connect). Drag to connect (ctrl+drag to clone). -portrait=纵向 -position=位置 -posterPrint=Poster Print -preview=Preview -print=Print -radialTree=Radial Tree -redo=重做 -removeFormat=Clear Formatting -removeFromGroup=Remove from Group -removeIt=Remove {1} -removeWaypoint=Remove Waypoint -rename=Rename -renameIt=Rename {1} -replace=替换 -replaceIt={1} already exists. Do you want to replace it? -replaceExistingDrawing=替换当前图表 -reset=Reset -resetView=Reset View -reverse=反转 -right=右 -rightAlign=右对齐 -rightToLeft=从右到左 -rotate=Rotate -rotateTooltip=Click and drag to rotate, click to turn by 90 degrees -rotation=Rotation -rounded=圆角 -save=保存 -saveAs=Save as -saved=Saved -scrollbars=Scrollbars -search=Search -searchShapes=搜索组件 -selectAll=Select All -selectEdges=Select Edges -selectFont=Select a Font -selectNone=Select None -selectVertices=Select Vertices -setAsDefaultStyle=设置为默认样式 -shadow=阴影 -shape=Shape -sharp=直角 -sidebarTooltip=点击展开.拖拽组件到编辑器中. Shift+click 改变选择的组件. Alt+click 插入新组件并和选择的组件进行连接. -simple=Simple -simpleArrow=Simple Arrow -size=大小 -solid=Solid -sourceSpacing=Source Spacing -south=South -spacing=空白 -straight=Straight -strokeColor=线条颜色 -style=样式 -subscript=Subscript -superscript=Superscript -table=Table -targetSpacing=Target Spacing -text=文本 -textAlignment=Text Alignment -textOpacity=Text Opacity -toBack=置于底层 -toFront=置于顶层 -tooltips=Tooltips -top=上 -topAlign=顶部对齐 -topLeft=左上 -topRight=右上 -transparent=Transparent -turn=顺时针旋转 90° -uml=UML -underline=下划线 -undo=撤销 -ungroup=Ungroup -url=URL -untitledLayer=Untitled Layer -vertical=垂直 -verticalFlow=Vertical Flow -verticalTree=Vertical Tree -view=视图 -waypoints=路径 -west=West -width=宽度 -wordWrap=自动换行 -writingDirection=文本方向 -zoom=缩放 -zoomIn=放大 -zoomOut=缩小 diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/help.html b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/help.html deleted file mode 100644 index 4d2ecbcb..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/help.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - Graph Editor Help - - - - -

Graph Editor Help

-

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy - eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam - voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet - clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit - amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam - nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed - diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. - Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor - sit amet.

- - diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/help_de.html b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/help_de.html deleted file mode 100644 index 165f552c..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/resources/help_de.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - Graph Editor Hilfe - - - - -

Graph Editor Hilfe

-

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy - eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam - voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet - clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit - amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam - nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed - diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. - Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor - sit amet.

- - diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/sanitizer/sanitizer.min.js b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/sanitizer/sanitizer.min.js deleted file mode 100644 index 6e7d30d5..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/sanitizer/sanitizer.min.js +++ /dev/null @@ -1,91 +0,0 @@ -// NOTE: Modified to support data URIs for images, ie. data:image/* -(function(){var c=void 0,n=!0,s=null,C=!1,J=["aliceblue,antiquewhite,aqua,aquamarine,azure,beige,bisque,black,blanchedalmond,blue,blueviolet,brown,burlywood,cadetblue,chartreuse,chocolate,coral,cornflowerblue,cornsilk,crimson,cyan,darkblue,darkcyan,darkgoldenrod,darkgray,darkgreen,darkkhaki,darkmagenta,darkolivegreen,darkorange,darkorchid,darkred,darksalmon,darkseagreen,darkslateblue,darkslategray,darkturquoise,darkviolet,deeppink,deepskyblue,dimgray,dodgerblue,firebrick,floralwhite,forestgreen,fuchsia,gainsboro,ghostwhite,gold,goldenrod,gray,green,greenyellow,honeydew,hotpink,indianred,indigo,ivory,khaki,lavender,lavenderblush,lawngreen,lemonchiffon,lightblue,lightcoral,lightcyan,lightgoldenrodyellow,lightgreen,lightgrey,lightpink,lightsalmon,lightseagreen,lightskyblue,lightslategray,lightsteelblue,lightyellow,lime,limegreen,linen,magenta,maroon,mediumaquamarine,mediumblue,mediumorchid,mediumpurple,mediumseagreen,mediumslateblue,mediumspringgreen,mediumturquoise,mediumvioletred,midnightblue,mintcream,mistyrose,moccasin,navajowhite,navy,oldlace,olive,olivedrab,orange,orangered,orchid,palegoldenrod,palegreen,paleturquoise,palevioletred,papayawhip,peachpuff,peru,pink,plum,powderblue,purple,red,rosybrown,royalblue,saddlebrown,salmon,sandybrown,seagreen,seashell,sienna,silver,skyblue,slateblue,slategray,snow,springgreen,steelblue,tan,teal,thistle,tomato,transparent,turquoise,violet,wheat,white,whitesmoke,yellow,yellowgreen".split(","), -"all-scroll,col-resize,crosshair,default,e-resize,hand,help,move,n-resize,ne-resize,no-drop,not-allowed,nw-resize,pointer,progress,row-resize,s-resize,se-resize,sw-resize,text,vertical-text,w-resize,wait".split(","),"armenian,decimal,decimal-leading-zero,disc,georgian,lower-alpha,lower-greek,lower-latin,lower-roman,square,upper-alpha,upper-latin,upper-roman".split(","),"100,200,300,400,500,600,700,800,900,bold,bolder,lighter".split(","),"block-level,inline-level,table-caption,table-cell,table-column,table-column-group,table-footer-group,table-header-group,table-row,table-row-group".split(","), -"condensed,expanded,extra-condensed,extra-expanded,narrower,semi-condensed,semi-expanded,ultra-condensed,ultra-expanded,wider".split(","),"inherit,inline,inline-block,inline-box,inline-flex,inline-grid,inline-list-item,inline-stack,inline-table,run-in".split(","),"behind,center-left,center-right,far-left,far-right,left-side,leftwards,right-side,rightwards".split(","),"large,larger,small,smaller,x-large,x-small,xx-large,xx-small".split(","),"dashed,dotted,double,groove,outset,ridge,solid".split(","), -"ease,ease-in,ease-in-out,ease-out,linear,step-end,step-start".split(","),"at,closest-corner,closest-side,ellipse,farthest-corner,farthest-side".split(","),"baseline,middle,sub,super,text-bottom,text-top".split(","),"caption,icon,menu,message-box,small-caption,status-bar".split(","),"fast,faster,slow,slower,x-fast,x-slow".split(","),["above","below","higher","level","lower"],["cursive","fantasy","monospace","sans-serif","serif"],["loud","silent","soft","x-loud","x-soft"],["no-repeat","repeat-x","repeat-y", -"round","space"],["blink","line-through","overline","underline"],["block","flex","grid","table"],["high","low","x-high","x-low"],["nowrap","pre","pre-line","pre-wrap"],["absolute","relative","static"],["alternate","alternate-reverse","reverse"],["border-box","content-box","padding-box"],["capitalize","lowercase","uppercase"],["child","female","male"],["=","opacity"],["backwards","forwards"],["bidi-override","embed"],["bottom","top"],["break-all","keep-all"],["clip","ellipsis"],["contain","cover"], -["continuous","digits"],["end","start"],["flat","preserve-3d"],["hide","show"],["horizontal","vertical"],["inside","outside"],["italic","oblique"],["left","right"],["ltr","rtl"],["no-content","no-display"],["paused","running"],["suppress","unrestricted"],["thick","thin"],[","],["/"],["all"],["always"],["auto"],["avoid"],["both"],["break-word"],["center"],["circle"],["code"],["collapse"],["contents"],["fixed"],["hidden"],["infinite"],["inset"],["invert"],["justify"],["list-item"],["local"],["medium"], -["mix"],["none"],["normal"],["once"],["repeat"],["scroll"],["separate"],["small-caps"],["spell-out"],["to"],["visible"]],L={animation:{cssPropBits:517,cssLitGroup:[J[10],J[24],J[29],J[45],J[48],J[54],J[63],J[71],J[72]],cssFns:["cubic-bezier()","steps()"]},"animation-delay":{cssPropBits:5,cssLitGroup:[J[48]],cssFns:[]},"animation-direction":{cssPropBits:0,cssLitGroup:[J[24],J[48],J[72]],cssFns:[]},"animation-duration":"animation-delay","animation-fill-mode":{cssPropBits:0,cssLitGroup:[J[29],J[48], -J[54],J[71]],cssFns:[]},"animation-iteration-count":{cssPropBits:5,cssLitGroup:[J[48],J[63]],cssFns:[]},"animation-name":{cssPropBits:512,cssLitGroup:[J[48],J[71]],cssFns:[]},"animation-play-state":{cssPropBits:0,cssLitGroup:[J[45],J[48]],cssFns:[]},"animation-timing-function":{cssPropBits:0,cssLitGroup:[J[10],J[48]],cssFns:["cubic-bezier()","steps()"]},appearance:{cssPropBits:0,cssLitGroup:[J[71]],cssFns:[]},azimuth:{cssPropBits:5,cssLitGroup:[J[7],J[42],J[56]],cssFns:[]},"backface-visibility":{cssPropBits:0, -cssLitGroup:[J[59],J[62],J[80]],cssFns:[]},background:{cssPropBits:23,cssLitGroup:[J[0],J[18],J[25],J[31],J[34],J[42],J[48],J[49],J[52],J[56],J[61],J[68],J[71],J[74],J[75]],cssFns:"image(),linear-gradient(),radial-gradient(),repeating-linear-gradient(),repeating-radial-gradient(),rgb(),rgba()".split(",")},"background-attachment":{cssPropBits:0,cssLitGroup:[J[48],J[61],J[68],J[75]],cssFns:[]},"background-color":{cssPropBits:2,cssLitGroup:[J[0]],cssFns:["rgb()","rgba()"]},"background-image":{cssPropBits:16, -cssLitGroup:[J[48],J[71]],cssFns:["image()","linear-gradient()","radial-gradient()","repeating-linear-gradient()","repeating-radial-gradient()"]},"background-position":{cssPropBits:5,cssLitGroup:[J[31],J[42],J[48],J[56]],cssFns:[]},"background-repeat":{cssPropBits:0,cssLitGroup:[J[18],J[48],J[74]],cssFns:[]},"background-size":{cssPropBits:5,cssLitGroup:[J[34],J[48],J[52]],cssFns:[]},border:{cssPropBits:7,cssLitGroup:[J[0],J[9],J[47],J[62],J[64],J[69],J[71]],cssFns:["rgb()","rgba()"]},"border-bottom":"border", -"border-bottom-color":"background-color","border-bottom-left-radius":{cssPropBits:5,cssFns:[]},"border-bottom-right-radius":"border-bottom-left-radius","border-bottom-style":{cssPropBits:0,cssLitGroup:[J[9],J[62],J[64],J[71]],cssFns:[]},"border-bottom-width":{cssPropBits:5,cssLitGroup:[J[47],J[69]],cssFns:[]},"border-collapse":{cssPropBits:0,cssLitGroup:[J[59],J[76]],cssFns:[]},"border-color":"background-color","border-left":"border","border-left-color":"background-color","border-left-style":"border-bottom-style", -"border-left-width":"border-bottom-width","border-radius":{cssPropBits:5,cssLitGroup:[J[49]],cssFns:[]},"border-right":"border","border-right-color":"background-color","border-right-style":"border-bottom-style","border-right-width":"border-bottom-width","border-spacing":"border-bottom-left-radius","border-style":"border-bottom-style","border-top":"border","border-top-color":"background-color","border-top-left-radius":"border-bottom-left-radius","border-top-right-radius":"border-bottom-left-radius", -"border-top-style":"border-bottom-style","border-top-width":"border-bottom-width","border-width":"border-bottom-width",bottom:{cssPropBits:5,cssLitGroup:[J[52]],cssFns:[]},box:{cssPropBits:0,cssLitGroup:[J[60],J[71],J[72]],cssFns:[]},"box-shadow":{cssPropBits:7,cssLitGroup:[J[0],J[48],J[64],J[71]],cssFns:["rgb()","rgba()"]},"box-sizing":{cssPropBits:0,cssLitGroup:[J[25]],cssFns:[]},"caption-side":{cssPropBits:0,cssLitGroup:[J[31]],cssFns:[]},clear:{cssPropBits:0,cssLitGroup:[J[42],J[54],J[71]],cssFns:[]}, -clip:{cssPropBits:0,cssLitGroup:[J[52]],cssFns:["rect()"]},color:"background-color",content:{cssPropBits:8,cssLitGroup:[J[71],J[72]],cssFns:[]},cue:{cssPropBits:16,cssLitGroup:[J[71]],cssFns:[]},"cue-after":"cue","cue-before":"cue",cursor:{cssPropBits:16,cssLitGroup:[J[1],J[48],J[52]],cssFns:[]},direction:{cssPropBits:0,cssLitGroup:[J[43]],cssFns:[]},display:{cssPropBits:0,cssLitGroup:[J[4],J[6],J[20],J[52],J[67],J[71]],cssFns:[]},"display-extras":{cssPropBits:0,cssLitGroup:[J[67],J[71]],cssFns:[]}, -"display-inside":{cssPropBits:0,cssLitGroup:[J[20],J[52]],cssFns:[]},"display-outside":{cssPropBits:0,cssLitGroup:[J[4],J[71]],cssFns:[]},elevation:{cssPropBits:5,cssLitGroup:[J[15]],cssFns:[]},"empty-cells":{cssPropBits:0,cssLitGroup:[J[38]],cssFns:[]},filter:{cssPropBits:0,cssFns:["alpha()"]},"float":{cssPropBits:0,cssLitGroup:[J[42],J[71]],cssFns:[]},font:{cssPropBits:73,cssLitGroup:[J[3],J[8],J[13],J[16],J[41],J[48],J[49],J[69],J[72],J[77]],cssFns:[]},"font-family":{cssPropBits:72,cssLitGroup:[J[16], -J[48]],cssFns:[]},"font-size":{cssPropBits:1,cssLitGroup:[J[8],J[69]],cssFns:[]},"font-stretch":{cssPropBits:0,cssLitGroup:[J[5],J[72]],cssFns:[]},"font-style":{cssPropBits:0,cssLitGroup:[J[41],J[72]],cssFns:[]},"font-variant":{cssPropBits:0,cssLitGroup:[J[72],J[77]],cssFns:[]},"font-weight":{cssPropBits:0,cssLitGroup:[J[3],J[72]],cssFns:[]},height:"bottom",left:"bottom","letter-spacing":{cssPropBits:5,cssLitGroup:[J[72]],cssFns:[]},"line-height":{cssPropBits:1,cssLitGroup:[J[72]],cssFns:[]},"list-style":{cssPropBits:16, -cssLitGroup:[J[2],J[40],J[57],J[71]],cssFns:["image()","linear-gradient()","radial-gradient()","repeating-linear-gradient()","repeating-radial-gradient()"]},"list-style-image":{cssPropBits:16,cssLitGroup:[J[71]],cssFns:["image()","linear-gradient()","radial-gradient()","repeating-linear-gradient()","repeating-radial-gradient()"]},"list-style-position":{cssPropBits:0,cssLitGroup:[J[40]],cssFns:[]},"list-style-type":{cssPropBits:0,cssLitGroup:[J[2],J[57],J[71]],cssFns:[]},margin:"bottom","margin-bottom":"bottom", -"margin-left":"bottom","margin-right":"bottom","margin-top":"bottom","max-height":{cssPropBits:1,cssLitGroup:[J[52],J[71]],cssFns:[]},"max-width":"max-height","min-height":{cssPropBits:1,cssLitGroup:[J[52]],cssFns:[]},"min-width":"min-height",opacity:{cssPropBits:1,cssFns:[]},outline:{cssPropBits:7,cssLitGroup:[J[0],J[9],J[47],J[62],J[64],J[65],J[69],J[71]],cssFns:["rgb()","rgba()"]},"outline-color":{cssPropBits:2,cssLitGroup:[J[0],J[65]],cssFns:["rgb()","rgba()"]},"outline-style":"border-bottom-style", -"outline-width":"border-bottom-width",overflow:{cssPropBits:0,cssLitGroup:[J[52],J[62],J[75],J[80]],cssFns:[]},"overflow-wrap":{cssPropBits:0,cssLitGroup:[J[55],J[72]],cssFns:[]},"overflow-x":{cssPropBits:0,cssLitGroup:[J[44],J[52],J[62],J[75],J[80]],cssFns:[]},"overflow-y":"overflow-x",padding:"opacity","padding-bottom":"opacity","padding-left":"opacity","padding-right":"opacity","padding-top":"opacity","page-break-after":{cssPropBits:0,cssLitGroup:[J[42],J[51],J[52],J[53]],cssFns:[]},"page-break-before":"page-break-after", -"page-break-inside":{cssPropBits:0,cssLitGroup:[J[52],J[53]],cssFns:[]},pause:"border-bottom-left-radius","pause-after":"border-bottom-left-radius","pause-before":"border-bottom-left-radius",perspective:{cssPropBits:5,cssLitGroup:[J[71]],cssFns:[]},"perspective-origin":{cssPropBits:5,cssLitGroup:[J[31],J[42],J[56]],cssFns:[]},pitch:{cssPropBits:5,cssLitGroup:[J[21],J[69]],cssFns:[]},"pitch-range":"border-bottom-left-radius","play-during":{cssPropBits:16,cssLitGroup:[J[52],J[70],J[71],J[74]],cssFns:[]}, -position:{cssPropBits:0,cssLitGroup:[J[23]],cssFns:[]},quotes:{cssPropBits:8,cssLitGroup:[J[71]],cssFns:[]},resize:{cssPropBits:0,cssLitGroup:[J[39],J[54],J[71]],cssFns:[]},richness:"border-bottom-left-radius",right:"bottom",speak:{cssPropBits:0,cssLitGroup:[J[71],J[72],J[78]],cssFns:[]},"speak-header":{cssPropBits:0,cssLitGroup:[J[51],J[73]],cssFns:[]},"speak-numeral":{cssPropBits:0,cssLitGroup:[J[35]],cssFns:[]},"speak-punctuation":{cssPropBits:0,cssLitGroup:[J[58],J[71]],cssFns:[]},"speech-rate":{cssPropBits:5, -cssLitGroup:[J[14],J[69]],cssFns:[]},stress:"border-bottom-left-radius","table-layout":{cssPropBits:0,cssLitGroup:[J[52],J[61]],cssFns:[]},"text-align":{cssPropBits:0,cssLitGroup:[J[42],J[56],J[66]],cssFns:[]},"text-decoration":{cssPropBits:0,cssLitGroup:[J[19],J[71]],cssFns:[]},"text-indent":"border-bottom-left-radius","text-overflow":{cssPropBits:8,cssLitGroup:[J[33]],cssFns:[]},"text-shadow":"box-shadow","text-transform":{cssPropBits:0,cssLitGroup:[J[26],J[71]],cssFns:[]},"text-wrap":{cssPropBits:0, -cssLitGroup:[J[46],J[71],J[72]],cssFns:[]},top:"bottom",transform:{cssPropBits:0,cssLitGroup:[J[71]],cssFns:"matrix(),perspective(),rotate(),rotate3d(),rotatex(),rotatey(),rotatez(),scale(),scale3d(),scalex(),scaley(),scalez(),skew(),skewx(),skewy(),translate(),translate3d(),translatex(),translatey(),translatez()".split(",")},"transform-origin":"perspective-origin","transform-style":{cssPropBits:0,cssLitGroup:[J[37]],cssFns:[]},transition:{cssPropBits:1029,cssLitGroup:[J[10],J[48],J[50],J[71]],cssFns:["cubic-bezier()", -"steps()"]},"transition-delay":"animation-delay","transition-duration":"animation-delay","transition-property":{cssPropBits:1024,cssLitGroup:[J[48],J[50]],cssFns:[]},"transition-timing-function":"animation-timing-function","unicode-bidi":{cssPropBits:0,cssLitGroup:[J[30],J[72]],cssFns:[]},"vertical-align":{cssPropBits:5,cssLitGroup:[J[12],J[31]],cssFns:[]},visibility:"backface-visibility","voice-family":{cssPropBits:8,cssLitGroup:[J[27],J[48]],cssFns:[]},volume:{cssPropBits:1,cssLitGroup:[J[17],J[69]], -cssFns:[]},"white-space":{cssPropBits:0,cssLitGroup:[J[22],J[72]],cssFns:[]},width:"min-height","word-break":{cssPropBits:0,cssLitGroup:[J[32],J[72]],cssFns:[]},"word-spacing":"letter-spacing","word-wrap":"overflow-wrap","z-index":"bottom",zoom:"line-height","cubic-bezier()":"animation-delay","steps()":{cssPropBits:5,cssLitGroup:[J[36],J[48]],cssFns:[]},"image()":{cssPropBits:18,cssLitGroup:[J[0],J[48]],cssFns:["rgb()","rgba()"]},"linear-gradient()":{cssPropBits:7,cssLitGroup:[J[0],J[31],J[42],J[48], -J[79]],cssFns:["rgb()","rgba()"]},"radial-gradient()":{cssPropBits:7,cssLitGroup:[J[0],J[11],J[31],J[42],J[48],J[56],J[57]],cssFns:["rgb()","rgba()"]},"repeating-linear-gradient()":"linear-gradient()","repeating-radial-gradient()":"radial-gradient()","rgb()":{cssPropBits:1,cssLitGroup:[J[48]],cssFns:[]},"rgba()":"rgb()","rect()":{cssPropBits:5,cssLitGroup:[J[48],J[52]],cssFns:[]},"alpha()":{cssPropBits:1,cssLitGroup:[J[28]],cssFns:[]},"matrix()":"animation-delay","perspective()":"border-bottom-left-radius", -"rotate()":"border-bottom-left-radius","rotate3d()":"animation-delay","rotatex()":"border-bottom-left-radius","rotatey()":"border-bottom-left-radius","rotatez()":"border-bottom-left-radius","scale()":"animation-delay","scale3d()":"animation-delay","scalex()":"border-bottom-left-radius","scaley()":"border-bottom-left-radius","scalez()":"border-bottom-left-radius","skew()":"animation-delay","skewx()":"border-bottom-left-radius","skewy()":"border-bottom-left-radius","translate()":"animation-delay","translate3d()":"animation-delay", -"translatex()":"border-bottom-left-radius","translatey()":"border-bottom-left-radius","translatez()":"border-bottom-left-radius"},O;for(O in L)"string"===typeof L[O]&&Object.hasOwnProperty.call(L,O)&&(L[O]=L[L[O]]);"undefined"!==typeof window&&(window.cssSchema=L);var U,X; -(function(){function g(a){var f=parseInt(a.substring(1),16);return 65535>10),56320+(f&1023))):f==f?String.fromCharCode(f):" ">a[1]?"":a[1]}function w(a,f){return'"'+a.replace(/[\u0000-\u001f\\\"<>]/g,f)+'"'}function M(a){return E[a]||(E[a]="\\"+a.charCodeAt(0).toString(16)+" ")}function x(a){return e[a]||(e[a]=("\u0010">a?"%0":"%")+a.charCodeAt(0).toString(16))}var E={"\\":"\\\\"},e={"\\":"%5c"},v=RegExp("\\uFEFF|U[+][0-9A-F?]{1,6}(?:-[0-9A-F]{1,6})?|url[(][\\t\\n\\f ]*(?:\"(?:'|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*\"|'(?:\"|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*'|(?:[\\t\\x21\\x23-\\x26\\x28-\\x5b\\x5d-\\x7e]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*)[\\t\\n\\f ]*[)]|(?!url[(])-?(?:[a-zA-Z_]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))(?:[a-zA-Z0-9_-]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*[(]|(?:@?-?(?:[a-zA-Z_]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))|#)(?:[a-zA-Z0-9_-]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*|\"(?:'|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*\"|'(?:\"|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*'|[-+]?(?:[0-9]+(?:[.][0-9]+)?|[.][0-9]+)(?:%|-?(?:[a-zA-Z_]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))(?:[a-zA-Z0-9_-]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*)?|<\!--|--\>|[\\t\\n\\f ]+|/(?:[*][^*]*[*]+(?:[^/][^*]*[*]+)*/|/[^\\n\\f]*)|[~|^$*]=|[^\"'\\\\/]|/(?![/*])","gi"), -b=RegExp("\\\\(?:(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff])|[\\n\\f])","g"),a=RegExp("^url\\([\\t\\n\\f ]*[\"']?|[\"']?[\\t\\n\\f ]*\\)$","gi");X=function(a){return a.replace(b,g)};U=function(b){for(var b=(""+b).replace(/\r\n?/g,"\n").match(v)||[],f=0,h=" ",d=0,y=b.length;d"==l||"<\!--"==l||"\ufeff"==l||32>=g?" ": -/url\(/i.test(l)?"url("+w(l.replace(a,""),x)+")":l;if(h!=l||" "!=l)b[f++]=h=l}b.length=f;return b}})();"undefined"!==typeof window&&(window.lexCss=U,window.decodeCss=X);var Y=function(){function g(d){d=(""+d).match(k);return!d?s:new e(v(d[1]),v(d[2]),v(d[3]),v(d[4]),v(d[5]),v(d[6]),v(d[7]))}function w(d,a){return"string"==typeof d?encodeURI(d).replace(a,M):s}function M(d){d=d.charCodeAt(0);return"%"+"0123456789ABCDEF".charAt(d>>4&15)+"0123456789ABCDEF".charAt(d&15)}function x(d){if(d===s)return s;for(var d=d.replace(/(^|\/)\.(?:\/|$)/g,"$1").replace(/\/{2,}/g,"/"),a=b,h;(h=d.replace(a,"$1"))!=d;d=h);return d}function E(d,h){var b=d.T(),f=h.K();f?b.ga(h.j):f=h.X(); -f?b.da(h.n):f=h.Y();f?b.ea(h.k):f=h.$();var g=h.g,k=x(g);if(f)b.ca(h.V()),k=k&&k.replace(a,"");else if(f=!!g){if(47!==k.charCodeAt(0))var k=x(b.g||"").replace(a,""),e=k.lastIndexOf("/")+1,k=x((e?k.substring(0,e):"")+x(g)).replace(a,"")}else k=k&&k.replace(a,""),k!==g&&b.G(k);f?b.G(k):f=h.aa();f?b.O(h.l):f=h.Z();f&&b.fa(h.o);return b}function e(d,a,h,f,b,g,k){this.j=d;this.n=a;this.k=h;this.h=f;this.g=b;this.l=g;this.o=k}function v(d){return"string"==typeof d&&0]/g,v={"\n":"%0a","\u000c":"%0c","\r":"%0d",'"':"%22","'":"%27","(":"%28",")":"%29","*":"%2a","<":"%3c",">":"%3e"}, -b=/^(?:([^:/?# ]+):)?/,a=/^(?:https?|mailto|data)$/i;aa=function(){var a={};return function y(f,b,k,e,N){var f=E(f),u=L[f];if(!u||"object"!==typeof u)b.length=0;else{for(var i=u.cssPropBits,q=i&80,B=i&1536,F=NaN,r=0,o=0;r=I)j=i&1?j:"";else if(R=j.charCodeAt(1),v=j.charCodeAt(2),P=48<=R&&57>=R,S=48<=v&&57>=v,43===I&&(P||46===R&&S))j=i&1?(P?"":"0")+j.substring(1):"";else if(45===I&&(P||46===R&&S))j=i&4?(P?"-":"-0")+j.substring(1):i&1?"0":"";else if(46===I&&P)j=i&1?"0"+j:"";else if('url("'===j.substring(0,5))j=k&&i&16?g(x(M(e,b[r].substring(5,j.length-2)),f,k)): -"";else if("("===j.charAt(j.length-1))a:{D=b;G=r;j=1;K=G+1;for(I=D.length;K"]= -f["+"]=f["~"]=f;ba=function(a,d,b){function g(i,r){function o(b,f,g){var y,e,i,l,o,m=n;y="";if(bh&&" "===b[e-1]&&--e;f.startAtrule&&f.startAtrule(b[d].toLowerCase(),b.slice(h,e));a="{"===b[a]?w(b,a,g,f):a+1;f.endAtrule&&f.endAtrule()}return a}function w(b,a,k,f){++a;for(f.startBlock&&f.startBlock();ad)return d=~d,d===h?d+1:d;var y=b[d];if("{"!==y)return d===h?d+1:d;a=d+1;d>h&&" "===b[d-1]&&--d;for(f.startRuleset&&f.startRuleset(b.slice(h,d));ad)d=~d;else{for(var e=[],l=0,w=a;w])/g;f=b+"";if(G)f=f.split(H);else{for(var e=[],h=0,j;(j=H.exec(f))!==s;)e.push(f.substring(h,j.index)),e.push(j[0]),h=j.index+j[0].length;e.push(f.substring(h));f=e}a(d,f,0,{r:C,C:C},g)}}function b(b,d,g,f,t){return function(){a(b,d,g,f,t)}}function a(a,d,p,e,t){try{a.H&&0==p&&a.H(t);for(var h, -z,j,i=d.length;p"===d[p+1])p+=2,j=h[1].toLowerCase(),a.t&&a.t(j,t,A,b(a,d,p,e,t));else{var m=d,q=p,r=a,u=t,v=A,y=e,w=f(m,q);w?(r.t&&r.t(w.name,u,v,b(r,m,q,y,u)),p=w.next):p=m.length}else a.e&&a.e("</",t,A,b(a,d,p,e,t));break;case "<":if(h=/^([-\w:]+)\s*\/?/.exec(l))if(h[0].length===l.length&& -">"===d[p+1]){p+=2;j=h[1].toLowerCase();a.w&&a.w(j,[],t,A,b(a,d,p,e,t));var B=g.f[j];B&K&&(p=k(d,{name:j,next:p,c:B},a,t,A,e))}else{var m=d,q=a,r=t,u=A,v=e,x=f(m,p);x?(q.w&&q.w(x.name,x.R,r,u,b(q,m,x.next,v,r)),p=x.c&K?k(m,x,q,r,u,v):x.next):p=m.length}else a.e&&a.e("<",t,A,b(a,d,p,e,t));break;case "<\!--":if(!e.C){for(z=p+1;z"===d[z]&&/--$/.test(d[z-1]));z++);if(z"!==d[z];z++);z"!==d[z];z++);z":a.e&&a.e(">",t,A,b(a,d,p,e,t));break;case "":break;default:a.e&&a.e(o,t,A,b(a,d,p,e,t))}}a.B&&a.B(t)}catch(E){if(E!==A)throw E;}}function k(a,d,f,h,t,j){var z=a.length;T.hasOwnProperty(d.name)|| -(T[d.name]=RegExp("^"+d.name+"(?:[\\s\\/]|$)","i"));for(var i=T[d.name],k=d.next,l=d.next+1;l"!==a[h];h++)e+=a[h];if(!(j<=h)){for(var l=[];""!== -e;)if(d=ja.exec(e))if(d[4]&&!d[5]||d[6]&&!d[7]){for(var d=d[4]||d[6],i=C,e=[e,a[h++]];h"===a[h])break}else 0<=a[h].indexOf(d)&&(i=n);e.push(a[h])}if(j<=h)break;e=e.join("")}else{var i=d[1].toLowerCase(),k;if(d[2]){k=d[3];var m=k.charCodeAt(0);if(34===m||39===m)k=k.substr(1,k.length-2);k=x(k.replace(o,""))}else k="";l.push(i,k);e=e.substr(d[0].length)}else e=e.replace(/^[\s\S][^a-z\s]*/,"");f.R=l;f.next=h+1;return f}}function h(a){function b(a,d){f||d.push(a)}var d,f;return v({startDoc:function(){d= -[];f=C},startTag:function(b,e,h){if(!f&&g.f.hasOwnProperty(b)){var j=g.f[b];if(!(j&g.c.FOLDABLE)){var k=a(b,e);if(k){if("object"!==typeof k)throw Error("tagPolicy did not return object (old API?)");if("attribs"in k)e=k.attribs;else throw Error("tagPolicy gave no attribs");var i;"tagName"in k?(i=k.tagName,k=g.f[i]):(i=b,k=j);if(j&g.c.OPTIONAL_ENDTAG){var l=d[d.length-1];l&&l.D===b&&(l.v!==i||b!==i)&&h.push("")}j&g.c.EMPTY||d.push({D:b,v:i});h.push("<",i);b=0;for(l=e.length;b");j&g.c.EMPTY&&!(k&g.c.EMPTY)&&h.push("")}else f=!(j&g.c.EMPTY)}}},endTag:function(a,b){if(f)f=C;else if(g.f.hasOwnProperty(a)){var e=g.f[a];if(!(e&(g.c.EMPTY|g.c.FOLDABLE))){if(e&g.c.OPTIONAL_ENDTAG)for(e=d.length;0<=--e;){var h=d[e].D;if(h===a)break;if(!(g.f[h]&g.c.OPTIONAL_ENDTAG))return}else for(e=d.length;0<=--e&&d[e].D!==a;);if(!(0>e)){for(h=d.length;--h>e;){var j=d[h].v;g.f[j]&g.c.OPTIONAL_ENDTAG||b.push("")}e< -d.length&&(a=d[e].v);d.length=e;b.push("")}}}},pcdata:b,rcdata:b,cdata:b,endDoc:function(a){for(;d.length;d.length--)a.push("")}})}function d(a,b,d,f,e){if(!e)return s;try{var g=Y.parse(""+a);if(g&&(!g.K()||ka.test(g.W()))){var h=e(g,b,d,f);return h?h.toString():s}}catch(j){}return s}function y(a,b,d,f,e){d||a(b+" removed",{S:"removed",tagName:b});if(f!==e){var g="changed";f&&!e?g="removed":!f&&e&&(g="added");a(b+"."+d+" "+g,{S:g,tagName:b,la:d,oldValue:f,newValue:e})}} -function l(a,b,d){b=b+"::"+d;if(a.hasOwnProperty(b))return a[b];b="*::"+d;if(a.hasOwnProperty(b))return a[b]}function V(a,b,f,e,h){for(var j=0;j",GT:">",amp:"&",AMP:"&",quot:'"',apos:"'",nbsp:"\u00a0"},q=/^#(\d+)$/,B=/^#x([0-9A-Fa-f]+)$/,F=/^[A-Za-z][A-za-z0-9]+$/,r="undefined"!==typeof window&& -window.document?window.document.createElement("textarea"):s,o=/\0/g,j=/&(#[0-9]+|#[xX][0-9A-Fa-f]+|\w+);/g,I=/^(#[0-9]+|#[xX][0-9A-Fa-f]+|\w+);/,R=/&/g,ia=/&([^a-z#]|#(?:[^0-9x]|x(?:[^0-9a-f]|$)|$)|$)/gi,P=/[<]/g,S=/>/g,D=/\"/g,ja=/^\s*([-.:\w]+)(?:\s*(=)\s*((")[^"]*("|$)|(')[^']*('|$)|(?=[a-z][-\w]*\s*=)|[^"'\s]*))?/i,G=3==="a,b".split(/(,)/).length,K=g.c.CDATA|g.c.RCDATA,A={},T={},ka=/^(?:https?|mailto|data)$/i,m={};m.pa=m.escapeAttrib=E;m.ra=m.makeHtmlSanitizer=h;m.sa=m.makeSaxParser=v;m.ta=m.makeTagPolicy= -ea;m.wa=m.normalizeRCData=e;m.xa=m.sanitize=function(a,b,d,e){return Q(a,ea(b,d,e))};m.ya=m.sanitizeAttribs=V;m.za=m.sanitizeWithPolicy=Q;m.Ba=m.unescapeEntities=x;return m}($),la=ha.sanitize;"undefined"!==typeof window&&(window.html=ha,window.html_sanitize=la);})(); \ No newline at end of file diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/arrows.xml b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/arrows.xml deleted file mode 100644 index 5e39b3c1..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/arrows.xml +++ /dev/null @@ -1,849 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/basic.xml b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/basic.xml deleted file mode 100644 index fe866c85..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/basic.xml +++ /dev/null @@ -1,895 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/bpmn.xml b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/bpmn.xml deleted file mode 100644 index af8918d9..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/bpmn.xml +++ /dev/null @@ -1,1162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Credit_Card_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Credit_Card_128x128.png deleted file mode 100644 index d280580ccdf91869d0c6ca475dd2d11cc4e8b0e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15493 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 Hu0mjfxJow< diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Database_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Database_128x128.png deleted file mode 100644 index 4add7147c6a58e0cd988aa024aeb72c05840ffea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10455 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 diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Doctor1_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Doctor1_128x128.png deleted file mode 100644 index d5a4bb7b40807c6b36fc676113d5bdbc3072cb39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9441 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 diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Email_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Email_128x128.png deleted file mode 100644 index af81e0ba44cdbbda4e2289df0918610312eafdc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7410 zcmVOV8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H19Dhkf zK~#9!?VWjyWLI^@!7&b44k0K4A%v7gkUt=cl1L#DNd7URAxSuBz#t zsXvZud+w=vzx#df+$8Ho=V)g5m~(UPl&yUozbQ1_wsv{6LW_}X#VQwLJL<9 z1m~~%gY#G3#cRTA3NKvaM_mQ_9T4Mlm%k90yL>b-dwJYHd+A;O%q7Be5%`RPb5{uP ziQ)UE7k^iQz6JwOzvP=)I^msO3VEg$Z@MQJ36JERS|Yp$un2&U!=GdL5_ng1cG)|% za9`y_uJZ6sEq)bH&$uQQqK@eNEk|UI@JLRMiFv~NCOpy@!WNzt;fP4k9SZO+1^5_zrRr^=savk- z+(#?WZ*u_Hy#V)30ImhtX;WZo+324nQ-EWN%;QsJ4bDi=0o#rklfmQv5#fl=Wmdgx z`7V40=)JLjw{r5!7=UyifPDuL8vu27)Eiyadm=RAjS`-d!8bt+-ORv)Q)FS4Bh2H| z@#m?k7vL3^pHTgR0Pl#*lF1k0_y48>y$k_Wz8^|`6pC#b^-atVx&A^RNIlnger3Ro>y(JD`0-sR*tg7nm;Taln2l>4lXcYHWpqC(^#0LQ9 zM*!A7?2at<*~h8R7NCAS4mido(C)CLY``|)k)P{5VPeHARX@t$W#vooCGc8R&z}$4 z{o*y=H!8np1=b1z5IzVX|D*RryL67=rEaT_x-35G9rFv=NuU`j9*5mfx-&>Rgi`gx z;xie%Cz=djR=qKx247aa44<$2{CTg{jq7;4LF}(UFEDW8KMWX808(GCEpWNrQ>0^0TU5J<-$S^V&XxPA4lT?H8@@-K0sHvpU&Dt^0u&`L4T zZ3ZWGn>@m@2N(iunxV7Gn}+RFKV+i@L?fPaH0d4G%n=8VFi7wje4DE3RV+Ur)u$$U zfX?rq@7CkJa6Hpz7cj_;0>_-ZtDxg#eX8Fccoiqx1}HZg0Jv$`2FNyQ8+9NFb5kDx z46xb&n_sh~*XhQnX2625QmxJ^Ue^td#lbfW+hp)Ed{x!Ek}W^0>iyXhy(HBqx_59Y zI@>WQ9y!C8AqyuMiFXI1Pu$VaaY8NddWG`gTJFAd-X4{}D0 z$4&s@Mo`^nrgOa}I?sXU{Q5$_g)Rv276D$sXYdO6>8h9DXIH%^v+BoERiD}N`Sr=x zesNqnXsJQ`&OtIu%TE0#>r*%4mkp(cZI}txeM>H zmDd0$LzcowRXtLi;}GCY0(^D91YcG4h}^1os;l0lrg|-jUMSuTJlfnVeos1N0a`Q+ zZXjqVf3l{bk9s1Xg_RvZ)*Qg~_T3I6XVq>AFjPDUz#{-Wit8Jzxd$he?V6!6z-n2= z3{^xNyh#9$!%tIv0)Fj4F4f!9RX>`l`g{_-ptM_KN*-gC`RxkiVxq8^1ffE>XSBCK%$B2_$HxN^&6vC?eC3p$= zD&W;r-(W0qbl&K*hBSLzrfCOE}oFIn!>1o%2br8?;IxUw=iU!A}LBkLpcnsxM!n z7Z8toF0|ph8HCyybPTf2kpLY_1m#BZ+^U0a3`~3(mR&XM3Qp?m{#yfp$dd%a4nF_~ zq2MrC0~2IHX3DnB*J$oqH4e)scW6vReavbV;1lq*sNNh0e_loP>Xu)sL@&L2*KP6B zuJf&QvTaB-0HvC_0mMPuBsXApkQ>TZZYy+iVDcVQVB$feH(H~2ho%P|{#ydD6W3v= z*ysrXZj@}}lL9iUdH{W8?k6|vW2&)NQTgRvFv5ZfC!{m=PAhDVS++_jSHBJVo*o=w& zF{s#%Vu7*o36Xq3?fBs?oD7FZz@$K8#G$uqf?q$BUG+)u`&VlDDv6%17>Qn@d-wX; zW_qKxlQ3c!hn%8j5i(?o&Gf-3<}$GR#*kMt@^r*s$W5(*Oz~y*EF2Fd&jZuOfyv8 zDjIbvP`XY-4PiWcT0btm)8QHWA>Se&L z@HE+iTn!QtkUNoqGw5~>qZDmM34AjA1o(>us$K~{r|L_P=xOQRWwQLOXPRis=_a_5 zIn}b`kh^5a5@^XC+T}o_*|=ipD82arit8SSn!C;Z=q12iHbJdsUl=wWB|9K9U^hy1 z*s@Ik&wb@Cbg_64p$o7(<>0AFDH7l%_|9bbnpJNX;F}6jeGwA9Ox?Tu6Fmw1*3-?j z;b<+L?J}fVcCwlkklST<;E)~T;k=T4*@ri2;m%|1XJAzPgXqr6H z8S-!u9-ebwdC190g-?nxE)(*KNCI#5B*QmnhM!gSDVCp~>I+NsE)*@%vuH~682GRD zoIec_(H88pZVt z8Hw0160-qh*sI+TuYRjJJCAxPEeBJirw7;%L{KgEH zEkjNQ%{c)FJB5g0dw;e|^?N$>)@6e$AXMxFWG^5)ac$*PoRpAo(U zzBildv%p_$Zi^aejE)IKa}04{;ABvQ1YegGzAphkFV%Yz;LW*Jzxoor!pHF$_~V=Qp+DX# z{>?0wtqNIymM;-}sgN4**!QwRpIE$Z?>5>|OyGvHgYk&LkAWXjfLE$s=g^{h--=Y< zkyG_+CDBXn-ZAjU*6*e*r<%p<9G0CCvJ6^WF68g~x7n4xcx|5x1@R4iBT3Np8B{-1 zY}MyT^g7C&=nWPr(d*3)f7{uM^t~5$&@0Cq=xpbx7Rydmvl6n%6Xfr81K;a?S)oVf zuYNv)oeElXW~%Ge3#ggk4<%WCcGVY}=yjDL(JSdVz6Q(RR@F-1dUhMVe54LtvmvdP zErYhEfsXYK2UU0I1iUox?(C{BNup;iPNKJ(#_@Mlx6>of zY@wG9)zG2F{xmgbvFrq7h0DbLElw2Wf8&5w=o1W`m$(i9N>y7wzvJV~*;HS~ zL~pf@s{=B_mGZUwxSnHRxv zSM6+DAGPYO0Onhf>Q_giSL*Iv?t+bd^*!|9lbh)IedlTC`Hp-oJ1JL)T`rR5`x7IA z|Ev-EYSC3+)J&y(xL!f8FH?3n2t1b(ay7tw7aSa4WgUs;SN3M^XI4f%!%G=8^_Nl(L3Hc2!(H; zUjjIH%@|x<&G}h&7SM{ypMLYHyr2i?E)R>nN#q6Yv1P8j>e1+z;Bx_9H&51^q~$&r zxo^q#haX;pFL1I|NBe6!XzR&3di7{Ey;0plXWMnuI${&Bi`~5|={Wuh6TMUI!@|;^ z*>xJzq;+(O}1a)0|s$1#RV>R^RzSH#Di5fcG&`EVzY{wwATmIS_ z$3NYr7YcuR=PBC2eQ`7Zt(JW*1+t2olg0%SlQ<&2kQa2{?BXXmnUj{ePRAh&(1{h0 z$!n$%yuyO*zZX>1YdFpst&Cpyq4Skqh+fu4DAV z-jlQwmxa@CgLaG&l&*VMzJiS^H24Rf+(=LDI6>OIkA(UunUmxxA#e8G{b2e6~6PzF8;ciVrsQ ziYdfB)qE*vqVnzL-?&l zuHN9gr44PtdBgIukN9@nxx z{Pbp8_xf>R=?BnFE0Sd=AP*!#PK1<8)D{HYJH2?Ax1x$c9?1eZ+j5#51^6PkK!6jU zvuFgYeg?n$LMMv)I{?3(wqtzyb@XXBAqjfnjk8eC5&GeaJL&P4chgG;tKbHmaFVgx zUa-O7>jo|KjbCo2Cjflou?E^#*PBz#d02KjXgOi57ZJ}Tep3*1&&0xi`KK>sTLGDA z%~U=G_-Q4(9IZI%{DU|T;6@RqtlM^k9({2KefQbd z;0lM)KpMs3{Bn=ubI;{lzutoHbBs2hXrjHyTZ(AeNuX08i!P%gpZID)(B&c7n;BL> zCaXCGvc>{@&DES@A);smk`wI0^?%!$RssJt%s=xS^s6|@o1iSI5get*-~^96wGofo z>BR$8=solRo}*+18*J;}d2TEH0{=FDpS?BRE3#}2YEDWTIU0xJdBw*Ih8~!?G|SeW z)w1pCmaU-xKc8yOv|<9Dj5yQ9PB0)Y1+R$)(1MXJsR3+0(MYc#xSEue_k)*q(SuK{ zr-#uH*1-*SR5jyon2R!w&no}^3)|@zuN@VQaZhcRPaM96aQ?`Ggefkyt&s z{RI7B{a$)--OKdlpZ-Q%8eTqJjqc(gzGr^jyNie)tluR@+Nyd?R6A%Vy$|Qi6{QX= zHf+Fm)oR&kpog-mIR;q@?m?f#A;{@zWk3UD>#N)5_oIsDFOI)wBS^keU?4h5d zkdb>H2Qeqk-=_(`qXXwd=Zw&(AETJ#b0Q3Z8S!2RhOhZ|==hvpG;qCt$JF$_4u;v8pzEJBf3esaaoJ(Kf> zVJsb1O~48-z%R_Qm1@>7GgZhiXRIL{m4}OcQ}dWj^kU2$jiY6d4qzZ@F9wn}ooEoS z4>b>nzgwHKDm7p5u`NfGyH4~Ymm0?ShzYJ>3D1*-8-!>K(-`o=6gP5@80=ON&TGgs z-n(Mx*hzS^6=UwHmYoE;0L#``&8cqL>ZL(N9p>ck43iVimb@8(NsOtV>KLKpm`ga@ zZB$*Nln?mSy=IcO8&U2lCvPys-Dm?`fg8eDWRa}l1>q3=wsCvDD~?s)H2J4L1GSgI zvaQ9j>>>dMp%ixmn6Z^|EhY!^x8_Ms?nStts0slUE-qt)OlW&wU) zmVK^#GgD$Tkb(2>O)p)}6TI3od~#Gi$SKW63Q$*Dxn6{B96>($E(zEvIk za;L@9h3@0Wiv?Q~bQDN-a`kIomff>5%f3*;nJFW-Oo=XB5o6ow3lmEPek@<`%YZ(B zaEJPFqsJ`Yr%Jth zXZBr~9sZAC0mO1~ExR=H%-Lq9uu~QVW)_nwS4$24LLT5TjB3J!&Zo<@Woym@a9zL7 zKe8Ns=4_=w8jA_iW~Mw?z~RN{qFTvv$-wt%1CLQa8>VajuG||j=iV7IIAdk&DZ6D4 z7F0}-6oF|h$ixP61*_lD77ZY$f)6~*6(KXAoE-elGkOuGr zg@MQaH-UfatE&ZeUeI09xp32ny_D6Q`KdX%YD5$ha7F73hE)yNh*%UaW?7J!wjM1L zc%26DDuYxweg=R0q1AeC9E}_HPgn7Pe+jEO^C=BVRE@~hsa(=LcjZm2$O);}sTT;o zE>G|{eje-hzP(yu=LOy5oqWWM)vC9{vQtWf;-F(C$-J6n?&@1&E0p%sI`vH8^~C`n zn_$BESi;|XbhX3I@0uQ+y$}7}o8`7_C1fRNQHl(}eB0`I0O#GUl1i1!1Rlp+!QcDo zT7jMSCjUt07Mm2=ZmBIh39<}Y33dQ?iC6$|-q=8OfkFoGEm^=fY6Oo)ehm%i$+ZSM zZ|L^WOfPRdkiTWyHCwitn%h%?;qrz?44gMG$hri%$l&q*oB02qU8}J3hHf68c$z0) zR$|!~3xu2qw@B9Jue~L9t4LamSVHi4|84yLFRyjjc|*7Q!XM+wmx2;7jg~DU1u_Q% zWw0jnzd32+-6>R8p{jsyTLF0dz8lz3X$$_&J$DN5yr6S0zD>8Vz{$0D#xf93#!JP!VAm|vRvGYQJ{4Cp<)3Q?`$3TmX1OOGc0}}%; ztnl7U8wwTyJR0opai``3_SnX=g09gez2g3}{U!u_LQs$i`3k2V3cHP3~O*r;X??%`KLw81IYKF0vN=pLP zr4e!>e8SEH(+g>v2d@M?zSA;3Ysc{)y_;bd3>|k*{;n1GQq`*FG{`ET#mSCpT^enCbQ)*}p<#Re@V% z=vc-)I1DJcEW6L94!U24$B-AUzb$U_sdfXvYMf>zyBSfybr6fzST20<*->$0AdI4z+7ivod%?e}*>V4b#$_ z?-1_hoZ&WL<2k^KzvIDs|5AZiCg}2Y{km4j$}svOv~>L)+)Q9X6?jhY&hY?Vf4&0m zc0iw6a1Zj{v1y=_A+tJTz|6RFGb`K_h-L+z0el3HU#dX6jnLiExdU7*nW|vS5=nLlqd=~MI3Zzv8 zox?x9cq0k240>1*PAn7Vez?J_8TbO?yA?RA6nbE4agw`O$)Kfsu`)m&VVl4DCT`&w z(gOPu;)fL|s~kGU$s5i7r~sV`(T6egSq!a?u6D@) z`yIq4#Ct0zevLy%2Cp|_c`y&W@XApY*f$Vc5qD%c@m&cWWAHEA&<~$lx=QwN(&WkS z5ql8#R!;OC20b{p_^(j=G7rAUu-`=-Li}On1mB_1Ic6_kyNXPn6S@OV8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H1A1X;i zK~#9!?R{x@9A}m8IbT(GRqxs@JBdva42mIZR6d%a@A-ots|XDRR}UtZz$m6!H8WXZuHosk6Tdk|Mu zU5!M0w3u=#uBd<3HEmDD#=R%=z|Vr!^xO5n_m&keO(Tmev>8ZXP6z3yB4{y1iw%cb zV?)E6DmLyto(Fy=M*AzPZVJpTJ5B^*MtoEfpbaV5Lup*618o;>tk}4>HV^y^TP<&H zJ|_qK^8qO!PzFOZe>~Ge*^!|CeEX7$4SWBX2Yv>vQ@>jCb>H0bp8?P$ur!G|WuUXk z0v2ANDcB7X^q=ooQ?X(1-aPO#V4Zk*#Rqwc0F(naI}%uX z+YR+{AaFepBQ<9#*N~*{B?(~4^P`bqpuO|!6&v>cJP-U#DBs?^XVB?(`MK1LCIXlN z#?;=AfS_BB$s`H~J1%~!V#Dh{$pb$Vl>9qijtinlEc-K>_IeWujAJPvnh3x?pLx#U zg^OD%zVP}F^1x5?s(W$yB5!&5i8Po=MbD9djbbwi&|2w{q!zFv!BA)SQy>4r>ks9D zpKe9Jd)0%k($XjGd>1yx5$!=|ojWrD5OhG(gWW{8|?WR2N)4WdpYVBKcVc{~) zf<;qGXR-hbu-T+Zr2F)zPaZ+j(VrrL5(*Egk!Yo+sC#uSzVrHf-WtdQKh?nhdVRCx z^wE@)qlrHmZ*-_Tt8A*%_fDbrK_^#OqD6qImyP>U)xnyT*AHEq}Ro8Rio13%d{ z{N7E&qAYtDc)^|oG#TMZK#||O3EI@}W&(iW1z27`B@-zHB^(*lqOsbzqQ0SP+V(}W zj0m#=_@=kNs3Q^Vd{>SHh*qVJNkW+SepVFPnRw~wH){f$egFjuYA6!aqR~1{QQy$D z`1VDc-|Wo;KY>-VYuVqrN=x^%sy$QvodU(W|EF-r^xn>zIEaj?!vJo01T?J&Mk4`W zA|q(w$dDR|)oF_IhOWhTEZY2LcOLk$lyWbvcuFcP{w~;RY<1ZCkYY&5L>9M*@EL>i3=gz%7~l`E;sA zQ&cls0TLSmFkC@XDnZU8pui7uP_UMj*^>YhJODKk8CE0FdQDN^P7!MAQ zON1E@{E6Rej0#StWb@Wdk!oYwpj8hbOB&=;JHHix&A1k2Dg!W)Aal=PG!j@eOQLEB zsgc-;xT^d?SGDJ_+w^8fPJwTE?{R^+-A(FH&(9YwetJeVCXW8>zl+}a3sgQz%nf%_ z1QF{ooM~ed`3ML`*Dv{B0_i>8VgjXKhjOH_IEC461sQq8Q+Z4-|8x?kVj=$n7z$3$nLrVjVjs==OnKX&I&rhVYBdix!BO2s8_n~=7Ap_nPn zngJ(h0?wTJnaY669H!|W4s@{S0rPvD7zykLNz_OrtcD|}G)4VGf(UP%8#D07x87FZ zDDYnpB&W;iDF?Z5A%IRovB3+!A>jOnYi`-1ObhV4mOtYx2;2{p|MDo<&C9W%m~Nw; zr_Yp!XtIG*r5swYu!(vm<)6QE5#)kvLGoTj)#y-1Y@l^`JKdcIV#S|39+ znLMV{Zr&a;IeTcX|1Dbqm`IR$JF;w76Q~SE8!1!5k*FGpHfl=jo#vLlhb^kUdiTl` z4!?I%N>s2UKtyo*t^&E>TA-R9jP`fzSa{nH{+WG#+lRj_*W#hQdR+g1*M9!n6B<~o zdu_c!M2CagL!F=k!U#&)&XYGqeyXZNwAj9AQTS-Jb!~B^b{QEm4tm;c1tU081MS#t4%3Y57^fru_}6)psad#LtQgF!gGz3R;JQ{uaqqjY>i_;n}EUy&Y-kT`nZ`*igOaxKOH*VoQCXYijI&Z|J z2U62KNDS3a?DlR23kU0zFvNF)(6pkKf*m>6@`@TG)Wm~yp>1U;q z;tx_Ko(1S^NdTGu2BH8C&lMm#OCnUqDt&0^+aJC2@dGt4uj(a|TudngY*NipR(Pgu z&XFUESI0>uo+1G2&!?j*k?V=&HTcQ^5o}#I!{29lNi$$%vp?Hy1tU}jI6~G-efIYD ze&{;eb=}H`_BD*^)mOc=;svRw@b5B%NOML4BFNzM&Icm;2IJA7FFJ6R=y4?-+LYQw z`-nD$_53(C!jl9r>i~lYgaeO_YNO-F^aPOF%=l$U_h}N~_((90%HZ^=3$dHO_O_gL zlcsjh`X15aF0q1W1MrwgkeLXA6ac5^BY^0H*ziSA2G0YfdgAHG{V8)LoZ!pW~k$2|Bxi(0Qiwrj-xvuO1Wd006bW+1M|-T?O_)WxKCa4(RccfQT+| zdani)eV~Q=AbhD65_-UXG|Fnfnua#)QafhI3MP=b^3Z0650P>zkFakq{W+f;7 z=~yZQ1c0W~UCPa0`@LlA)sGtWyO!T0mzBL}KtW-0NH8{WD9T0P@GJlT2Sf%hK&(Hh z2P_$n>&#f%v;2LNzmEVUy{|JWpB>61rq^IVv5t2!#YZ1B595Qvj z;p&0a5MmuaM&%<~@w4>wsm(NRHXi;cB%l=F*rDcMuYF|y`f&qaxpVoa<+8FvNQf;6 z)TY*lF_(E0_X?0W!0B56g0mR3Xb3{R&7j4GY?VF-s@b67N<8HEct!*ot{}B+Bj);_ zAK#{&>5~W=YCAYOzD5p0ckeKCv~>OLs)zS~IBwtp0BT-YcfeU#_?gi_pc%y7RFi-> zJmBn#h5@$27H$r95 z($uZqeBU3O8T;{Li2AuwNm)A)1(GcYxgo*C4I|N20#45Y01zSE-wu)f^8i%mCUf~3 z-Ky$YGsn2k6Nq;M&4V817A`Vbz~ok$Qa_F~VxEBn4fP%8mwe;>1rr87(YIgwl2lx> zd2AqNDCfrb{9G7DhzL&al_0vVfVieYsJ9hjL*2ZRH#KUAQL`ofN0N{Q&Fm#fKq=S_a%Qw|Gl;^)M2+k5vBS9GMX@zb^EGE4!oBW-~j-tUR<+9E}QfCXdq;3_|OSHKNlnroIa3z*8mD0hy}YL zbg2dOxSHs(n`?aJQ@cS72;shS5FKbwTtf$uo8eDs0JL-Z z%p@>*28L*)HsF~r++Z#BMk7H}Ls$Fl|NQ<{IS0P#h1Kg^<@5Gfz?xDLOs-deNWkfv z4+Gsp5F2a*+3f^CH1=+DnP(A%JPC-ov11zFMqn}l8cH9jQ3~4m@pdFQS#$n(%f7R3 zb9UH_zt*Bkq_|4=L~5*^r>OcR2p3FTN?-b}Vys z(qzr68~-E~m3%&1aYnPO)yGbP$v2E*5fwU`yP^EbVn*Z{=^hDi(>)g8IeoxDMNFq| zgY~j3X#q&7rB`FVE`L{hf7fU3eRuAp0$;gnWr<;p z*ou#FkzhP!;?x;Nr>omw?v+JA2&?Q9NE2I|*G>rX(>&&jHt_p4H3@ghP4k%T+mp5J z|GMJA1K*r<;462o5T&A$pdhE;_uvGW$8$EJ-jznU<3>F-NW;)hRU9o`dpvg^Y`bX@N&l^*d+f zCP2oFgPnXM$8-@dL-3jFdP>vvf7{th-8cW^f6SRu;H!46T;`fH?=91{NMFe z`-WktHwa$8D;ebski-C-tLc$%?x0EZ0W0`P z0|3;%w(*2BP_QUFfbEVk--2sKg9za42 zFbMzwk^nfPxnphm04Bv9+FX4DO<8~=B!x?T5$JBa^odp9J5)F2zyko(>|Xb-R9w7x z`~YWr%*^l#TI$Y&-!FkE5+ZHTfhFEV%L?R@(jMZF#M}Tpvq_-DRA{L?17&jp>Ajv{qAo*=vNzTGshK@u-^pVqZwPm7 zUVc&sfkJCjPwySy`g7^D0iP`Iej%5X-j{oT5pv@db zbDo(RfT!OuYOHDnpHBpbC~*6D+S+9lKViikF)rMY$?Rc;opHXu@d-OG4nwe~|Atjt z4%JRO@BjdHdp2Hhc)fF{7T_Fu1!EvVEUG|DO$!v4dYQ;((mO$;+~fYu80h3vJu;8; z=^jlNV{Sdu8^7~`KZ&E^F=fD4?Ob-dtE~Kwri;l>A;42>7&RPg0p6J{(B3`>(O~e#)!#c@ zGvk1-+`iN+7Zvppr{tLV08g9*wI9|&VWDJA>FEe(?}HKfgmv^7_s((>r%~!PHTUXk z9{h`t4Gz=tLj~0@to)^1T>Q1!1@QR1g4UB~0kklPqQC%ZQuy5CV32|sCu0%@bb{=u z+cd2K8XCF=*MILo!Hfm|*t54fTxDe;L6RIZHp+8k7%3428Y@qN-!Jj|yNLjVAk)a< zH30#pb7vNSV4Q(lU)RyN=?8}^W-Rak0M)yeKPQ)z+&lXL9{qjSAF2bdi*f9b07-*P z4E0XT>EG(~5wp-sq8|<^&~d(J$NI+(e`Q7kf8=MMlRQ_<8{(pVmIIvWnC=U`aH+i= zWJxqdxOJcB9z(k<09NG>02jJ~poWHTTD9eH^^67{0HE%L)jLF4`VzWi<}}jT3vi}m zC;-$Qr~;42!KZoC{?69<#9RV`x%LN+2W$JaNdOc0gsJ&?@a@z6*)zR^YaiKPFe`uu066^9BmC0siC2?Kr#WRlDZFoNTk0Kc{Q;>q=o z9=d+k0H0cip1pOx%j?_Y36y+Fk3}I)bU>##>i{0yTF199{i5UzJmYrz z1F>)rP!a(IGAjVibWB`}L;c}8keo&tN750WjB=Ce=Sx2pe52dfeKDx7_)d0?-HZp` zAi(k`-GPD!B&XXMiv$5&4*MVFnI$A>INkud8e;@q0$4(bA^HfhZUL;~H#vRX7Y7Dc zKA63*n-#zV0DSP`U(3FD=`MFc@j4L&5{nH3aZ96pv>E9Lc6anZ*V%RuMOM(IqM9)E zJ>da2mwrrBr|Uxhi8Wh3{Hx0j_|!VMW62dRLEhsjDE%AMG*IFZqXf)32`0x+pp-(* zff^76U{rik=p_MX%^m*VSP~>sJw<@7wo5zKJ$~dXmo4z=^uKlSryVZeZcjn+HSuT! zG|+%Zj%+{jv^#>0Ri_~q9!?0nbXqq67LWm(iGC~i2*Y6&B7=iBta0d;1AE<>MWOCJKTZdjZTL|qM<=Rmjn18 zO`K{HWY!l=b*(Vm*UzMM!hoMl?*gm%k@-KQ%faD+q1qJ>AH3l|E%52+fA-dL(c{_U z4wQUW00CmrAwZWio1d(j013t}AfpilY7f>WMINySKY5?4_X%?9f3SCO`<$;90k?uqYmjf~u#QKrrnjIMdh$-R)h8y<8v}!57j|Z|DFd z2+@c_S3b0#jO(3W?!c$kv2Axg;tmu(>~i^JB{B?gjE|uNoE#Epnhr<*TnR#Ix>g_t z$Rv4NNC9rRdMVQ<7LA5iK77!V2Y!^*{KRTU@G5PqJ5Y3wEV)T^co3))ZJIz+M}q2u zCmb9ZoW8ui}*F1W3SswT?u0zk=c7w~~f7M-3 z{BeN-M8iQqw{wIhQ0_@UDZs(^jsxf#5J50NPXa9njN%s(fD43xP61-!$bIX7aQxXk z@Z-$@TNkg9y@7vs`wB}yi-Qsk0eYO1{8tSU)E;SsU|)Yy+$8`O(h+Y6x|9ec1R-HCYNtQi=8VQ32YK|)an{DSmszHlIlM$U# z^vT;oD&md3UXN?NcRhBjG!J}^*N4BnrP$^1yy^~=+#)$-jD>;_7XgSvn3TVFvZ@98 zx_gr+P4Fq76Lv{5P)$8@*AtbW&I3PL`~SZ$x!&n^z2*rNFA|9ZBB4P5X*^A!kym&q z3dcXJ2ZD*;#7zJ#FiM|I^#tOI`qK?hRed85{3Nd6}LgKcj0XPMH{`wzQwdH}IstmAg$v54;!Y5pwfE(gE#3DgJ zw={t!5MwZ%Y=fT8i^)0Y}Mj{w|PPI{U@`3rZT=&Q2i z5p-37s2Tzxt1+<5OI71=^n*GOFb*kP60>!TPcINafY8P#tGs#Or)hog%#uQ{-}x&~ zLCNisQ${r!231#p$m6d7st-4S8VM&aOPj;sfBPLyZ(xVV zS6D6*0iwgfWD_X+?O4|-9NkwBBE~^CU0#JCLR<%M3b2mu$gc68_2LPn(n?Uu)TR@3~fKm!9J_rDs4)8z!Pwj-IWFGiQ6oB1L|MeMnpy+?e zvPT46hiG^RFpCnfw>t=D8_oeC)cV_Zlq#ElTr1^)pW&-&+h+q*EZFS|6fc#XF4R>u zt0vH~{U^XdDClg|QvgK0^X{i>=jDN)CF}UJw=NVs-aYPu;v1ZT1X?UQViTyL?mQ@= zp+vgZjmxVejsIoik7_@k2Y!~V!_VJ-o6FGBs{;UErBA|cSIVwnRB4aeYAbrU!p zn22}^5Z5Rm#J_v@k7|FE2Y!~WBiokT=kf-A?Dhn_0udn=3PN0i4*;AipL|HB*6HFxg6%7McF?UKDB0g`9}ISHUBKucpMga-!zF>$h` zs>I`)p03KtfM6c@nNa@y@)jSu+%I_widRSu7bYrzASfb2-I3Gab`hWyKvUKJ4Nq1V z<$=H42=I%=*9czMYwm)gPfDT;x~4+?iPIptJrEk`12r0}+3-~Ljd|cN({=Q@+x~~s z=YP@dFS_b%(>ahmgFwZF(AiY~{S8mmJe~*sawovnC12H0`oCvd&v<14wyk}qJAS00000NkvXXu0mjfPcd&r diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Firewall_02_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Firewall_02_128x128.png deleted file mode 100644 index 0cf90fdd69674e103f32ddd56a14afb158bcb4b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8428 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 KMNUMnLSTY)O;54_ diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Gear_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Gear_128x128.png deleted file mode 100644 index a44e376c30c3e67589fe0ce7ed7f3b72f00ee019..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9193 zcmVOV8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H1BX&td zK~#9!?VWj?Tt&V1pE_Ib%S`v|OD2;&ArJ`>5cCBRWb+1*tDxcvT=e=17`9hbUVQbs zfQpDaJ1X86BLZSD5FkJ{0@)yYGW*&+)BEYOSKU8)mhPFJ$@Fw586q{G`pit9)90M7 z?|FVpRh?>%F@_Vpw!FCNqR3mfb?kiVYZtuRuARfbK=GFeKll2?hI#Wn|LlC_8-wpW zb<=&jpZ=cz-Ei&y5`esZajr!P2myjYv3&L%?tfPVqXYY%x$%u%&wT5O_W&Ko()0Sw zcXNah#&TbGIxW7g)?Cq05q6Jxe|S1^kd0U1MTggG?7!S?kMC=F@tX(t{^O3@TDRZGzXzz4 z=B-RTn?jg=;}8=Lqk}k7JLXnbDnIlXqH^ekTVLF@dev#~0V=X|y|U^mLF9x|WD<<< z@K@KtX^V&z?$+}v1K~GX*Id`L=h>TnxNXh#_V)lyC$uh;e#khnB*zlV>%gc1Bb@*k zgF{qEnI}?H?diI$l9QAB|N6zvyPo{|`6mRR*0p!|V*7s6|MvgC?w)P;d_p=Z=h*Od z$?fGEC=p6>JYQ`c^khF61(-#^ECyx)1Po3oEd+gu)2qFGYg<-d8Qt~xXCK)9#P$An zC7{-=-;*lm&F``EiOQyCX;s~6LHX@JfBx^Ae|PolQl7`bJAO$xo|NL_QPB;_;ennA z0TdZXlnlWd0!9H27CbJ)UlUA!xzaf>xaZN!_iz2>6`y-o0ScDa^b0KFG?U$#hIH~m zW0U=oc?)eVd!M{|_m&5*Tv?jjN4yGLX~gNOtb>t`!ZM5ukYPx}e-Ei?_%&()0!O)W zKbv1)XFa<2cNeR#+FTs(iC{cne#`pn?g2S54$ zw%vC9wCq#+`r8*f?8H?H|3g9GsjP+;?*}ZF1t;t8Y&B7qyWIkmcv?K?u2)`|(SRa* zes#d_b5qfOkv+xKtvmO1Ac(Za6N;UHptJ-2dJBWZv8k;`_y ze&5OqC)&4j!(CSo?)a~LwY9odR=;3zEagL}Ck;wjai+4m26`+s3W5#$ow0D(kf~!i zuf;+#42!>Z#sUiMxNmJ)rT;V|x_{co5Co8_O0sm`Y^>S$_{YMV@4xih+tw`P+SY%6 zQFz;r)~62sBHgfH?qh*j3m4dY)jT)}{)%!`&u)fkdC}jaLD#H;&ubDJ?7lLnk-jX` zl?95jTs4hV6$KJ8J@Mi1z4F?O1l0G|y-x({D$X}z`v9=w4@dyNj|FGd)9*G0R%#9N zf_p0FEdG$YvdIC#o%bzHj|=s4n_%};BOEdzr;I6|&R$jxLr%a{)hqxkj}OXHPS!qZ zN`t0j^^A<-dba-b{))!hE6vzGfU%Mu+g5)P${QO6J=p_jp{c1*5>P+45#{wwh$RHX zqmzST0K8SzPzU?Q!2!+VZ$?btD8N`KP0#(_t6!RNfV#H)QhZY+EqbxUq%KsRIQy+>{#E*N8y#Vi<#4z$_Dh2|1Ah)b8o! zWYs=2EolbtsX!zKn8qk5Pem2fXc*MAMioKc^f|yVvm})e30Uiw51LXTstEGwQanoxpsc@7S8J9SfLGc zBsiQ4l}pZo5!(q%i;pUYWx}jsSYUt>>jP6dr*zz8ERASi1c{zrn4wmfp~KJzx?!ry zh_5+v&GkJPGH=wPP!wz5MZew4W(1&`=2?3MM0i-~lEN{W9TiK?f*Icpsz!%ycrxO9 zvLP`F5GxH;P61{z@9|PG8PVQ8#JgHyhW5h>AA}z1fvGB)#vMvLL9-?ePNX0!H&M;N zpDcrI2hBHwGFV`kmIu;75M2 ze#49b6zT1_#aFWs9#06-{(~6k?azGR>B3vrEzh=}!Eeg#NpDuM?SrnkU)9?DN znu@21)PV9JL1ncJE!~PxPY(>euuz*Z0^gh!fZh)))iI=$@o+{Oc1S_UGIv(I7c6=R zG}#49*K%Qu>^H{Y=c|u-n?suQ zemYu5A+U)}8Ka}y$80kd4b-A=2$sXf(}!mipoY`$yjM-7RL0f9RIQN;iy{!9aJwRi zhI8Ux4(4r@)-fB@q_>O2Wm>zAXew7Xl#{uigK?GOC3aicLdB) z4~N$WBeH#@@xaE6P7F6T9qky;F<%sUOy5u=v+O7hBfezV+~xHW8sXd zNI$K<-t|u1-10X&UcG()j@4iN)N${N3$?ZV*cMm}Q#FrRVVWp&8_-e_5WxvBZp2LG zI`vVtjF0HXI`%PxX$+GD16gX!119%>nx&r6zo}tN7_kxny?grz4;{5lzWGZ|t@(4` z##`cVufG1?Z4Z9Nd0YTBo%{XoXo_ZV_R2|BlwDb*1%{G@;GF}OU<@3VztJbG$Vp5= zCkm;D%ooctYb=k6qZHJd+E7aS>j%M&>7TSa1-_x#eeV2|-ESX!`b({EJoK4sjv1iY z7ykHWLo-dm8GxynQ>rx5i)3F1#Ii+0j(@y^M?P>9swfY@kpwlLV#b&+nsInz6H$!p zL#I4~FSm6e8CAhyJW!4!sH(O#&0pyJecRtZm)iEor+)w9FD~^S^$}GfFw1hdkTwLE z%G69<=*swCl}ZTz+*)0r`Xe`}Jh!i1V=7IaJn32+Z*SK_61Y0bOT#RW!JDGZ;kh?%Eu4 zG`U*x0LWI(1PUAmLO|fI3BcxejhePG>MF&gm)`X|0BV6uVJ@X++F&pr+?=yc8%Tbw zWPlF7`YpS!va-oYt_3-KL0p(YcM%I6>_DZ*&)z;L3<7{kcVI0cOd#tC-#>T6NGd?6eGFQ}13ysHJt zo-PdR-H-5|gWz}`wWlvb&5D!Zs;UAwQZh)f9S5MRCU`z`OkHJ2%LGcqf_ylP?zKD7 z{pudX+Xiw}TQWf9)xpb*WM@I|u}MInl1F)y3#6(Hs^rAMXJ3R^HV1^a=QUyDOc~2( z$}*7`p(0%6K~ybW2uHae@%At}H|+uuk^pbyG=!N}5joV3*0q~4@J=fn0Y93~I}5=j z3t{tlOXH(o-V0r|AP=aJ+d}Ajc^A4~+J(V=J)ov_^up}cmv6ny=5R=+5}EcfTuvZR zEkO`vP(ugr3SwNukkijL2FMs_9PfauCWu6L1c#n~6QOqw!BkVISzZajG1;@g4031? zov-ge=WAO)L<7~!mw*?Ge|}i)?nmphThX!hO@wx|!bl%^4o67<`2*hjOt~ASnBpr| z)PoZxn2DY&RUpTtjq4L)*`|(y<82U~PIPVD10@y*7(=2XiT+(-?0@nAwAjQmk2r~g zZ?+G$XVk&d=z*4uAl7jh`$W z%45=og8+!DkMmXLE1Pd3iezZ<805 z%c|h2b%O|_O=B542+u?Exp1sY(STfauE&{?0JDmp5646YyfqClBCX?wQYQ=uvOkO< z!d+d7?v48p*%w8$C7$V=%}%5V0o5tutqHXJqYb8Fz}w_SU|~5NK?leLEt2Z%MqttW zcORhgs=%dYx-{zX%w7OXOTbd2IWXAB{987$8D%^i2N7u%we}-gF7s?hbnE8NO z*L=h04V2eeYJX|evv3iNL?>7Q6YrVD!5OT@fv4Yuo>Y#YmeERtQFwxl2h}Med#0u$ zJ(UFSa)5U@W;P&a!2SoA2{39DeG!be!&}n`Bi1_g_fP_7pcV)J{uYe1IwiG?z{}Z( zgX9s>yKU+>TCA-F!6gf4HlVV~@{d|tY0R6maRDqX4oi&|pdLF8Ker8rtWH@iIoq<} z2~H89z~JsdFv@{Z31D^*-U(iGLvp&|^ts^U}8s7s?EqI#)X0oFI^CltI(myS=ka6!B+QyS(8l4?AKy7RPv)ohW zud$4Ql3YM=!6KN+j)H;%%iy3V)6-VV_Dl<5A3I#`bBz*(){eUQpn4nyCA!RkR8P1lwdCEG z#K2dLxaJH8Nl~_iv1SmYSOfW{l^8}T3e`YP&UvJQ=zDuZRCn}KX+?Y z*K6PYTWIqgv8oEP*(D5|A<(FuYVy#y49)7a9G&qJsPdv}-h2@MQY6$0OtwaKPABV} zMVaS-3JDH$fKjVxwd4!OGeN@ffufld5m`rPM8SY;SUM4RiZ1W@pLk^ZXT z#&<(?m8{o=?vkL( zWtTs&G^gN>PQWUHD7s>eYK2o4BrFjA?Ks3jjvJ*mOnPz6hqp+*Lwgu_q=qR^8vm_Or9Wt5y=KLEOer5wjF6O$ci~S zPkEeaqd9ZSa<-4naq9e-wQMmwb54V1tAjPPhIO!c0gPk;>LDVuc)Db28JjyoN)^y^U=pOmp^~X(?EY#@gS#P!%)>(yG?d6ga0(C{JUEGimM#nsV+<N!Q^Wo*aW!k2jJlL0D5~-ON8a~ zl%-J1Sa`$1foE3ZlrKdYP+%3fSgovD79;%i)BEU*4m~wicx9BrU(R6n)`3`Ipv0?P zWt+HCsAViHWl)2wCQz6fWCNrC0a3=FQ*!9i`!-tBRS;p6PRYbgRF8g-Vex7in>%Gz z2QlDonp1%9(ZI|Cg9F8YMZ~X7-*_-aG7rX1zaH%(xxCTcOQ8IuGvTPr z_#Rt%1tf13Oof6?@PIJ2C``F9zpCjbObA6Suyn*QdnPCd0PJN|;3T17wPaTif_O&~ z-uWxwsLC~MgyZ0>sDjN~0jiCE8;S~NIe?KFuOKqq z-QoZUKP9!~_$Q7a)t!Q~?j*SCmQCrDg53sheGMFbAL54wL9N0PY&orga?(x3XBZ=^ zXUtqc9FLJj(i!Ij$4{;nk`;o3Bar)KNP+oq)~_hMgR?6NQ!%C!94HsvyYZRg0Syfq z%;X@!R1{D>IwU3zmgNFtb}%;4G+zQ{FsM-zTG9jW+;bth%L_hlthEo(gFUd!!XCO( zH3JqA*OcVuWXR+}Gg(2@FkmXlk=|x%nh-s8AVM|tv<*he0%Mt{84SgOp0EL)<#5fq z5U#rAAiM<0<%SlX`fB~j?l8hTTR^9ge5VzIQ6hZ4G@U5Jz0)&1NYEm2Fe5brjPN`N z$Aj<=n1%zXUJG&`gT3K$I2u0+(OEt27&f;ZdZhix4IGZ4_l-Ruybe;}WDCopFc{Z; z@y|A-{$&)DiHayJRRuu73}XlmpYvN!r$P0}gC@~t!IUSSbg9LX=z48CIMJHc>LO`b zg+*+)maZFec#LNzC#u8aFmf7T1{k9`aJVc;sn#u%2ZS64Vhn<6>Ac79Shod&!vdqz z`*IM~VA_R0+xSEY`-$HLVfN^_B&eYcB`0K@f(Xw;j~@AZ9C%5B6>rOdU}+lK*1itG zk@0cUDT<=QBGS5&MzEo-mfQAXn_&i7(mS8#H&jRXz5iC9GrFWZ$40S!2?p7x$frufdRYUlUeq0 zio*_tiGTsc1{Rb-i-spOb4u5)DILbN`#%O1M5;o^rY1`@*iIbX$2dmv!(l2p8jV+<@Fht<{wea9{ct_1*@{>mMUGMI7_ z$@W7qQVD?MnmbcZf$GX6z0wKvy|oYf{_-k9JNJVZO;BAfsv&uv1LyQ^DtVHg@5Pg@ ze01xqOCMUM`MPa}+oTi+qXk+?}N@9Fly$4D{F@6 zD{kcuY8s%14rL&O*ntC(d;4K38VERWJdb4CwlM)f3Ip%##i3_jMCbag(343xf=);t z0&2)5X-uEZTKW9#=hq!|K*MGBSua|1KmPEw4Ig{NAD5+z#bD)rXJvqLf{ z20d^9*7j}Cdj?^Me$d$`!K`V5<@Ca&1by#ph3H=Z!rO{akp(lI1l7{uB?87Q=&=Nn zogt_LGUV=7n6ix6fxYNhy9RA**Fgz~VD}4tsOqZ6A8T6q$ZXqrPuexfJ3tEf z272CzAl}moDXRW+-Vr?EAo)c7 zzy5LSM}!#zsP3HK>>ub)J|{@Nsh`|RBYa>tY{8RHI6!vZa!4F~aK-=vfXXv}b*Z5f zofoD)jaF{m3Bo%dcp6SPNPbcO?3!CXQa57&0YEe)Z_!l=x-zxi0s<4=ySBj=JP9-M zG3z3VKq%+n&DApskU!`;lPPf+F$KMc(ujtRoNE~U2Vm+3q_VjuoQilodHQo-Kl6h# z0#MuY*L+2kIKfaA5CV8z6q2c8pe2R=b_JG^UsZ%LbiTP6w!lIVUOHjm$Y~9-&iXF7 zZ_{ft0#I4d@m)PNehnMD#Ngs|q`Fh+J0v3+8?P!B>qa^fhAp`0gn*+cI#Mc)UwHqv zqLyeZ8K9PDzF6-ma|LxdIq}IdNgP--h46s{LR}hY)@+&Xty>`Zo54x$cQqVUGmuD| zX;W}k&X_399dJBhY3a<9cT)>PVN+$q4#m)SScW27AW8(0wnMO2opf9pmRb~As<>VU zT{n?P>AESn8ZNnagFa&bl?9z2(9_B3L^`k=3iOT$diTcBvTh>;R}}*|9n>(JBF`(ARxFcFU{rYX4QUi`BSB^ehg380R3*L{=c31=1A5oxCyXio@? zF%Vunic}bMSwX5ljA(l|(rFz+We_!IEI{ok4Up4j!7HbjriEBcu?)d|%7s7O&{?WW zEeW9Vpz{_(O_t<>{L7aC%!HBbFF6-eQ6Yy05o_y2I*|ewC`ZGG7Nha>*{E#tfgf6q z%vDnkH8u4yBFmzPMrCRU?sG2u>4rU}yyl_-wY~7=g)WcXZ|bEP^lJRT`=Cc#QHrk_ z002wVp$tS2Z|y*OAO_<1qVAlfXg+TtYL`?%kj9VfdVCTTlbe!1rIaEXNijokfBd6A z+3pjJdA#;NTBcHxFG3QkYTzgf4go5{*&8O*!6=e#ok(@}v$V!_mc4(GHh<+Q znDzcTI6Ox-pZ+>OQi=2t{a17_$#mXz%?0;tcm_wI6b;B9aJ|nek$UPsv;s!52W*-% zYb;fR+}?#$TNjg)W=|5no0iy7=!PUqgYwQuzG7;V-R=26(}JWL{F7V^mJ z#uy@l3240Q|6FkQ#)poUyDSP&&ud?~o8uUvr5HLEB~;9x4?Wg0?L(xavXQXdKaFug zap|f}bt`UJfA8?NQ!m;_Px<#h{%rOIf1JH%uQj)=#e6E2q?6tWWfQ500kOdZbmF|{ z{2y=p(b0@Di(7fV+Im^PsHm#$gi zaN69|QcGjrRxB$@J$gcBIu$-w==<_e8xXab@AUV?|657hQygzE&bn3C!{+h9h__Gs7;@6=Ua@N3 zv}5zLZhX3T#dUwZdckL&a<_MrPYy)M+oqKXB?Xros;nXzOF}V)jpzPw^QFhCcVpUs zW}o$lQhnC1uk@YzD^G7Xy)v!2TZrgpge!bPV(poy!AN#Z`#Xp%RfTGB_m`?s&c5NP zCzpTa>63c~rC{$M_gl_pkEdiEiq7ph=Z9O)I+oo}B}r79F8KX_SA5_%a|XjkFsZrL zFv+KgQ~mM@$$_$_IWXcy1P3uyKlP@UOYW@CS+zRy!JD7G{?r@(;a3IU*&q7B8%vIL z|6oan8=5Y9I8uM!?=KF1@B!ywLb`!E1Kl>ipG~&hvH#>#z>E|uWpJ9dmO)9=w~ls0 zop;x|4LA_2H1!Ox+c)Nx=$3a*tP4&9alB$BPLLQqV2o8l0fz zs80e|c-0@<8ZUnELp2vaCaHq=`(jN^*i{n%;W&uZ4G`?E!j@(pQ&LGIy!@thd)@<7 zf-?7t$G$b|vd1bTn(#iUv3^@cxkBSF{1Rq=?}SUROlsY99h!ze-~=wmWg5-NpM7FS z^A(RRFJJjrKJA+Ih^b17zV{%E_AbywV#@t`N-S-ja>Fa%cn{D~EVY+D^2OjMo^>Vz zC)XRU#<$FfVyXKN!tCt_RVPV;8H19tcH;yuGiD;%?8_eMuKw5`POJFzOM((u`tPO? z>@_<3nRd7h=0F5&OsA!pl%bl!4etRu4yEbikN&0l@+WJnzr2~#%jW;mvh1>YxD8rY z53EEIU<|3a9y|5Mb?e^)bev1$<&S@@=E}dj)!>o}%hR~oNE&APU<)*Z`~&|2OV8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H19{Nc{ zK~#9!?VWjWU00pwzrWu(_ujW@vt(JeVoS1YYw;F2cG9sY30cWfFw+gq5~vwE1B7&S z_dwGFP18UpLsd@=)60Znssg0RG?^v~OMn4Fx;g>ukdVa*Nsw2?yDeLiCB5~o=gc4P zJz27zq$lZJ*-mt-RI>G!d++(2-+F%M9MW22u`O(S-}~Mt+S}XPq?DaRG_wqlRI00O%A#bP-WeovveM3&0q>DL`rfhXM2wQ7;kg0nnSv z<@Vfv|NY5D$z2$TOI_FPlv0iXEJ$OE)|!|ZMQ3vgNelq=X{~#;*1biEv~7Fu0}niq zy%?VHEe-eHd++5JUwpAO2!c)`>JmbXIW^2&&&=g~jSJvFQ4)(FM@L8ZKla#T?#2B4 zZwa{Dw{MR|B9V1k>rQ6wBBG)_T*u6jf>%1z*W>`~E!xB4&#`02`kr~_8UIr3mrDxn z)~#C`3bElBL}u2zC4I~%{7_b320Biz0ng&Sda3{YPo(Dg5 z4DQGXeD67|c=b;%YPdvX#pCgH=Q}jaypD)sWlA83C?KLfX6^;BhlqNaxi=Pz?S1K` zmrBQoPc?G3Hs;H?CK(0TBmm<&SaCjRDFXKizyiS~AJ7h}xr(*^gIiKuS8GgGvO@p!zAh{jZD8R5l*7_k^;5Yhev2M##1yjLFF8ymYI3BZUd zm^B(!Enw9GGR{D((BYb)U4YyI>`Ey}@(VCMKxOk#QGn?Bfa3vf0C)l5DG{a2; z=@SL|24K|yX03)*r(x9zAjWwK217e}E^u{uuvr5#0EEtu67usPl?GfFu$?^2BG75I zAYE9v0BQj=PW5K3b()#Sf_x(CRZ8^^4-X&KTC4DHR~JB)Zps64gFtRj=d*(pz^q|J z>KWD&39DX$Vj{0ji;^7_Kq~@F1|$Je10u*@Piw&QfNT!P*?FM0I|Im)>hOZYjTe3o zk5i$&TI*gS>dj;_$1ZFPJj*`SfIFh#jwqnd2M92$1tJXwtOf&Cy$OoSf&;|)4=4rL zIUt$M1GR0y^Gn~%tc;2nxzKRm&{{87O7&lyQ8_dS^O_%ZlL6dh0K91zU`y0=Rw23~ z0vtI4WHOUSP$gz$iH9yIT&;B)K>A|MxG-t0D?It_C4G1)A5kDLvCx%)Ir-*?#)pny z_`(;ug%I?mFMa8a#oTgHfjD5?=xuKP!Ph_cd1l`6`Okm;Y5=uLsZRn} zgqt7y2*qp5>jE8~)B>Z^tTPkM)zzG05iD(yq zUCjLYBHVK#ro-rbVw?+mLTW-gYyS3c|Gw{nXQ(b>wu(ZrxhP0(crn~xe(7s{3*BFr zpyY<3mWwtQ;izRH)rIJ;OU$7PNpeYtE4e}ji*RQSg;Xe^5RH@EQ0|-kMYuCV2uX60 zPdkRSI6$zs2)7Kl;n>`8V_dLs7vatv=Z346!;)NP8vsT=*wbo6yjl;&;o5J#GO`F4 z`MPAsakl>WugEH|j(paGCa;!5YC6MJ={q;<5rR5(K#&~h%w3ni2FB9_{fr}wU)4SE z(&*a)?uHE;nuHKLh-fw3jr}Mw_d2A~F zn=#>UWADj-#wPHu!SoEIep(K=FXDlhybBJuxw(0z5MnzK?I`?gCL%FSW#l0u+DSya z48z#<^2;ypDSp?;Pu3lBmDyT(xF&?5fx*FW;2vo}?%{dC&1dBRLqSjCElhK9{Vw7p<6cM#FaX_i7N0IzAScQNy>AP9Eu-Me?XX|QlIJ)}eR zmbFvyuS{sxw-URzf;|8mwfmXw@0$Ok_k9(ETVG#a?fd@KMO#^4Uw;)5C8n{9Hh>oZ z>_UDYh+ps9w=Y@#;6V^dComz zjsR>ZkWc_Lf~*6(KM8vv33nt1Xdtq*ZnSK*Ohg8N9>XwpXsve??B;SJny!xdC=u-} zO6I9kr+Re-jk+cslH?*($%W13e>VYSGDJ**Er4YH-n?WM_UTdB{iE>Hc8NhCPL~Cj zh_(>XE+UFf15y*w8{<^$uED{+TRc~;1h7L4vH1X&*{?ZVHv`NH;bKsjPS zR+-?47z65_O~URUf_-`fLC&2iRzF#;_`zXBodoKZSHq}{!6Jfk0w~)9NddM5NDy@3!x=mayMGAInPI5$_0l}Uy$Nxw zT(}tkqgv}{0qoLR?{XaH1+7Ey`(~#;LxBrYp=PKC4keL(a{xjz>Xuhy`I<)5Hr0Y7 z7N8Y!C;H)>8Gth|0!@pAAW+kM6GxGl>ztTBe}V4%N9TjIg|A27y4LloO}mJGuPg zvw00r)+-;I9B^G)a9Mkm*2*YWKAt08;hPrcNo~RZk;R2)!JJj`*dv%m$vpF=R{dD< zP>73F7$G@S8e9^tGxR2`C2ujsW;6fS`-!~)mU;gDcTJ``y?icH>v%|QGKAc6i0g!ui_&ll)gP6xxgyX977XsPWy?0PjJ;b_ZF;}4?9TP^nk^(^En`J+ zg@kVT{jYJoV!HlAPy8tLuJupg=JubVHhQ)~NrvKFZb(TCZ}Mb-kRm@>0bLQBYyIB- z@FcgXsVVL_&W$p$_Jc1*>>%VEa3t_F+qV_eD)E1G|tODq)rPzM!-TT@fBMpNwH8?{^Rlnr-oj@R}G z5oyksY8E%Z45|4_;<=;O;y1_MfmL-!ar2rVVn@rrA|mHdtW=D1IUI*d*(Dq*gD{rz zoG)DBDN8hD`Cme2Boeun6I~xN5}kJ#t)E>gtJZ_1HRcFih<0qW6%XzHBp!X^9$eG< z6mDGo1XffZp1sWtsS-omdNN!=6;sQ^Q;%pl1JD&hh}*5Dx7?Lz|KqJj^=5-3O=FHw zrPOUDn(asNZ+*Xyrw{!BI+y+yH@5!(moNVn1O;WlMQB@4X-9*(1YG3pJk4KnQ*)Kv zC*qfVWZSYWe+@f(7IwNHN?rU1b?h7L!GW_^pe{OuYg>PetD65Gmd5+1PGTUm1Qk$H zatqpm^}OR;A|9SA+>`c5pC0(_qg1=*2Glfm!_5xC$qYavxTpa;j*q=(1fF~SW>Byl zzx?c7r6r5TQw~8b=O)`+E~;go|0)Lt56l(reKOv&GdFnPf93`cBG%Z2nl;y>YH0^t zdl+7J2)KwKJC2XhbPl8G98}=LNu7X~>xc4fxXOYdrrUj$!jW8OvgGE~w9c>n!8}cy z=KeXs)mrb4w|==1NCMEvp6Nw)U@zj!H=t(q^{|$#f$Iz-$PI^@2$;6-+yI%3gH*;r zpaQt*lW=pV5x5ggk?%_wBAC+ThGuhflM@wGT${w0_mWf!==hwyWe%*P6S_nzWKO<@ zZ2udGujoNd`*kpC+7P&-2;9*Hf$aGj89Rqe#z&wu+-yI*Oh0^g>N09g1YN2l!=_tG zatjrgB<3GmvzCYF3^(o35vx>ZDTVa$mytR3TU1@P6?Los9U`$>1nwwYr}BqQ1`2R} zAFdN1&_FJA8o5+IJo{`}1ByZ84D7@lRd{SEKVK}SNSuiIn*yaoAI}x8?*EHSwD#_N zlDpLFfsf>o=aD|X8+EN$p?>Xl#Nst@ofKR_yEsB`p6$oT@BmccPf)INR$r7q1tymS;t`(0=2klQNF}Q< zippl*aD(YHG-XPz=>Se-R@e1?oZRyqP9Jy~D>}Af<%X+KQ=LFMlZE4WFe3({mWf!z zgpdO1bP8uq9mDY1Gw?ije2`ul>qiWbfYMVrRw1ZmU7`x3XyyqOn9H^F;Nal30CqMs zH0U|OWioOKqGnEm*AH;~cfY}@eXn3;_g1v^Y=;yQAi&OMaOU(e3=N)vMfPZdiXy}`zS{CW~mM#TBfWxo< z2CkjKrt5CQp*IiU%<2A$OXxH)0~8UI#>71aDa6n%pvf_=!nqiCK9Z{eH?gkxzcv70 z1n|Yd!NF$%{4;<@WqBjSNKW$S=h%`1ry&I)nM#JY9bZYk%=tvUoT6AD1hq`6RB>G4 zkSeCR!3_w3ZNZZ<K!{g&)Z?!_7`P&{USzmg^CV?KtT#Xl9+$$ZC2(_LlZ#} zLxHCVg(@$(lN>5N&Nt-pFQ`3+@5JFomH_em=g3SI1c9Xp$F@!hm!U~Ri-`^ujjzI}v?fth;w$y69Di*KxOxe^#Ii|y9cUQ?0NA#T zTrP(o$UD!5VWgy#pDt5!d5|guS9=u%>-RC6so*h_Kg~-oPc4b&N)wNvRc+Y!E@^1 zG;V=jT2=bHL=36KI%MN*&?G=w!4&$iwBmo#($eyiIVUl6Ffv@xRUFEP6boCXql=Hq z3^ie(hPT>4Me32e>K53!49o++f$5$E7joiYKsy9iuY|kuDk!7$Uc;V9AQfvv)@mvk z7lo)dbjTv-6D!u=^whjER77-FtY*#EAwO2Zo>q`jENm#m#jtLogi?s!vQkx0MglMr z$X)Sn8WfkRajfp0_TM*&c<8el!~znEyqTwkF3~o?U}h;f9CmItse*Qc%tcl`!h}Zl^^T+ z5XM56#`4&2JnljHa7hdTAt*S6isgiTeW}uw7}|no*TG3QK^uwElB$8UCy?68?D#LhynnF;JL+(aaMas_|-hK1_oI zT)PQguDURY>L#h=Kxw3HA6YjT+o{1cC}~Og53AR8{Y|AGc@~l@a)7R`4BP;0$_2|U z6ADv(1?OdAZh1b7zzE8%g>APY2TjJ@+gmm(xU|B8NwKP5>F91q_AGB`y?+3631iW&3-@2)ssQvt3X+HidUy3&&GP zrBbkMdo0|sEbEwQnxAQJZ+|50r=CT8BT^O1%6S0{qJ?v)=p0Vo49j7e%F64`GU#-Fygw?DN|mZ)sFnt7yB&ZOt+LLz_R z;1U{5)TSHkrQF)9-*%X-x?jJwyYS@QxGxXoe- zC!ej<$;7Uw3kN_gkj*7RXKOo#PVYhXyx4?DO*zPvQw`hM0w?I6CRAi3GxZovErTDJ zh1~-J9gTRqrLpWo?d|RRaDiIcaHSMy-3qNH@VufTTqtjuAgp#Yu4;#Jk6|>k2cv;G zCb<&^tp?uip8 zHUYTnt`9VS=z*`Fs!Zm_(~}C-!ne73$A_#A)LI>=arR>*^Sg0z3c=5{BJJOXKrfm4 z-UETrWHnNmD(HgoHe?V)qu$S~2>w$`%Qa_lk+hOA3 z!x&9UWU^u`oG}fZi^cTUrP285wzjs5cA>HafJ284eZeq{j{=y|$Xu~00W&V(W-0-f zpnwHUVkjLgOTx#(nViPRsD|U5`$aj?PcwJioYU+rq$&$E^H*Q!|A;nvltO7)^R`T|FlBk%%}GiHI+* zTX*>bxP+RNQl5I@g%@z_*fG54J?}wdW8;)>uC5Z;v9%g+p0IJ~U;ypU4YKkHT7^F= zWJrOAIAK-dEP(oHplYPjHbzIY@cm#+f}>IMXe45MdfmDW-^C@^pD2ju%epmk`H8!;u8RVg&` z2#7Qi5i!}JLcVAqnM@*?OhT!1OG2a3=pM_m{iAxe+Kj2`0Z+=JjvejgbiB0cVfkP*96@8ehsKkmI z8;xfAyg|wM+<#dyZgBY+9UVnFogRbA%sLv4?lw*HW1XFyui!1vCLE6Zt#5tnj=sLW z$A^c9qw#ngx88ayIyySWUjOPh2arlnrZ|$;cxIP_^l*8S7>P@4x@kF%o^Mu>x{Ag!qXCK}|ZPLlt-~8q`6PZlr z7kzzwR}c|4Z{CdSufHCqY2v~EJA`CIw}Urc*U&Rau^AEAcvCY@oS8dZW}vAC z=vtaa-1JL&yv4S>QR9XkgiIzg_PP*4#bU9anx^^Dj*gDgcnh{Ek2Qbjp@%-VZ{NNz z+qTVhb#=Jojyv$ouT6}mravrfU^u{!pR|!0p4!MYACyx5c~@7Li?>0eawO-$2OoU&;K76MQ%b>#G@`nG2ZT(___-6O z13dDB9Fk`zU!(KJ%aF=yC^hZfp)RhmZMBQ`MsIpGO&axeE|xXqV3}%c0OoAzxSsXx zwifH|?(S}dw^5^V)#4+MJo4`S`wu;y%Oy=IEz~XDhFGF)=9pFi-~Cw*FTdnYkmB}h zn~`%%pVdSFnwR*vw%bEf?eshZYt+@`P*;#1-($F&-*;5s#!1 zv2q}sJDSGxty6)D{>3dfZTc51wz4D8*bSAuZuV<1ovFX^qn7` zJbC!tfJQvA1a0kCA`-2h7H+x8i99|Vq({NzjC)OJO_A3W8UOi)Yc79z5o1Vj3sU^v z!X_IbfoK?W)qg;wr4*uLRwr=e@vxseh z;f_i1_kVcbiQ`8<@B1D{B2jd&--5=*71JYC3YqK(GU<^C8;DA2dZrb9)N|waTysrl zdJ)$Jh6?~c`N>Z<4h{}IJv@B2ftk_L(uS_?jgaT9@eKkWqa(verA8)9xfzCON29TC zSeEhU8#iwB7cpH#Z~@@Ni4*kVi!Xlf`0?Yv4**qFRoJ?9E9&a%;JPk`hK4XQGJ^3Z zZAK!IWGoi@yPlq&`xen$#Bhu4si&TL@5z%VAI@g8mJk9xJv|s59i8B8#bU9+Xf*ma zJv}{NTSRgR!3BV4pMAEjzrX)i0|Nsa)~{bbwlFFlj~|ajBA@B$>G{qgic1u3u|4_Z vllN6uSN|CiosL8zf7;X2^VA}O@Y??eR8m^z&hBDz00000NkvXXu0mjf!zMgU diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Laptop_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Laptop_128x128.png deleted file mode 100644 index ab7ea65966b8c15245705d9e52da2bd48df3437c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12593 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 T`?jPB00000NkvXXu0mjfo8-Oe diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Lock_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Lock_128x128.png deleted file mode 100644 index d815f0eb9213d17bb2e745423bf16eb629315d43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13233 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 diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/MacBook_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/MacBook_128x128.png deleted file mode 100644 index 0f6802ccfaff72aaddb71cf486277dacfacbacbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12713 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 diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Monitor_Tower_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Monitor_Tower_128x128.png deleted file mode 100644 index 223b27ad7940ec9fe5d6b57b6c3081e2c8a6c73d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10301 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 P00000NkvXXu0mjfmi}s~ diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Piggy_Bank_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Piggy_Bank_128x128.png deleted file mode 100644 index 89f51c15436fe01404c85c2484560c7c24ccec95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12780 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 NHRTsd6-bNF{{cZv_@Mv* diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Printer_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Printer_128x128.png deleted file mode 100644 index 3cee0427c8b243db1065d2c923a08f55e7eb8650..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12104 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 KMNUMnLSTaFwhycT diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Server_Tower_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Server_Tower_128x128.png deleted file mode 100644 index a0ec7b16ddeeaafde4e3393df84e4f2bacf5dc65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13352 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 diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Software_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Software_128x128.png deleted file mode 100644 index a3deb93e792241eb2fc903ed6fcf857c9f0c8edb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11020 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 =881qCIkOaPe%;^oc) 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
clAghkd>xEonQf+ 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 atYVRrC;d}(dH1a-fR>uR>U(AD$o~VPRAKJ` diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Suit3_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Suit3_128x128.png deleted file mode 100644 index 68a1f1c635f052ca0a05cc4c4d7e483977ca71ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8326 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.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 L)#WOlqXYj36@F>L diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Tech1_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Tech1_128x128.png deleted file mode 100644 index 95e411012636fb96f3245ea4adf391c2c2dbfeec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7146 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 diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Telesales1_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Telesales1_128x128.png deleted file mode 100644 index 6ef7b8a7f78d138bec079e8c615d5d6c66f5abfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8257 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 diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Virus_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Virus_128x128.png deleted file mode 100644 index f0dfbcb71109eafed077b3ca675828ee4380aa9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11358 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

m3*ydkcVn&cZC?%&cvt9*x$gzA~G> zzqRe7-2%Ai%CWI89-~9-Y6q#EG9}UXi*qle%r`vk-g_rkdgCN%`g{QQS>{%IpE*JH zgm8k6J4_0Kow;{Uz~@q;$G&oG?9OAgen@3ue|JHTKjuvsaCbj7wu4DWp98im|chy=HWD^cW}a@5$o88CB|R zjg`?WMo0f$Tl*@_yu%pt?3e7^8LjqsuiU@?XAE4Pr}^?6a;nWk!vT85`1swgT;;rQ z3vBlQ*&wk@nc0*qAo?np`Gv#7Uw*;Pou~irUAyi-W;f{A*cXWTT{8&<3$5*%oBI2E z9}*d$+wA9rOc*Osa(p1x$nqLko7RkRa7c5@5obbPOV>FG)aF9wwLVO88wN1mw_9=d{>^t zco^oYY%Sl@mU8;SgLUXX-oL+o)!5kUuRL(zoL7vG-~BMmRmVScS24ct8y)=)9)jB` z0h5KewE*@(F|iNBJWgAsRQf)E$hDiF#Y1#EC1Ac}=gtVs-vjfvt{NNr?!z!o_GVLv gYZdT9JcPIZ59mpWL`c|mT>t<807*qoM6N<$f;<@mHvj+t diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Wireless_Router_N_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Wireless_Router_N_128x128.png deleted file mode 100644 index 9bace31753aa82f9808c07e0d4ca14706aceb26a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7468 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 DCcjbW diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Workstation_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/Workstation_128x128.png deleted file mode 100644 index 9aeef9e1f3fdb45108d438ffdb1b3b2bdadef202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13635 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�ot%q=k|Y@ntGWV54g#)g3%p5+NlB7C zYnwu>nHpoJ?`R^lVN=#RW8W0DnzQfFEz(Wbrmj)K+{TPjnrMx5G1_0lPF1Z z2udlPvLNz6(eQ*rSi@O=)fu$x9X#Cucy(1YLGRSLD?=X!j&Qus=eE7eo`7ovn$6HtCa}{G_C!lq_Fq0_VK; z^mLIv042RiHkfL(wS}LOnwqJHNXlXCejKvXm>K zowd#QDn=NAHS(k`*pO@6;rlq!T*DOEkO1$!w5P(C)8i4mG*m->MQVE$JA0(ahF9s6 zMGjHB?ht&r!s&jPR`$>`%yPH?MU~5B=h~fFn z&QDp8ideUHO|n|e*d-d`(vu>g=9%b4F?8vv-sAEtrUmvqg?GBzb#|2&L+b0y+ZhjZ zQ`7T7qHvQsk-(wY9nCzid4O4<>LkoKqkNod?5~h?TFJpSI2pm-6E!$BPNXGE0)(?~ z8P%zABdLlZ38Gr&rd55;oaP0a8iGX8@GMDUhPQFkhGY={`AVJ|vywzo5(L&ZiO_@q zY?Y$`yS^AAvb-l$08yT(SkMc_ke;8I%{eM9833tT&1D9XaJ6^>yVTBGjBm6)2Izic6p4n$@-%5*fGRNktU1Id{G)M-7J zHsBSq%tT=+62MvTGUC9?xo2^CXuN)eKV_6&i_Bzg?H`%2 zRqW}roQZ_vC(X{yuUZJC;|NFvbz(6M5;45~{uRl*(tH`e7$f4jcCeFCZK~Q;n@Lem zz1f3Uvm&Q{cwbitJp1$9RH&pd;8B^H6dZ%c-eRZbSYm1^X{lM&CsI-+9KbP?4WXFb z)NJEO3Vq(;;RsGnVAi@Xgf-pTzhb2Hf>CZ6oyfa3FoLI!)ZpyoBAHldKs>m9f+UHKBdTPrbu|Quqv7fJon9nxR3!zM_4Rp$f@U6V zAS`(h1}GECc17J@Q%k3zid(a+pe`X>L_IJ*jSI|H>Tkx`83#z!Q*AX%CY)L$V0~3* zB`gwF)zz3}nDbLJC_yvz@!`din3P=n{pkpvJ{sY)Qh#2P^a}K~jczoD7MB)NIVC!* zRBNpb)tym!hj{j%ukuLU(ci1rtj6`R&$$rM>^ZY=psSw}er%4Ywe)5&n49hI*4b9= z7X?_5g3AWXnw7aEFKm$tP9!p~DIyTLl!pe+skQ{jEL91*j*C>`JpA$;WX(8hu3Sy% zSm3XZN6^a(_5 zn%SA-no*5bqLkzbBW<`i`&6s}5~BGerf7U_7^P`=CWc;=hb;(JU%Rl&d+PFHkzABR z=pYdUs8KL}7v|hzPmLt$ATzvlpp|k(OzMF6_tSfj%n2 zM>|x~wrHpvIC3D9^wg`+^=jKpbRcp?h#CNv9(Hmym3EG-uxgO@Wc!9DC>sik*RzX8 zMK_{hHSZ{@&u5Os(A6qo%Q7689f4h1hi4d8$4;Ul-VfpE3y_N|sxMb9?+F$IX+K57 z$^N84B9*6TxQ9_ZepIEn!JDwfHzj!C9^r0sSqA~5SAOipgx>IUs5&;_rC+4Ku%=!a zD;>plfmE5K)e%^Arq3C+R|5rz22Y=>;A`i`F*Q&%QBb*9?cf4QOtEm$%{Vf}U!RcB zS&Cr`n)K!JIEdjFAsqVygczt+gPbb0a8FCkZQVE^UU=b!!WCCsG2ckt9mQ5fQ1WSz zh~d!^Yl*zl+!*%G944;XATbHZE5v7jy77{>7HxNOXpbrwlZ$KMMUlO=O<4kE(jM6` zOT@Fdy+CUuJ(b6xNOSC*RFa&*u~@zC=DP&V*AAYiy%KnnEfdc}apYN??f4u_iz-eu z=z#974xCkyQ#M=G9-{jHi$C9`0@>K_H0NkvCP-iX>Q|#red<%k&{x`$PFYZ(716c! z%B}A(j_aUy=)ip-AXVe5jytigu2Th4wE?YRZTfs1*d^4I!zYtwTbdOuq^!>exu~|V z;h&mEueDT(gpDG)UdB;9H0D;&ibdvnk4;U$UI<8m^NUMkd!ZG9X&rkGLR4kUeraXp z;n4{gotTF1&JI|=rXO}(z5#aa*aB-;E#oBP=7u0~G#uL&e?l4UX^}#jB7@I>P=MK~ zWi#k2^=;71jNNXY?TvqQBFpJ4nHn}ccXld(tJZ~PWk$}g7%yC=>q|u{2c$ufsQ@Xf zG8ZOdaCG35j>o4_{ZG0OhMkz{&6%yI-i_^1x_%I%S!fx34qAtQ4J`;zAZrE~VFJwV z+K#qXc*FJE;LW?Pgza0`S)wJ)V#2s>Y-p2sVi|(;XFTDVK_YcWdn%S39UFDUhGmT5 z<%}IN*;)0&@aDUb*|Zf^{6JC8p|XIL-I~()OOhqlH}xh%+tf7^23r*3QVS{q9(hv4 zep2KB8pcr0__TD95uV&9IqxVIS^Xeea)M|Yio?Hw((p4VIlo6>BC|v`NB(UL0;`@% zaN~8ahqvsx3a;6hL0b76v>%&^!NhsXt%UUIN_L`iCEW+ovKAHH9_>A z><`%?;V+XWAQ8r~WdITutsM-iWhf3kqZ=B3J<~7noO+iuFCYQiy>lD9^~P)9`m0`t zQT}`al$7-N$Ez0uX}_MTAJlZ@KNNDKj+TiaF9#9a#NI zFR8}WJUWXiOlhtclZ#x0dj@kqXUB;7=_MRR>hTxFPg{B8kyBqL=@=gC{n4GTNKbqQS7aA=B-4M zn%KqC6MGSB8{PK)p2G0V(1fo4R_iuM@FXW)xFZrvPKOxg%ANTqD4hKzganKTY%|rD zHil38ZI^F`Ti$d7+SC!+|3k(C~k(O^~Qrhx>BC`QaH)XP+{ysi2Xw*ERYz7o@H ziouPQ!R2hE8x$U2uoPSkmhveG&OQZ&Ge1XQju?Xu&ds#p%qUz|lV?mING#x~nbY5A8p2(B)Rf&fxuRgQ+U!WNLb?IVKWxv)!%Itt9NNb70q0^_I;}EWi|VS#IFX zZZNi}rq$kDRVejVttRaof0tckb>bL=r+yB>i6;=Glde!Eu?~^2Ny!z<`{3p`?pDBD ze%VHQ4fR9%K`q?DFIT-~NLX=EknrODyv$l!vFK&@m-Fa}g)^gl$x= z)rN5^Ug(dOo{|3aJ1N}yr-pgSNV>Y|SU(%dIj)9v(hPQ#9HriP1$cjfDMEM*)z@)U zV@Dqcfoe^p>i>ivzQWei-3f2GX&2o5rrogP^;_+N!8}+K&u_}GJugS9vLuYmV>6Pp z-$yrHhqu}UT6xS)9o-9sNSA0q=$@TNtu1d>wP#x-*&aAOr^!LARA6i>Mq}Wjc~*PU zR`!siI#$N==?7)uJ4toF@y6@nZExBG zJFnj6t>o<3SsI8e=}Eu#N~P-H!Gp^d1E}&0)&LX=`v~cF zk|O2oN@u`L$CJ3kCUB=p)@5wyx73xUMv@dz#uic9dbA8my|GIi4IO~mp`U_0@USX1 z6Ll4{kSKko@YapHu0@Ht5pLLdm5M&6z5hl)ECyP=|9jq~fseN?2-5ey_r1{%eBc8# zQ*0T7#Gp~-P`_WzO5HS$l|wk2ILMdW1FNunxR|F|1MW#;Zl0<(KK`2AI_(^Ii9Kl@ zSSAWIzi51hz6zh=bY?%)4m=LEeGlp&ugA)Ksquli;ks+!&2QKRyRXLwo3xagvNMZG zPcxwTDzI5e!nSGA$Hh?s5HD09u?nC)Nz!GPU6xoSMXmTdh2_XCD-CJTs;-!mwh&SV z?4W91t)6bIBq~z&#V@3xP~1Mg->iYj@bkX8S7TLUj7e1+p1pVXnzH^Weq({CH7clK8pc1N{T|sJNq+ zq*aG8P;uGSb~;LERvT8&V^@SBHcubZB{F(ii67lIQiBV8OuV!YMt}7nOg;T~2+W+# z^oo=p!~a@ZT41*V295u|M(eRbH=Fk!K zWEicRs^<>b6&K0CgqEqH+{A&^MzJ9Q5P_|KuFm3`;0N}?$j={uaRf%xstM;ZAvFe= zHhfz0u3gu`O?!63wb$&>50W=G*o-f8F+qE!bRB>HG#>wWQIJrA_NSkK$xSW7;n8q4 zuk6f=`dP0+KVt%u@EESqv&kb7X`tP_ zdDpJ%;ien+z|~h>scJE@Y)msCyqYR+A*s@1EdJ=`&70$9B`HRr0$<%xBS~6;WyjKc z(qi@GUY+}iKrNgR)%ckax~`j^bXl98fysT(z}V0J9wvVE4~jH^^w;H1*O6mjw!H&^ zxdGmA<8B0Ihkd&9`Pi679kWzao+m}KSP1kE1n8%WIv@|DM725Z>EeTeogKmDT^vfa^S%cl6|s{u*u5KBye~ z6@Y!*sZ7-B`D@KlQOot$Uys1-Q7I6goSbh+=3>~0i=guGQ2qhie|p{PUU&au{ofQw zL>{t;!~DEn`JR>zIDGi96^)svzvGs-Nj+1|iFRg}EfLF7Wv{fuE<}f4 zD3yo(IEnrC57_<#s`9Fgi4ciLV<%%&3%zzBu05a6xDfBBdne{e;Gnde z#r@x6Sn7)#Hf)%O3%uo;y^v@)w(Y*3#N=TizvWV^n~V7y_?`(I1g47n|BK-K<>i-O z{u{W6Thk!nkI5ttyqrK5TuS9u&O zTP&b?u}1#Ik{*&4Zm8yIHvZ$d{}f8iOK^#|^O2+%v!da&rwM01SeH5mcAh|s1|0}$T+xdXBzmc!xub^@%RNl*Fgjuh7Hbyl}4o>5}K7y}(8o@aYOJHl7 z-O=`?FMVkQe|&G+SEBT^2@qaVhL!dHX0E5->`4r%vl#a;VEd0dcI=v5=cfJ)FZ<8m{`R*Yf+e_}7f6QT?M|yZzcVhC zQ`xMY@`0g7(*Dv*FTr!qJqJTWLv%jG_7=Riw|wFgpE!xf_oKh_H(&qy*N?p>LGl@1 zTIKmAU$17;j5njkR3o5h8tJ}$`v9fJMhMz4!)qc1{Ms69cj57;@4D-*C-C)qP?bM~ zOZm*d=0M6~c)Uj5tC{Jf4rgGfk)wU!zya91cdx2$BH+k=GPP!ac+jywMAC&H_jde_ zw`17r%x6CHnQ!9xyTAP9FOMyG;()W#ci>Iz&8m5z1R%xn*g#*ZkPZXGl0%(-4wux~ zzkfd*I&{ba;e~K47(PgRoUVEIN~`HP9^b~=_^+WVJi25-!XMXyfK21fh_uf{u{#Q` zrl)~iESAU8!r;(%A3JtTsWTcZJ^<-Gy~mHe`A&IyA;yfqr*MDU*S_|(pDsy|X#3_j zzj+LAZe3dCQRNUnwd_Js<@D>+p;Y9^0MU034h||JaQ5t3D@hsZtL~WXP!phJ9nao; z^UWW9_q*Ty-P~dKye70t^lT zLiH1*&e-Rn)hjualLjcwI(@0(u+{m3;)jsl_O`ddO*h>HKl#Z|KDu+~PFSjv^e}b? zE+&N&;ysXv+Gce^v(W)xYG@;=Az+Bw)9XDwJ(eUeI6hNL`){;S;J4}~Fr7Cj{yB`} z!Mon|E+xIV`u%^q?Y7%~zGR65ZQuFMcb>uy*_~E-7-CVr$@vfi0+%I+=He24W_3od zF>uWSMAJtJSOzF-jq~#$2!OFXB{^t=;KdhToIsND7YNXgmaH@DNz+|aNRIo0ulK1F zRsG!}Dvxa#H4MQ-NS_6gfq*23Q}RAQX>fcM$KTDs_|lxEUYn63`fO5VyRk@nZB+{PWKzRGM#Z5SR*97X5EL{`c>D-}}-T&fvS> z{q9q!>TaM8B1+9f!OM`^XFH`;S|fny*k6@73nY?UvN<$!k-i5R<3O`yYMu(HpR{9zzn+L#l@!pW3X{WF0d|?D!Hm8#iuLqy@=J z8NcfZw2A-bJ@0wXsil}tx+oxBpe=a#;fMbb)y_YoTJ!bm*DGmi2B7rcq;_di0I4-< z2nepWQ+^Vq{m%Ek_q_*TiEm38B(**E*kkWQ)^{IvXld1|RciVtr$!b6h$M%khNO@h zvd%IFfuBI>{OtSR|NcL~YiL{YAkl{Ow-bZ6Kf-kP4G4mu&L^jm8rduYgjt-QCda?a z2+osu?sFgf;0J#PuhH!_0TOTb-g|Ee)z-g8srpw4+BR}&*l+S8+hqjjNd)VQx8HvI zv+zf-y{16QV1ipwQm#ONRw5|BL;C*=rn+nJN4EVxdi>yurJcW&00000NkvXXu0mjf DNeeIn diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/iPad_128x128.png b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/clipart/iPad_128x128.png deleted file mode 100644 index 88dc8070296eca2a664b9345d364711f196b6f17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11727 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 diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/flowchart.xml b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/flowchart.xml deleted file mode 100644 index e6ec9d24..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/stencils/flowchart.xml +++ /dev/null @@ -1,920 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/styles/default.xml b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/styles/default.xml deleted file mode 100644 index 6c124e8a..00000000 --- a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/styles/default.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/styles/down.gif b/io.sc.engine.rule.server/src/main/resources/static/tools/graph-editor/styles/down.gif deleted file mode 100644 index f6c47ca134040923729cf64e8b9fa0857231b9a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1113 zcmZ?wbhEHbK|1&T!DE{Y;@C{IKNi0bO(l+)L1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&Psj#ZZEyztR zNmQuF&B-gas<2f`Ovz75wF0t1!um=IU?nBlwn~m52?day&iO^D3Z{Any2%D+1`1|| zdWOa(=H}))3PuKo2Koj@`i4fjhUQkrMpgy}3Q(W~w5=#5%__*n4QdyVXRDM^Qc_^0 zuU}qXu2*iXmtT~wZ)j<02{OaTNEfI=x41H|B(Xv_uUHvof=g;~a#3bMNoIbY0?5R~ zr2NtnTP2`NAzsKWfE$}vtOxdvUUGh}ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB z;NpiyW)Z+ZoqU2Pda%GTJ1y;^Qsfi`|MIrh5Ij~R+$jC3rFV4s>P;d@5Rq#zr z&ddYx!Rmc|tvvIJOA_;vQ$1a5m4GJbWoD*WnK&DpTNt@GSy-657#g~oSQ@%GJDM4r zxH+2}n7Wyp!1TK0Czs}?=9R$orXch>v@OxBG5|NZ^*``6DO z-@kqR^7+%p5AWZ-ee?R&%NNg|J$>@{(ZdJ#@7=v~`_|1H*RNf@a{1E53+K6ZM9qnzcEzM1h4fS=kHPuy>73F26CB;RB1^IcoIoVm6 z8R==MDalER3Gs2UG0{A;Cd`0selzKHgrQ9`0_gF3wJl4)%7oHr7^_7UpKA zCdNjp{}N?qO7E-ATK8?BP}H

- - - diff --git a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/Actions.js b/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/Actions.js deleted file mode 100644 index 3ceb90b5..00000000 --- a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/Actions.js +++ /dev/null @@ -1,1416 +0,0 @@ -/** - * Copyright (c) 2006-2012, JGraph Ltd - */ -/** - * Constructs the actions object for the given UI. - */ -function Actions(editorUi) -{ - this.editorUi = editorUi; - this.actions = new Object(); - this.init(); -}; - -/** - * Adds the default actions. - */ -Actions.prototype.init = function() -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - var isGraphEnabled = function() - { - return Action.prototype.isEnabled.apply(this, arguments) && graph.isEnabled(); - }; - - // File actions - this.addAction('new...', function() { graph.openLink(ui.getUrl()); }); - this.addAction('open...', function() - { - window.openNew = true; - window.openKey = 'open'; - - ui.openFile(); - }); - this.addAction('import...', function() - { - window.openNew = false; - window.openKey = 'import'; - - // Closes dialog after open - window.openFile = new OpenFile(mxUtils.bind(this, function() - { - ui.hideDialog(); - })); - - window.openFile.setConsumer(mxUtils.bind(this, function(xml, filename) - { - try - { - var doc = mxUtils.parseXml(xml); - editor.graph.setSelectionCells(editor.graph.importGraphModel(doc.documentElement)); - } - catch (e) - { - mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message); - } - })); - - // Removes openFile if dialog is closed - ui.showDialog(new OpenDialog(this).container, 320, 220, true, true, function() - { - window.openFile = null; - }); - }).isEnabled = isGraphEnabled; - this.addAction('save', function() { ui.saveFile(false); }, null, null, Editor.ctrlKey + '+S').isEnabled = isGraphEnabled; - this.addAction('saveAs...', function() { ui.saveFile(true); }, null, null, Editor.ctrlKey + '+Shift+S').isEnabled = isGraphEnabled; - this.addAction('export...', function() { ui.showDialog(new ExportDialog(ui).container, 300, 230, true, true); }); - this.addAction('editDiagram...', function() - { - var dlg = new EditDiagramDialog(ui); - //begin modify by wsp - //ui.showDialog(dlg.container, 620, 420, true, false); - ui.showDialog(dlg.container, 570, 310, true, false); - //end modify by wsp - dlg.init(); - }); - this.addAction('pageSetup...', function() { ui.showDialog(new PageSetupDialog(ui).container, 320, 220, true, true); }).isEnabled = isGraphEnabled; - this.addAction('print...', function() { ui.showDialog(new PrintDialog(ui).container, 300, 180, true, true); }, null, 'sprite-print', Editor.ctrlKey + '+P'); - this.addAction('preview', function() { mxUtils.show(graph, null, 10, 10); }); - - // Edit actions - this.addAction('undo', function() { ui.undo(); }, null, 'sprite-undo', Editor.ctrlKey + '+Z'); - this.addAction('redo', function() { ui.redo(); }, null, 'sprite-redo', (!mxClient.IS_WIN) ? Editor.ctrlKey + '+Shift+Z' : Editor.ctrlKey + '+Y'); - this.addAction('cut', function() { mxClipboard.cut(graph); }, null, 'sprite-cut', Editor.ctrlKey + '+X'); - this.addAction('copy', function() { mxClipboard.copy(graph); }, null, 'sprite-copy', Editor.ctrlKey + '+C'); - this.addAction('paste', function() - { - if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) - { - mxClipboard.paste(graph); - } - }, false, 'sprite-paste', Editor.ctrlKey + '+V'); - this.addAction('pasteHere', function(evt) - { - if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) - { - graph.getModel().beginUpdate(); - try - { - var cells = mxClipboard.paste(graph); - - if (cells != null) - { - var includeEdges = true; - - for (var i = 0; i < cells.length && includeEdges; i++) - { - includeEdges = includeEdges && graph.model.isEdge(cells[i]); - } - - var t = graph.view.translate; - var s = graph.view.scale; - var dx = t.x; - var dy = t.y; - var bb = null; - - if (cells.length == 1 && includeEdges) - { - var geo = graph.getCellGeometry(cells[0]); - - if (geo != null) - { - bb = geo.getTerminalPoint(true); - } - } - - bb = (bb != null) ? bb : graph.getBoundingBoxFromGeometry(cells, includeEdges); - - if (bb != null) - { - var x = Math.round(graph.snap(graph.popupMenuHandler.triggerX / s - dx)); - var y = Math.round(graph.snap(graph.popupMenuHandler.triggerY / s - dy)); - - graph.cellsMoved(cells, x - bb.x, y - bb.y); - } - } - } - finally - { - graph.getModel().endUpdate(); - } - } - }); - - this.addAction('copySize', function(evt) - { - var cell = graph.getSelectionCell(); - - if (graph.isEnabled() && cell != null && graph.getModel().isVertex(cell)) - { - var geo = graph.getCellGeometry(cell); - - if (geo != null) - { - ui.copiedSize = new mxRectangle(geo.x, geo.y, geo.width, geo.height); - } - } - }, null, null, 'Alt+Shit+X'); - - this.addAction('pasteSize', function(evt) - { - if (graph.isEnabled() && !graph.isSelectionEmpty() && ui.copiedSize != null) - { - graph.getModel().beginUpdate(); - - try - { - var cells = graph.getSelectionCells(); - - for (var i = 0; i < cells.length; i++) - { - if (graph.getModel().isVertex(cells[i])) - { - var geo = graph.getCellGeometry(cells[i]); - - if (geo != null) - { - geo = geo.clone(); - geo.width = ui.copiedSize.width; - geo.height = ui.copiedSize.height; - - graph.getModel().setGeometry(cells[i], geo); - } - } - } - } - finally - { - graph.getModel().endUpdate(); - } - } - }, null, null, 'Alt+Shit+V'); - - - function deleteCells(includeEdges) - { - // Cancels interactive operations - graph.escape(); - var cells = graph.getDeletableCells(graph.getSelectionCells()); - - if (cells != null && cells.length > 0) - { - var parents = graph.model.getParents(cells); - graph.removeCells(cells, includeEdges); - - // Selects parents for easier editing of groups - if (parents != null) - { - var select = []; - - for (var i = 0; i < parents.length; i++) - { - if (graph.model.contains(parents[i]) && - (graph.model.isVertex(parents[i]) || - graph.model.isEdge(parents[i]))) - { - select.push(parents[i]); - } - } - - graph.setSelectionCells(select); - } - } - }; - - this.addAction('delete', function(evt) - { - deleteCells(evt != null && mxEvent.isShiftDown(evt)); - }, null, null, 'Delete'); - this.addAction('deleteAll', function() - { - deleteCells(true); - }, null, null, Editor.ctrlKey + '+Delete'); - this.addAction('duplicate', function() - { - graph.setSelectionCells(graph.duplicateCells()); - }, null, null, Editor.ctrlKey + '+D'); - this.put('turn', new Action(mxResources.get('turn') + ' / ' + mxResources.get('reverse'), function() - { - graph.turnShapes(graph.getSelectionCells()); - }, null, null, Editor.ctrlKey + '+R')); - this.addAction('selectVertices', function() { graph.selectVertices(); }, null, null, Editor.ctrlKey + '+Shift+I'); - this.addAction('selectEdges', function() { graph.selectEdges(); }, null, null, Editor.ctrlKey + '+Shift+E'); - this.addAction('selectAll', function() { graph.selectAll(null, true); }, null, null, Editor.ctrlKey + '+A'); - this.addAction('selectNone', function() { graph.clearSelection(); }, null, null, Editor.ctrlKey + '+Shift+A'); - this.addAction('lockUnlock', function() - { - if (!graph.isSelectionEmpty()) - { - graph.getModel().beginUpdate(); - try - { - var defaultValue = graph.isCellMovable(graph.getSelectionCell()) ? 1 : 0; - graph.toggleCellStyles(mxConstants.STYLE_MOVABLE, defaultValue); - graph.toggleCellStyles(mxConstants.STYLE_RESIZABLE, defaultValue); - graph.toggleCellStyles(mxConstants.STYLE_ROTATABLE, defaultValue); - graph.toggleCellStyles(mxConstants.STYLE_DELETABLE, defaultValue); - graph.toggleCellStyles(mxConstants.STYLE_EDITABLE, defaultValue); - graph.toggleCellStyles('connectable', defaultValue); - } - finally - { - graph.getModel().endUpdate(); - } - } - }, null, null, Editor.ctrlKey + '+L'); - - // Navigation actions - this.addAction('home', function() { graph.home(); }, null, null, 'Home'); - this.addAction('exitGroup', function() { graph.exitGroup(); }, null, null, Editor.ctrlKey + '+Shift+Home'); - this.addAction('enterGroup', function() { graph.enterGroup(); }, null, null, Editor.ctrlKey + '+Shift+End'); - this.addAction('collapse', function() { graph.foldCells(true); }, null, null, Editor.ctrlKey + '+Home'); - this.addAction('expand', function() { graph.foldCells(false); }, null, null, Editor.ctrlKey + '+End'); - - // Arrange actions - this.addAction('toFront', function() { graph.orderCells(false); }, null, null, Editor.ctrlKey + '+Shift+F'); - this.addAction('toBack', function() { graph.orderCells(true); }, null, null, Editor.ctrlKey + '+Shift+B'); - this.addAction('group', function() - { - if (graph.getSelectionCount() == 1) - { - graph.setCellStyles('container', '1'); - } - else - { - graph.setSelectionCell(graph.groupCells(null, 0)); - } - }, null, null, Editor.ctrlKey + '+G'); - this.addAction('ungroup', function() - { - if (graph.getSelectionCount() == 1 && graph.getModel().getChildCount(graph.getSelectionCell()) == 0) - { - graph.setCellStyles('container', '0'); - } - else - { - graph.setSelectionCells(graph.ungroupCells()); - } - }, null, null, Editor.ctrlKey + '+Shift+U'); - this.addAction('removeFromGroup', function() { graph.removeCellsFromParent(); }); - // Adds action - this.addAction('edit', function() - { - if (graph.isEnabled()) - { - graph.startEditingAtCell(); - } - }, null, null, 'F2/Enter'); - this.addAction('editData...', function() - { - var cell = graph.getSelectionCell() || graph.getModel().getRoot(); - ui.showDataDialog(cell); - }, null, null, Editor.ctrlKey + '+M'); - this.addAction('editTooltip...', function() - { - var graph = ui.editor.graph; - - if (graph.isEnabled() && !graph.isSelectionEmpty()) - { - var cell = graph.getSelectionCell(); - var tooltip = ''; - - if (mxUtils.isNode(cell.value)) - { - var tmp = cell.value.getAttribute('tooltip'); - - if (tmp != null) - { - tooltip = tmp; - } - } - - var dlg = new TextareaDialog(ui, mxResources.get('editTooltip') + ':', tooltip, function(newValue) - { - graph.setTooltipForCell(cell, newValue); - }); - ui.showDialog(dlg.container, 320, 200, true, true); - dlg.init(); - } - }, null, null, 'Alt+Shift+T'); - this.addAction('openLink', function() - { - var link = graph.getLinkForCell(graph.getSelectionCell()); - - if (link != null) - { - graph.openLink(link); - } - }); - this.addAction('editLink...', function() - { - var graph = ui.editor.graph; - - if (graph.isEnabled() && !graph.isSelectionEmpty()) - { - var cell = graph.getSelectionCell(); - var value = graph.getLinkForCell(cell) || ''; - - ui.showLinkDialog(value, mxResources.get('apply'), function(link) - { - link = mxUtils.trim(link); - graph.setLinkForCell(cell, (link.length > 0) ? link : null); - }); - } - }, null, null, 'Alt+Shift+L'); - this.addAction('insertLink...', function() - { - if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) - { - ui.showLinkDialog('', mxResources.get('insert'), function(link, docs) - { - link = mxUtils.trim(link); - - if (link.length > 0) - { - var icon = null; - var title = graph.getLinkTitle(link); - - if (docs != null && docs.length > 0) - { - icon = docs[0].iconUrl; - title = docs[0].name || docs[0].type; - title = title.charAt(0).toUpperCase() + title.substring(1); - - if (title.length > 30) - { - title = title.substring(0, 30) + '...'; - } - } - - var pt = graph.getFreeInsertPoint(); - var linkCell = new mxCell(title, new mxGeometry(pt.x, pt.y, 100, 40), - 'fontColor=#0000EE;fontStyle=4;rounded=1;overflow=hidden;' + ((icon != null) ? - 'shape=label;imageWidth=16;imageHeight=16;spacingLeft=26;align=left;image=' + icon : - 'spacing=10;')); - linkCell.vertex = true; - - graph.setLinkForCell(linkCell, link); - graph.cellSizeUpdated(linkCell, true); - - graph.getModel().beginUpdate(); - try - { - linkCell = graph.addCell(linkCell); - graph.fireEvent(new mxEventObject('cellsInserted', 'cells', [linkCell])); - } - finally - { - graph.getModel().endUpdate(); - } - - graph.setSelectionCell(linkCell); - graph.scrollCellToVisible(graph.getSelectionCell()); - } - }); - } - }).isEnabled = isGraphEnabled; - this.addAction('link...', mxUtils.bind(this, function() - { - var graph = ui.editor.graph; - - if (graph.isEnabled()) - { - if (graph.cellEditor.isContentEditing()) - { - var elt = graph.getSelectedElement(); - var link = graph.getParentByName(elt, 'A', graph.cellEditor.textarea); - var oldValue = ''; - - // Workaround for FF returning the outermost selected element after double - // click on a DOM hierarchy with a link inside (but not as topmost element) - if (link == null && elt != null && elt.getElementsByTagName != null) - { - // Finds all links in the selected DOM and uses the link - // where the selection text matches its text content - var links = elt.getElementsByTagName('a'); - - for (var i = 0; i < links.length && link == null; i++) - { - if (links[i].textContent == elt.textContent) - { - graph.selectNode(links[i]); - link = links[i]; - } - } - } - - if (link != null && link.nodeName == 'A') - { - oldValue = link.getAttribute('href') || ''; - } - - var selState = graph.cellEditor.saveSelection(); - - ui.showLinkDialog(oldValue, mxResources.get('apply'), mxUtils.bind(this, function(value) - { - graph.cellEditor.restoreSelection(selState); - - if (value != null) - { - graph.insertLink(value); - } - })); - } - else if (graph.isSelectionEmpty()) - { - this.get('insertLink').funct(); - } - else - { - this.get('editLink').funct(); - } - } - })).isEnabled = isGraphEnabled; - this.addAction('autosize', function() - { - var cells = graph.getSelectionCells(); - - if (cells != null) - { - graph.getModel().beginUpdate(); - try - { - for (var i = 0; i < cells.length; i++) - { - var cell = cells[i]; - - if (graph.getModel().getChildCount(cell)) - { - graph.updateGroupBounds([cell], 20); - } - else - { - var state = graph.view.getState(cell); - var geo = graph.getCellGeometry(cell); - - if (graph.getModel().isVertex(cell) && state != null && state.text != null && - geo != null && graph.isWrapping(cell)) - { - geo = geo.clone(); - geo.height = state.text.boundingBox.height / graph.view.scale; - graph.getModel().setGeometry(cell, geo); - } - else - { - graph.updateCellSize(cell); - } - } - } - } - finally - { - graph.getModel().endUpdate(); - } - } - }, null, null, Editor.ctrlKey + '+Shift+Y'); - this.addAction('formattedText', function() - { - var state = graph.getView().getState(graph.getSelectionCell()); - - if (state != null) - { - var value = '1'; - graph.stopEditing(); - - graph.getModel().beginUpdate(); - try - { - if (state.style['html'] == '1') - { - value = null; - var label = graph.convertValueToString(state.cell); - - if (mxUtils.getValue(state.style, 'nl2Br', '1') != '0') - { - // Removes newlines from HTML and converts breaks to newlines - // to match the HTML output in plain text - label = label.replace(/\n/g, '').replace(//g, '\n'); - } - - // Removes HTML tags - var temp = document.createElement('div'); - temp.innerHTML = label; - label = mxUtils.extractTextWithWhitespace(temp.childNodes); - - graph.cellLabelChanged(state.cell, label); - } - else - { - // Converts HTML tags to text - var label = mxUtils.htmlEntities(graph.convertValueToString(state.cell), false); - - if (mxUtils.getValue(state.style, 'nl2Br', '1') != '0') - { - // Converts newlines in plain text to breaks in HTML - // to match the plain text output - label = label.replace(/\n/g, '
'); - } - - graph.cellLabelChanged(state.cell, graph.sanitizeHtml(label)); - } - - graph.setCellStyles('html', value); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['html'], - 'values', [(value != null) ? value : '0'], 'cells', - graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - } - }); - this.addAction('wordWrap', function() - { - var state = graph.getView().getState(graph.getSelectionCell()); - var value = 'wrap'; - - graph.stopEditing(); - - if (state != null && state.style[mxConstants.STYLE_WHITE_SPACE] == 'wrap') - { - value = null; - } - - graph.setCellStyles(mxConstants.STYLE_WHITE_SPACE, value); - }); - this.addAction('rotation', function() - { - var value = '0'; - var state = graph.getView().getState(graph.getSelectionCell()); - - if (state != null) - { - value = state.style[mxConstants.STYLE_ROTATION] || value; - } - - var dlg = new FilenameDialog(ui, value, mxResources.get('apply'), function(newValue) - { - if (newValue != null && newValue.length > 0) - { - graph.setCellStyles(mxConstants.STYLE_ROTATION, newValue); - } - }, mxResources.get('enterValue') + ' (' + mxResources.get('rotation') + ' 0-360)'); - - ui.showDialog(dlg.container, 375, 80, true, true); - dlg.init(); - }); - // View actions - this.addAction('resetView', function() - { - graph.zoomTo(1); - ui.resetScrollbars(); - }, null, null, Editor.ctrlKey + '+H'); - this.addAction('zoomIn', function(evt) { graph.zoomIn(); }, null, null, Editor.ctrlKey + ' + (Numpad) / Alt+Mousewheel'); - this.addAction('zoomOut', function(evt) { graph.zoomOut(); }, null, null, Editor.ctrlKey + ' - (Numpad) / Alt+Mousewheel'); - this.addAction('fitWindow', function() { graph.fit(); }, null, null, Editor.ctrlKey + '+Shift+H'); - this.addAction('fitPage', mxUtils.bind(this, function() - { - if (!graph.pageVisible) - { - this.get('pageView').funct(); - } - - var fmt = graph.pageFormat; - var ps = graph.pageScale; - var cw = graph.container.clientWidth - 10; - var ch = graph.container.clientHeight - 10; - var scale = Math.floor(20 * Math.min(cw / fmt.width / ps, ch / fmt.height / ps)) / 20; - graph.zoomTo(scale); - - if (mxUtils.hasScrollbars(graph.container)) - { - var pad = graph.getPagePadding(); - graph.container.scrollTop = pad.y * graph.view.scale - 1; - graph.container.scrollLeft = Math.min(pad.x * graph.view.scale, (graph.container.scrollWidth - graph.container.clientWidth) / 2) - 1; - } - }), null, null, Editor.ctrlKey + '+J'); - this.addAction('fitTwoPages', mxUtils.bind(this, function() - { - if (!graph.pageVisible) - { - this.get('pageView').funct(); - } - - var fmt = graph.pageFormat; - var ps = graph.pageScale; - var cw = graph.container.clientWidth - 10; - var ch = graph.container.clientHeight - 10; - - var scale = Math.floor(20 * Math.min(cw / (2 * fmt.width) / ps, ch / fmt.height / ps)) / 20; - graph.zoomTo(scale); - - if (mxUtils.hasScrollbars(graph.container)) - { - var pad = graph.getPagePadding(); - graph.container.scrollTop = Math.min(pad.y, (graph.container.scrollHeight - graph.container.clientHeight) / 2); - graph.container.scrollLeft = Math.min(pad.x, (graph.container.scrollWidth - graph.container.clientWidth) / 2); - } - }), null, null, Editor.ctrlKey + '+Shift+J'); - this.addAction('fitPageWidth', mxUtils.bind(this, function() - { - if (!graph.pageVisible) - { - this.get('pageView').funct(); - } - - var fmt = graph.pageFormat; - var ps = graph.pageScale; - var cw = graph.container.clientWidth - 10; - - var scale = Math.floor(20 * cw / fmt.width / ps) / 20; - graph.zoomTo(scale); - - if (mxUtils.hasScrollbars(graph.container)) - { - var pad = graph.getPagePadding(); - graph.container.scrollLeft = Math.min(pad.x * graph.view.scale, - (graph.container.scrollWidth - graph.container.clientWidth) / 2); - } - })); - this.put('customZoom', new Action(mxResources.get('custom') + '...', mxUtils.bind(this, function() - { - var dlg = new FilenameDialog(this.editorUi, parseInt(graph.getView().getScale() * 100), mxResources.get('apply'), mxUtils.bind(this, function(newValue) - { - var val = parseInt(newValue); - - if (!isNaN(val) && val > 0) - { - graph.zoomTo(val / 100); - } - }), mxResources.get('zoom') + ' (%)'); - this.editorUi.showDialog(dlg.container, 300, 80, true, true); - dlg.init(); - }), null, null, Editor.ctrlKey + '+0')); - this.addAction('pageScale...', mxUtils.bind(this, function() - { - var dlg = new FilenameDialog(this.editorUi, parseInt(graph.pageScale * 100), mxResources.get('apply'), mxUtils.bind(this, function(newValue) - { - var val = parseInt(newValue); - - if (!isNaN(val) && val > 0) - { - ui.setPageScale(val / 100); - } - }), mxResources.get('pageScale') + ' (%)'); - this.editorUi.showDialog(dlg.container, 300, 80, true, true); - dlg.init(); - })); - - // Option actions - var action = null; - action = this.addAction('grid', function() - { - graph.setGridEnabled(!graph.isGridEnabled()); - ui.fireEvent(new mxEventObject('gridEnabledChanged')); - }, null, null, Editor.ctrlKey + '+Shift+G'); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.isGridEnabled(); }); - action.setEnabled(false); - - action = this.addAction('guides', function() - { - graph.graphHandler.guidesEnabled = !graph.graphHandler.guidesEnabled; - ui.fireEvent(new mxEventObject('guidesEnabledChanged')); - }); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.graphHandler.guidesEnabled; }); - action.setEnabled(false); - - action = this.addAction('tooltips', function() - { - graph.tooltipHandler.setEnabled(!graph.tooltipHandler.isEnabled()); - }); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.tooltipHandler.isEnabled(); }); - - action = this.addAction('collapseExpand', function() - { - var change = new ChangePageSetup(ui); - change.ignoreColor = true; - change.ignoreImage = true; - change.foldingEnabled = !graph.foldingEnabled; - - graph.model.execute(change); - }); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.foldingEnabled; }); - action.isEnabled = isGraphEnabled; - action = this.addAction('scrollbars', function() - { - ui.setScrollbars(!ui.hasScrollbars()); - }); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.scrollbars; }); - action = this.addAction('pageView', mxUtils.bind(this, function() - { - ui.setPageVisible(!graph.pageVisible); - })); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.pageVisible; }); - action = this.addAction('connectionArrows', function() - { - graph.connectionArrowsEnabled = !graph.connectionArrowsEnabled; - ui.fireEvent(new mxEventObject('connectionArrowsChanged')); - }, null, null, 'Alt+Shift+A'); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.connectionArrowsEnabled; }); - action = this.addAction('connectionPoints', function() - { - graph.setConnectable(!graph.connectionHandler.isEnabled()); - ui.fireEvent(new mxEventObject('connectionPointsChanged')); - }, null, null, 'Alt+Shift+P'); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.connectionHandler.isEnabled(); }); - action = this.addAction('copyConnect', function() - { - graph.connectionHandler.setCreateTarget(!graph.connectionHandler.isCreateTarget()); - ui.fireEvent(new mxEventObject('copyConnectChanged')); - }); - action.setToggleAction(true); - action.setSelectedCallback(function() { return graph.connectionHandler.isCreateTarget(); }); - action.isEnabled = isGraphEnabled; - action = this.addAction('autosave', function() - { - ui.editor.setAutosave(!ui.editor.autosave); - }); - action.setToggleAction(true); - action.setSelectedCallback(function() { return ui.editor.autosave; }); - action.isEnabled = isGraphEnabled; - action.visible = false; - - // Help actions - this.addAction('help', function() - { - var ext = ''; - - if (mxResources.isLanguageSupported(mxClient.language)) - { - ext = '_' + mxClient.language; - } - - graph.openLink(RESOURCES_PATH + '/help' + ext + '.html'); - }); - - var showingAbout = false; - - this.put('about', new Action(mxResources.get('about') + ' Graph Editor...', function() - { - if (!showingAbout) - { - ui.showDialog(new AboutDialog(ui).container, 320, 280, true, true, function() - { - showingAbout = false; - }); - - showingAbout = true; - } - }, null, null, 'F1')); - - // Font style actions - var toggleFontStyle = mxUtils.bind(this, function(key, style, fn, shortcut) - { - return this.addAction(key, function() - { - if (fn != null && graph.cellEditor.isContentEditing()) - { - fn(); - } - else - { - graph.stopEditing(false); - - graph.getModel().beginUpdate(); - try - { - graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, style); - - // Removes bold and italic tags and CSS styles inside labels - if ((style & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD) - { - graph.updateLabelElements(graph.getSelectionCells(), function(elt) - { - elt.style.fontWeight = null; - - if (elt.nodeName == 'B') - { - graph.replaceElement(elt); - } - }); - } - else if ((style & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC) - { - graph.updateLabelElements(graph.getSelectionCells(), function(elt) - { - elt.style.fontStyle = null; - - if (elt.nodeName == 'I') - { - graph.replaceElement(elt); - } - }); - } - else if ((style & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE) - { - graph.updateLabelElements(graph.getSelectionCells(), function(elt) - { - elt.style.textDecoration = null; - - if (elt.nodeName == 'U') - { - graph.replaceElement(elt); - } - }); - } - } - finally - { - graph.getModel().endUpdate(); - } - } - }, null, null, shortcut); - }); - - toggleFontStyle('bold', mxConstants.FONT_BOLD, function() { document.execCommand('bold', false, null); }, Editor.ctrlKey + '+B'); - toggleFontStyle('italic', mxConstants.FONT_ITALIC, function() { document.execCommand('italic', false, null); }, Editor.ctrlKey + '+I'); - toggleFontStyle('underline', mxConstants.FONT_UNDERLINE, function() { document.execCommand('underline', false, null); }, Editor.ctrlKey + '+U'); - - // Color actions - this.addAction('fontColor...', function() { ui.menus.pickColor(mxConstants.STYLE_FONTCOLOR, 'forecolor', '000000'); }); - this.addAction('strokeColor...', function() { ui.menus.pickColor(mxConstants.STYLE_STROKECOLOR); }); - this.addAction('fillColor...', function() { ui.menus.pickColor(mxConstants.STYLE_FILLCOLOR); }); - this.addAction('gradientColor...', function() { ui.menus.pickColor(mxConstants.STYLE_GRADIENTCOLOR); }); - this.addAction('backgroundColor...', function() { ui.menus.pickColor(mxConstants.STYLE_LABEL_BACKGROUNDCOLOR, 'backcolor'); }); - this.addAction('borderColor...', function() { ui.menus.pickColor(mxConstants.STYLE_LABEL_BORDERCOLOR); }); - - // Format actions - this.addAction('vertical', function() { ui.menus.toggleStyle(mxConstants.STYLE_HORIZONTAL, true); }); - this.addAction('shadow', function() { ui.menus.toggleStyle(mxConstants.STYLE_SHADOW); }); - this.addAction('solid', function() - { - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(mxConstants.STYLE_DASHED, null); - graph.setCellStyles(mxConstants.STYLE_DASH_PATTERN, null); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], - 'values', [null, null], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); - this.addAction('dashed', function() - { - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(mxConstants.STYLE_DASHED, '1'); - graph.setCellStyles(mxConstants.STYLE_DASH_PATTERN, null); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], - 'values', ['1', null], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); - this.addAction('dotted', function() - { - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(mxConstants.STYLE_DASHED, '1'); - graph.setCellStyles(mxConstants.STYLE_DASH_PATTERN, '1 4'); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], - 'values', ['1', '1 4'], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); - this.addAction('sharp', function() - { - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(mxConstants.STYLE_ROUNDED, '0'); - graph.setCellStyles(mxConstants.STYLE_CURVED, '0'); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED], - 'values', ['0', '0'], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); - this.addAction('rounded', function() - { - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(mxConstants.STYLE_ROUNDED, '1'); - graph.setCellStyles(mxConstants.STYLE_CURVED, '0'); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED], - 'values', ['1', '0'], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); - this.addAction('toggleRounded', function() - { - if (!graph.isSelectionEmpty() && graph.isEnabled()) - { - graph.getModel().beginUpdate(); - try - { - var cells = graph.getSelectionCells(); - var state = graph.view.getState(cells[0]); - var style = (state != null) ? state.style : graph.getCellStyle(cells[0]); - var value = (mxUtils.getValue(style, mxConstants.STYLE_ROUNDED, '0') == '1') ? '0' : '1'; - - graph.setCellStyles(mxConstants.STYLE_ROUNDED, value); - graph.setCellStyles(mxConstants.STYLE_CURVED, null); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED], - 'values', [value, '0'], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - } - }); - this.addAction('curved', function() - { - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(mxConstants.STYLE_ROUNDED, '0'); - graph.setCellStyles(mxConstants.STYLE_CURVED, '1'); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED], - 'values', ['0', '1'], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); - this.addAction('collapsible', function() - { - var state = graph.view.getState(graph.getSelectionCell()); - var value = '1'; - - if (state != null && graph.getFoldingImage(state) != null) - { - value = '0'; - } - - graph.setCellStyles('collapsible', value); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['collapsible'], - 'values', [value], 'cells', graph.getSelectionCells())); - }); - this.addAction('editStyle...', mxUtils.bind(this, function() - { - var cells = graph.getSelectionCells(); - - if (cells != null && cells.length > 0) - { - var model = graph.getModel(); - - var dlg = new TextareaDialog(this.editorUi, mxResources.get('editStyle') + ':', - model.getStyle(cells[0]) || '', function(newValue) - { - if (newValue != null) - { - graph.setCellStyle(mxUtils.trim(newValue), cells); - } - }, null, null, 400, 220); - this.editorUi.showDialog(dlg.container, 420, 300, true, true); - dlg.init(); - } - }), null, null, Editor.ctrlKey + '+E'); - this.addAction('setAsDefaultStyle', function() - { - if (graph.isEnabled() && !graph.isSelectionEmpty()) - { - ui.setDefaultStyle(graph.getSelectionCell()); - } - }, null, null, Editor.ctrlKey + '+Shift+D'); - this.addAction('clearDefaultStyle', function() - { - if (graph.isEnabled()) - { - ui.clearDefaultStyle(); - } - }, null, null, Editor.ctrlKey + '+Shift+R'); - this.addAction('addWaypoint', function() - { - var cell = graph.getSelectionCell(); - - if (cell != null && graph.getModel().isEdge(cell)) - { - var handler = editor.graph.selectionCellsHandler.getHandler(cell); - - if (handler instanceof mxEdgeHandler) - { - var t = graph.view.translate; - var s = graph.view.scale; - var dx = t.x; - var dy = t.y; - - var parent = graph.getModel().getParent(cell); - var pgeo = graph.getCellGeometry(parent); - - while (graph.getModel().isVertex(parent) && pgeo != null) - { - dx += pgeo.x; - dy += pgeo.y; - - parent = graph.getModel().getParent(parent); - pgeo = graph.getCellGeometry(parent); - } - - var x = Math.round(graph.snap(graph.popupMenuHandler.triggerX / s - dx)); - var y = Math.round(graph.snap(graph.popupMenuHandler.triggerY / s - dy)); - - handler.addPointAt(handler.state, x, y); - } - } - }); - this.addAction('removeWaypoint', function() - { - // TODO: Action should run with "this" set to action - var rmWaypointAction = ui.actions.get('removeWaypoint'); - - if (rmWaypointAction.handler != null) - { - // NOTE: Popupevent handled and action updated in Menus.createPopupMenu - rmWaypointAction.handler.removePoint(rmWaypointAction.handler.state, rmWaypointAction.index); - } - }); - this.addAction('clearWaypoints', function() - { - var cells = graph.getSelectionCells(); - - if (cells != null) - { - cells = graph.addAllEdges(cells); - - graph.getModel().beginUpdate(); - try - { - for (var i = 0; i < cells.length; i++) - { - var cell = cells[i]; - - if (graph.getModel().isEdge(cell)) - { - var geo = graph.getCellGeometry(cell); - - if (geo != null) - { - geo = geo.clone(); - geo.points = null; - graph.getModel().setGeometry(cell, geo); - } - } - } - } - finally - { - graph.getModel().endUpdate(); - } - } - }, null, null, 'Alt+Shift+C'); - action = this.addAction('subscript', mxUtils.bind(this, function() - { - if (graph.cellEditor.isContentEditing()) - { - document.execCommand('subscript', false, null); - } - }), null, null, Editor.ctrlKey + '+,'); - action = this.addAction('superscript', mxUtils.bind(this, function() - { - if (graph.cellEditor.isContentEditing()) - { - document.execCommand('superscript', false, null); - } - }), null, null, Editor.ctrlKey + '+.'); - this.addAction('image...', function() - { - if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) - { - var title = mxResources.get('image') + ' (' + mxResources.get('url') + '):'; - var state = graph.getView().getState(graph.getSelectionCell()); - var value = ''; - - if (state != null) - { - value = state.style[mxConstants.STYLE_IMAGE] || value; - } - - var selectionState = graph.cellEditor.saveSelection(); - - ui.showImageDialog(title, value, function(newValue, w, h) - { - // Inserts image into HTML text - if (graph.cellEditor.isContentEditing()) - { - graph.cellEditor.restoreSelection(selectionState); - graph.insertImage(newValue, w, h); - } - else - { - var cells = graph.getSelectionCells(); - - if (newValue != null && (newValue.length > 0 || cells.length > 0)) - { - var select = null; - - graph.getModel().beginUpdate(); - try - { - // Inserts new cell if no cell is selected - if (cells.length == 0) - { - var pt = graph.getFreeInsertPoint(); - cells = [graph.insertVertex(graph.getDefaultParent(), null, '', pt.x, pt.y, w, h, - 'shape=image;imageAspect=0;aspect=fixed;verticalLabelPosition=bottom;verticalAlign=top;')]; - select = cells; - graph.fireEvent(new mxEventObject('cellsInserted', 'cells', select)); - } - - graph.setCellStyles(mxConstants.STYLE_IMAGE, (newValue.length > 0) ? newValue : null, cells); - - // Sets shape only if not already shape with image (label or image) - var state = graph.view.getState(cells[0]); - var style = (state != null) ? state.style : graph.getCellStyle(cells[0]); - - if (style[mxConstants.STYLE_SHAPE] != 'image' && style[mxConstants.STYLE_SHAPE] != 'label') - { - graph.setCellStyles(mxConstants.STYLE_SHAPE, 'image', cells); - } - else if (newValue.length == 0) - { - graph.setCellStyles(mxConstants.STYLE_SHAPE, null, cells); - } - - if (graph.getSelectionCount() == 1) - { - if (w != null && h != null) - { - var cell = cells[0]; - var geo = graph.getModel().getGeometry(cell); - - if (geo != null) - { - geo = geo.clone(); - geo.width = w; - geo.height = h; - graph.getModel().setGeometry(cell, geo); - } - } - } - } - finally - { - graph.getModel().endUpdate(); - } - - if (select != null) - { - graph.setSelectionCells(select); - graph.scrollCellToVisible(select[0]); - } - } - } - }, graph.cellEditor.isContentEditing(), !graph.cellEditor.isContentEditing()); - } - }).isEnabled = isGraphEnabled; - this.addAction('insertImage...', function() - { - if (graph.isEnabled() && !graph.isCellLocked(graph.getDefaultParent())) - { - graph.clearSelection(); - ui.actions.get('image').funct(); - } - }).isEnabled = isGraphEnabled; - action = this.addAction('layers', mxUtils.bind(this, function() - { - if (this.layersWindow == null) - { - // LATER: Check outline window for initial placement - this.layersWindow = new LayersWindow(ui, document.body.offsetWidth - 280, 120, 220, 180); - this.layersWindow.window.addListener('show', function() - { - ui.fireEvent(new mxEventObject('layers')); - }); - this.layersWindow.window.addListener('hide', function() - { - ui.fireEvent(new mxEventObject('layers')); - }); - this.layersWindow.window.setVisible(true); - ui.fireEvent(new mxEventObject('layers')); - } - else - { - this.layersWindow.window.setVisible(!this.layersWindow.window.isVisible()); - } - }), null, null, Editor.ctrlKey + '+Shift+L'); - action.setToggleAction(true); - action.setSelectedCallback(mxUtils.bind(this, function() { return this.layersWindow != null && this.layersWindow.window.isVisible(); })); - action = this.addAction('formatPanel', mxUtils.bind(this, function() - { - ui.toggleFormatPanel(); - }), null, null, Editor.ctrlKey + '+Shift+P'); - action.setToggleAction(true); - action.setSelectedCallback(mxUtils.bind(this, function() { return ui.formatWidth > 0; })); - action = this.addAction('outline', mxUtils.bind(this, function() - { - if (this.outlineWindow == null) - { - // LATER: Check layers window for initial placement - this.outlineWindow = new OutlineWindow(ui, document.body.offsetWidth - 260, 100, 180, 180); - this.outlineWindow.window.addListener('show', function() - { - ui.fireEvent(new mxEventObject('outline')); - }); - this.outlineWindow.window.addListener('hide', function() - { - ui.fireEvent(new mxEventObject('outline')); - }); - this.outlineWindow.window.setVisible(true); - ui.fireEvent(new mxEventObject('outline')); - } - else - { - this.outlineWindow.window.setVisible(!this.outlineWindow.window.isVisible()); - } - }), null, null, Editor.ctrlKey + '+Shift+O'); - - action.setToggleAction(true); - action.setSelectedCallback(mxUtils.bind(this, function() { return this.outlineWindow != null && this.outlineWindow.window.isVisible(); })); -}; - -/** - * Registers the given action under the given name. - */ -Actions.prototype.addAction = function(key, funct, enabled, iconCls, shortcut) -{ - var title; - - if (key.substring(key.length - 3) == '...') - { - key = key.substring(0, key.length - 3); - title = mxResources.get(key) + '...'; - } - else - { - title = mxResources.get(key); - } - - return this.put(key, new Action(title, funct, enabled, iconCls, shortcut)); -}; - -/** - * Registers the given action under the given name. - */ -Actions.prototype.put = function(name, action) -{ - this.actions[name] = action; - - return action; -}; - -/** - * Returns the action for the given name or null if no such action exists. - */ -Actions.prototype.get = function(name) -{ - return this.actions[name]; -}; - -/** - * Constructs a new action for the given parameters. - */ -function Action(label, funct, enabled, iconCls, shortcut) -{ - mxEventSource.call(this); - this.label = label; - this.funct = this.createFunction(funct); - this.enabled = (enabled != null) ? enabled : true; - this.iconCls = iconCls; - this.shortcut = shortcut; - this.visible = true; -}; - -// Action inherits from mxEventSource -mxUtils.extend(Action, mxEventSource); - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Action.prototype.createFunction = function(funct) -{ - return funct; -}; - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Action.prototype.setEnabled = function(value) -{ - if (this.enabled != value) - { - this.enabled = value; - this.fireEvent(new mxEventObject('stateChanged')); - } -}; - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Action.prototype.isEnabled = function() -{ - return this.enabled; -}; - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Action.prototype.setToggleAction = function(value) -{ - this.toggleAction = value; -}; - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Action.prototype.setSelectedCallback = function(funct) -{ - this.selectedCallback = funct; -}; - -/** - * Sets the enabled state of the action and fires a stateChanged event. - */ -Action.prototype.isSelected = function() -{ - return this.selectedCallback(); -}; diff --git a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/Dialogs.js b/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/Dialogs.js deleted file mode 100644 index 14f9d7d0..00000000 --- a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/Dialogs.js +++ /dev/null @@ -1,2603 +0,0 @@ -/** - * Copyright (c) 2006-2012, JGraph Ltd - */ -/** - * Constructs a new open dialog. - */ -var OpenDialog = function() -{ - var iframe = document.createElement('iframe'); - iframe.style.backgroundColor = 'transparent'; - iframe.allowTransparency = 'true'; - iframe.style.borderStyle = 'none'; - iframe.style.borderWidth = '0px'; - iframe.style.overflow = 'hidden'; - iframe.frameBorder = '0'; - - // Adds padding as a workaround for box model in older IE versions - var dx = (mxClient.IS_VML && (document.documentMode == null || document.documentMode < 8)) ? 20 : 0; - - iframe.setAttribute('width', (((Editor.useLocalStorage) ? 640 : 320) + dx) + 'px'); - iframe.setAttribute('height', (((Editor.useLocalStorage) ? 480 : 220) + dx) + 'px'); - iframe.setAttribute('src', OPEN_FORM); - - this.container = iframe; -}; - -/** - * Constructs a new color dialog. - */ -var ColorDialog = function(editorUi, color, apply, cancelFn) -{ - this.editorUi = editorUi; - - var input = document.createElement('input'); - input.style.marginBottom = '10px'; - input.style.width = '216px'; - - // Required for picker to render in IE - if (mxClient.IS_IE) - { - input.style.marginTop = '10px'; - document.body.appendChild(input); - } - - this.init = function() - { - if (!mxClient.IS_TOUCH) - { - input.focus(); - } - }; - - var picker = new jscolor.color(input); - picker.pickerOnfocus = false; - picker.showPicker(); - - var div = document.createElement('div'); - jscolor.picker.box.style.position = 'relative'; - jscolor.picker.box.style.width = '230px'; - jscolor.picker.box.style.height = '100px'; - jscolor.picker.box.style.paddingBottom = '10px'; - div.appendChild(jscolor.picker.box); - - var center = document.createElement('center'); - - function createRecentColorTable() - { - var table = addPresets((ColorDialog.recentColors.length == 0) ? ['FFFFFF'] : - ColorDialog.recentColors, 11, 'FFFFFF', true); - table.style.marginBottom = '8px'; - - return table; - }; - - function addPresets(presets, rowLength, defaultColor, addResetOption) - { - rowLength = (rowLength != null) ? rowLength : 12; - var table = document.createElement('table'); - table.style.borderCollapse = 'collapse'; - table.setAttribute('cellspacing', '0'); - table.style.marginBottom = '20px'; - table.style.cellSpacing = '0px'; - var tbody = document.createElement('tbody'); - table.appendChild(tbody); - - var rows = presets.length / rowLength; - - for (var row = 0; row < rows; row++) - { - var tr = document.createElement('tr'); - - for (var i = 0; i < rowLength; i++) - { - (function(clr) - { - var td = document.createElement('td'); - td.style.border = '1px solid black'; - td.style.padding = '0px'; - td.style.width = '16px'; - td.style.height = '16px'; - - if (clr == null) - { - clr = defaultColor; - } - - if (clr == 'none') - { - td.style.background = 'url(\'' + Dialog.prototype.noColorImage + '\')'; - } - else - { - td.style.backgroundColor = '#' + clr; - } - - tr.appendChild(td); - - if (clr != null) - { - td.style.cursor = 'pointer'; - - mxEvent.addListener(td, 'click', function() - { - if (clr == 'none') - { - picker.fromString('ffffff'); - input.value = 'none'; - } - else - { - picker.fromString(clr); - } - }); - } - })(presets[row * rowLength + i]); - } - - tbody.appendChild(tr); - } - - if (addResetOption) - { - var td = document.createElement('td'); - td.setAttribute('title', mxResources.get('reset')); - td.style.border = '1px solid black'; - td.style.padding = '0px'; - td.style.width = '16px'; - td.style.height = '16px'; - td.style.backgroundImage = 'url(\'' + Dialog.prototype.closeImage + '\')'; - td.style.backgroundPosition = 'center center'; - td.style.backgroundRepeat = 'no-repeat'; - td.style.cursor = 'pointer'; - - tr.appendChild(td); - - mxEvent.addListener(td, 'click', function() - { - ColorDialog.resetRecentColors(); - table.parentNode.replaceChild(createRecentColorTable(), table); - }); - } - - center.appendChild(table); - - return table; - }; - - div.appendChild(input); - mxUtils.br(div); - - // Adds recent colors - createRecentColorTable(); - - // Adds presets - var table = addPresets(this.presetColors); - table.style.marginBottom = '8px'; - table = addPresets(this.defaultColors); - table.style.marginBottom = '16px'; - - div.appendChild(center); - - var buttons = document.createElement('div'); - buttons.style.textAlign = 'right'; - buttons.style.whiteSpace = 'nowrap'; - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - editorUi.hideDialog(); - - if (cancelFn != null) - { - cancelFn(); - } - }); - cancelBtn.className = 'geBtn'; - - if (editorUi.editor.cancelFirst) - { - buttons.appendChild(cancelBtn); - } - - var applyFunction = (apply != null) ? apply : this.createApplyFunction(); - - var applyBtn = mxUtils.button(mxResources.get('apply'), function() - { - var color = input.value; - ColorDialog.addRecentColor(color, 12); - - if (color != 'none' && color.charAt(0) != '#') - { - color = '#' + color; - } - - applyFunction(color); - editorUi.hideDialog(); - }); - applyBtn.className = 'geBtn gePrimaryBtn'; - buttons.appendChild(applyBtn); - - if (!editorUi.editor.cancelFirst) - { - buttons.appendChild(cancelBtn); - } - - if (color != null) - { - if (color == 'none') - { - picker.fromString('ffffff'); - input.value = 'none'; - } - else - { - picker.fromString(color); - } - } - - div.appendChild(buttons); - this.picker = picker; - this.colorInput = input; - - // LATER: Only fires if input if focused, should always - // fire if this dialog is showing. - mxEvent.addListener(div, 'keydown', function(e) - { - if (e.keyCode == 27) - { - editorUi.hideDialog(); - - if (cancelFn != null) - { - cancelFn(); - } - - mxEvent.consume(e); - } - }); - - this.container = div; -}; - -/** - * Creates function to apply value - */ -ColorDialog.prototype.presetColors = ['E6D0DE', 'CDA2BE', 'B5739D', 'E1D5E7', 'C3ABD0', 'A680B8', 'D4E1F5', 'A9C4EB', '7EA6E0', 'D5E8D4', '9AC7BF', '67AB9F', 'D5E8D4', 'B9E0A5', '97D077', 'FFF2CC', 'FFE599', 'FFD966', 'FFF4C3', 'FFCE9F', 'FFB570', 'F8CECC', 'F19C99', 'EA6B66']; - -/** - * Creates function to apply value - */ -ColorDialog.prototype.defaultColors = ['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']; - -/** - * Creates function to apply value - */ -ColorDialog.prototype.createApplyFunction = function() -{ - return mxUtils.bind(this, function(color) - { - var graph = this.editorUi.editor.graph; - - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(this.currentColorKey, color); - this.editorUi.fireEvent(new mxEventObject('styleChanged', 'keys', [this.currentColorKey], - 'values', [color], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }); -}; - -/** - * - */ -ColorDialog.recentColors = []; - -/** - * Adds recent color for later use. - */ -ColorDialog.addRecentColor = function(color, max) -{ - if (color != null) - { - mxUtils.remove(color, ColorDialog.recentColors); - ColorDialog.recentColors.splice(0, 0, color); - - if (ColorDialog.recentColors.length >= max) - { - ColorDialog.recentColors.pop(); - } - } -}; - -/** - * Adds recent color for later use. - */ -ColorDialog.resetRecentColors = function() -{ - ColorDialog.recentColors = []; -}; - -/** - * Constructs a new about dialog. - */ -var AboutDialog = function(editorUi) -{ - var div = document.createElement('div'); - div.setAttribute('align', 'center'); - var h3 = document.createElement('h3'); - mxUtils.write(h3, mxResources.get('about') + ' GraphEditor'); - div.appendChild(h3); - var img = document.createElement('img'); - img.style.border = '0px'; - img.setAttribute('width', '176'); - img.setAttribute('width', '151'); - img.setAttribute('src', IMAGE_PATH + '/logo.png'); - div.appendChild(img); - mxUtils.br(div); - mxUtils.write(div, 'Powered by mxGraph ' + mxClient.VERSION); - mxUtils.br(div); - var link = document.createElement('a'); - link.setAttribute('href', 'http://www.jgraph.com/'); - link.setAttribute('target', '_blank'); - mxUtils.write(link, 'www.jgraph.com'); - div.appendChild(link); - mxUtils.br(div); - mxUtils.br(div); - var closeBtn = mxUtils.button(mxResources.get('close'), function() - { - editorUi.hideDialog(); - }); - closeBtn.className = 'geBtn gePrimaryBtn'; - div.appendChild(closeBtn); - - this.container = div; -}; - -/** - * Constructs a new filename dialog. - */ -var FilenameDialog = function(editorUi, filename, buttonText, fn, label, validateFn, content, helpLink, closeOnBtn, cancelFn) -{ - closeOnBtn = (closeOnBtn != null) ? closeOnBtn : true; - var row, td; - - var table = document.createElement('table'); - var tbody = document.createElement('tbody'); - table.style.marginTop = '8px'; - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.whiteSpace = 'nowrap'; - td.style.fontSize = '10pt'; - td.style.width = '120px'; - mxUtils.write(td, (label || mxResources.get('filename')) + ':'); - - row.appendChild(td); - - var nameInput = document.createElement('input'); - nameInput.setAttribute('value', filename || ''); - nameInput.style.marginLeft = '4px'; - nameInput.style.width = '180px'; - - var genericBtn = mxUtils.button(buttonText, function() - { - if (validateFn == null || validateFn(nameInput.value)) - { - if (closeOnBtn) - { - editorUi.hideDialog(); - } - - fn(nameInput.value); - } - }); - genericBtn.className = 'geBtn gePrimaryBtn'; - - this.init = function() - { - if (label == null && content != null) - { - return; - } - - nameInput.focus(); - - if (mxClient.IS_GC || mxClient.IS_FF || document.documentMode >= 5 || mxClient.IS_QUIRKS) - { - nameInput.select(); - } - else - { - document.execCommand('selectAll', false, null); - } - - // Installs drag and drop handler for links - if (Graph.fileSupport) - { - // Setup the dnd listeners - var dlg = table.parentNode; - var graph = editorUi.editor.graph; - var dropElt = null; - - mxEvent.addListener(dlg, 'dragleave', function(evt) - { - if (dropElt != null) - { - dropElt.style.backgroundColor = ''; - dropElt = null; - } - - evt.stopPropagation(); - evt.preventDefault(); - }); - - mxEvent.addListener(dlg, 'dragover', mxUtils.bind(this, function(evt) - { - // IE 10 does not implement pointer-events so it can't have a drop highlight - if (dropElt == null && (!mxClient.IS_IE || document.documentMode > 10)) - { - dropElt = nameInput; - dropElt.style.backgroundColor = '#ebf2f9'; - } - - evt.stopPropagation(); - evt.preventDefault(); - })); - - mxEvent.addListener(dlg, 'drop', mxUtils.bind(this, function(evt) - { - if (dropElt != null) - { - dropElt.style.backgroundColor = ''; - dropElt = null; - } - - if (mxUtils.indexOf(evt.dataTransfer.types, 'text/uri-list') >= 0) - { - nameInput.value = decodeURIComponent(evt.dataTransfer.getData('text/uri-list')); - genericBtn.click(); - } - - evt.stopPropagation(); - evt.preventDefault(); - })); - } - }; - - td = document.createElement('td'); - td.appendChild(nameInput); - row.appendChild(td); - - if (label != null || content == null) - { - tbody.appendChild(row); - } - - if (content != null) - { - row = document.createElement('tr'); - td = document.createElement('td'); - td.colSpan = 2; - td.appendChild(content); - row.appendChild(td); - tbody.appendChild(row); - } - - row = document.createElement('tr'); - td = document.createElement('td'); - td.colSpan = 2; - td.style.paddingTop = '20px'; - td.style.whiteSpace = 'nowrap'; - td.setAttribute('align', 'right'); - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - editorUi.hideDialog(); - - if (cancelFn != null) - { - cancelFn(); - } - }); - cancelBtn.className = 'geBtn'; - - if (editorUi.editor.cancelFirst) - { - td.appendChild(cancelBtn); - } - - if (helpLink != null) - { - var helpBtn = mxUtils.button(mxResources.get('help'), function() - { - editorUi.editor.graph.openLink(helpLink); - }); - - helpBtn.className = 'geBtn'; - td.appendChild(helpBtn); - } - - mxEvent.addListener(nameInput, 'keypress', function(e) - { - if (e.keyCode == 13) - { - genericBtn.click(); - } - }); - - td.appendChild(genericBtn); - - if (!editorUi.editor.cancelFirst) - { - td.appendChild(cancelBtn); - } - - row.appendChild(td); - tbody.appendChild(row); - table.appendChild(tbody); - - this.container = table; -}; - -/** - * Constructs a new textarea dialog. - */ -var TextareaDialog = function(editorUi, title, url, fn, cancelFn, cancelTitle, w, h, addButtons, noHide, noWrap, applyTitle) -{ - w = (w != null) ? w : 300; - h = (h != null) ? h : 120; - noHide = (noHide != null) ? noHide : false; - var row, td; - - var table = document.createElement('table'); - var tbody = document.createElement('tbody'); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - td.style.width = '100px'; - mxUtils.write(td, title); - - row.appendChild(td); - tbody.appendChild(row); - - row = document.createElement('tr'); - td = document.createElement('td'); - - var nameInput = document.createElement('textarea'); - - if (noWrap) - { - nameInput.setAttribute('wrap', 'off'); - } - - nameInput.setAttribute('spellcheck', 'false'); - nameInput.setAttribute('autocorrect', 'off'); - nameInput.setAttribute('autocomplete', 'off'); - nameInput.setAttribute('autocapitalize', 'off'); - - mxUtils.write(nameInput, url || ''); - nameInput.style.resize = 'none'; - nameInput.style.width = w + 'px'; - nameInput.style.height = h + 'px'; - - this.textarea = nameInput; - - this.init = function() - { - nameInput.focus(); - nameInput.scrollTop = 0; - }; - - td.appendChild(nameInput); - row.appendChild(td); - - tbody.appendChild(row); - - row = document.createElement('tr'); - td = document.createElement('td'); - td.style.paddingTop = '14px'; - td.style.whiteSpace = 'nowrap'; - td.setAttribute('align', 'right'); - - var cancelBtn = mxUtils.button(cancelTitle || mxResources.get('cancel'), function() - { - editorUi.hideDialog(); - - if (cancelFn != null) - { - cancelFn(); - } - }); - cancelBtn.className = 'geBtn'; - - if (editorUi.editor.cancelFirst) - { - td.appendChild(cancelBtn); - } - - if (addButtons != null) - { - addButtons(td); - } - - if (fn != null) - { - var genericBtn = mxUtils.button(applyTitle || mxResources.get('apply'), function() - { - if (!noHide) - { - editorUi.hideDialog(); - } - - fn(nameInput.value); - }); - - genericBtn.className = 'geBtn gePrimaryBtn'; - td.appendChild(genericBtn); - } - - if (!editorUi.editor.cancelFirst) - { - td.appendChild(cancelBtn); - } - - row.appendChild(td); - tbody.appendChild(row); - table.appendChild(tbody); - this.container = table; -}; - -/** - * Constructs a new edit file dialog. - */ -var EditDiagramDialog = function(editorUi) -{ - var div = document.createElement('div'); - div.style.textAlign = 'right'; - var textarea = document.createElement('textarea'); - textarea.setAttribute('wrap', 'off'); - textarea.setAttribute('spellcheck', 'false'); - textarea.setAttribute('autocorrect', 'off'); - textarea.setAttribute('autocomplete', 'off'); - textarea.setAttribute('autocapitalize', 'off'); - textarea.style.overflow = 'auto'; - textarea.style.resize = 'none'; - //begin modify by wsp - //textarea.style.width = '600px'; - //textarea.style.height = '360px'; - textarea.style.width = '550px'; - textarea.style.height = '250px'; - //end modify by wsp - textarea.style.marginBottom = '16px'; - - textarea.value = mxUtils.getPrettyXml(editorUi.editor.getGraphXml()); - div.appendChild(textarea); - - this.init = function() - { - textarea.focus(); - }; - - // Enables dropping files - if (Graph.fileSupport) - { - function handleDrop(evt) - { - evt.stopPropagation(); - evt.preventDefault(); - - if (evt.dataTransfer.files.length > 0) - { - var file = evt.dataTransfer.files[0]; - var reader = new FileReader(); - - reader.onload = function(e) - { - textarea.value = e.target.result; - }; - - reader.readAsText(file); - } - else - { - textarea.value = editorUi.extractGraphModelFromEvent(evt); - } - }; - - function handleDragOver(evt) - { - evt.stopPropagation(); - evt.preventDefault(); - }; - - // Setup the dnd listeners. - textarea.addEventListener('dragover', handleDragOver, false); - textarea.addEventListener('drop', handleDrop, false); - } - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - editorUi.hideDialog(); - }); - cancelBtn.className = 'geBtn'; - - if (editorUi.editor.cancelFirst) - { - div.appendChild(cancelBtn); - } - - var select = document.createElement('select'); - select.style.width = '180px'; - select.className = 'geBtn'; - - if (editorUi.editor.graph.isEnabled()) - { - var replaceOption = document.createElement('option'); - replaceOption.setAttribute('value', 'replace'); - mxUtils.write(replaceOption, mxResources.get('replaceExistingDrawing')); - select.appendChild(replaceOption); - } - - var newOption = document.createElement('option'); - newOption.setAttribute('value', 'new'); - mxUtils.write(newOption, mxResources.get('openInNewWindow')); - - if (EditDiagramDialog.showNewWindowOption) - { - select.appendChild(newOption); - } - - if (editorUi.editor.graph.isEnabled()) - { - var importOption = document.createElement('option'); - importOption.setAttribute('value', 'import'); - mxUtils.write(importOption, mxResources.get('addToExistingDrawing')); - select.appendChild(importOption); - } - - div.appendChild(select); - - var okBtn = mxUtils.button(mxResources.get('ok'), function() - { - // Removes all illegal control characters before parsing - var data = editorUi.editor.graph.zapGremlins(mxUtils.trim(textarea.value)); - var error = null; - - if (select.value == 'new') - { - window.openFile = new OpenFile(function() - { - editorUi.hideDialog(); - window.openFile = null; - }); - - window.openFile.setData(data, null); - editorUi.editor.graph.openLink(editorUi.getUrl()); - } - else if (select.value == 'replace') - { - editorUi.editor.graph.model.beginUpdate(); - try - { - editorUi.editor.setGraphXml(mxUtils.parseXml(data).documentElement); - // LATER: Why is hideDialog between begin-/endUpdate faster? - editorUi.hideDialog(); - } - catch (e) - { - error = e; - } - finally - { - editorUi.editor.graph.model.endUpdate(); - } - } - else if (select.value == 'import') - { - editorUi.editor.graph.model.beginUpdate(); - try - { - var doc = mxUtils.parseXml(data); - var model = new mxGraphModel(); - var codec = new mxCodec(doc); - codec.decode(doc.documentElement, model); - - var children = model.getChildren(model.getChildAt(model.getRoot(), 0)); - editorUi.editor.graph.setSelectionCells(editorUi.editor.graph.importCells(children)); - - // LATER: Why is hideDialog between begin-/endUpdate faster? - editorUi.hideDialog(); - } - catch (e) - { - error = e; - } - finally - { - editorUi.editor.graph.model.endUpdate(); - } - } - - if (error != null) - { - mxUtils.alert(error.message); - } - }); - okBtn.className = 'geBtn gePrimaryBtn'; - div.appendChild(okBtn); - - if (!editorUi.editor.cancelFirst) - { - div.appendChild(cancelBtn); - } - - this.container = div; -}; - -/** - * - */ -EditDiagramDialog.showNewWindowOption = true; - - -//begin add by wsp ----------------------------------- -var CodemirrorDiagramDialog = function(editorUi,codemirrorHeight,targetTextareaWidget,okCallback) -{ - var div = document.createElement('div'); - - var codemirrorContainer =document.createElement('div'); - codemirrorContainer.style.border='1px solid #CCCCCC'; - div.appendChild(codemirrorContainer); - - mxUtils.br(div); - - var actionContainer =document.createElement('div'); - actionContainer.style ='text-align:right'; - div.appendChild(actionContainer); - - var codemirror =null; - - this.init = function() - { - codemirror =CodeMirror(codemirrorContainer,{ - mode: 'groovy', - lineWrapping: false, - lineNumbers: false, - extraKeys:{ - 'F1': 'autocomplete' - } - }); - codemirror.setSize('100%',codemirrorHeight + 'px'); - codemirror.setValue(targetTextareaWidget.value || ''); - codemirror.focus(); - }; - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - - editorUi.hideDialog(); - }); - cancelBtn.className = 'geBtn'; - actionContainer.appendChild(cancelBtn); - - var okBtn = mxUtils.button(mxResources.get('ok'), function() - { - editorUi.hideDialog(); - targetTextareaWidget.value =codemirror.getValue(); - okCallback(); - }); - okBtn.className = 'geBtn gePrimaryBtn'; - actionContainer.appendChild(okBtn); - this.container = div; -}; - -CodemirrorDiagramDialog.showNewWindowOption = true; -//end add by wsp ----------------------------------- - - - -/** - * Constructs a new export dialog. - */ -var ExportDialog = function(editorUi) -{ - var graph = editorUi.editor.graph; - var bounds = graph.getGraphBounds(); - var scale = graph.view.scale; - - var width = Math.ceil(bounds.width / scale); - var height = Math.ceil(bounds.height / scale); - - var row, td; - - var table = document.createElement('table'); - var tbody = document.createElement('tbody'); - table.setAttribute('cellpadding', (mxClient.IS_SF) ? '0' : '2'); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - td.style.width = '100px'; - mxUtils.write(td, mxResources.get('filename') + ':'); - - row.appendChild(td); - - var nameInput = document.createElement('input'); - nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename()); - nameInput.style.width = '180px'; - - td = document.createElement('td'); - td.appendChild(nameInput); - row.appendChild(td); - - tbody.appendChild(row); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - mxUtils.write(td, mxResources.get('format') + ':'); - - row.appendChild(td); - - var imageFormatSelect = document.createElement('select'); - imageFormatSelect.style.width = '180px'; - - var pngOption = document.createElement('option'); - pngOption.setAttribute('value', 'png'); - mxUtils.write(pngOption, mxResources.get('formatPng')); - imageFormatSelect.appendChild(pngOption); - - var gifOption = document.createElement('option'); - - if (ExportDialog.showGifOption) - { - gifOption.setAttribute('value', 'gif'); - mxUtils.write(gifOption, mxResources.get('formatGif')); - imageFormatSelect.appendChild(gifOption); - } - - var jpgOption = document.createElement('option'); - jpgOption.setAttribute('value', 'jpg'); - mxUtils.write(jpgOption, mxResources.get('formatJpg')); - imageFormatSelect.appendChild(jpgOption); - - var pdfOption = document.createElement('option'); - pdfOption.setAttribute('value', 'pdf'); - mxUtils.write(pdfOption, mxResources.get('formatPdf')); - imageFormatSelect.appendChild(pdfOption); - - var svgOption = document.createElement('option'); - svgOption.setAttribute('value', 'svg'); - mxUtils.write(svgOption, mxResources.get('formatSvg')); - imageFormatSelect.appendChild(svgOption); - - if (ExportDialog.showXmlOption) - { - var xmlOption = document.createElement('option'); - xmlOption.setAttribute('value', 'xml'); - mxUtils.write(xmlOption, mxResources.get('formatXml')); - imageFormatSelect.appendChild(xmlOption); - } - - td = document.createElement('td'); - td.appendChild(imageFormatSelect); - row.appendChild(td); - - tbody.appendChild(row); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - mxUtils.write(td, mxResources.get('zoom') + ' (%):'); - - row.appendChild(td); - - var zoomInput = document.createElement('input'); - zoomInput.setAttribute('type', 'number'); - zoomInput.setAttribute('value', '100'); - zoomInput.style.width = '180px'; - - td = document.createElement('td'); - td.appendChild(zoomInput); - row.appendChild(td); - - tbody.appendChild(row); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - mxUtils.write(td, mxResources.get('width') + ':'); - - row.appendChild(td); - - var widthInput = document.createElement('input'); - widthInput.setAttribute('value', width); - widthInput.style.width = '180px'; - - td = document.createElement('td'); - td.appendChild(widthInput); - row.appendChild(td); - - tbody.appendChild(row); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - mxUtils.write(td, mxResources.get('height') + ':'); - - row.appendChild(td); - - var heightInput = document.createElement('input'); - heightInput.setAttribute('value', height); - heightInput.style.width = '180px'; - - td = document.createElement('td'); - td.appendChild(heightInput); - row.appendChild(td); - - tbody.appendChild(row); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - mxUtils.write(td, mxResources.get('background') + ':'); - - row.appendChild(td); - - var transparentCheckbox = document.createElement('input'); - transparentCheckbox.setAttribute('type', 'checkbox'); - transparentCheckbox.checked = graph.background == null || graph.background == mxConstants.NONE; - - td = document.createElement('td'); - td.appendChild(transparentCheckbox); - mxUtils.write(td, mxResources.get('transparent')); - - row.appendChild(td); - - tbody.appendChild(row); - - row = document.createElement('tr'); - - td = document.createElement('td'); - td.style.fontSize = '10pt'; - mxUtils.write(td, mxResources.get('borderWidth') + ':'); - - row.appendChild(td); - - var borderInput = document.createElement('input'); - borderInput.setAttribute('type', 'number'); - borderInput.setAttribute('value', ExportDialog.lastBorderValue); - borderInput.style.width = '180px'; - - td = document.createElement('td'); - td.appendChild(borderInput); - row.appendChild(td); - - tbody.appendChild(row); - table.appendChild(tbody); - - // Handles changes in the export format - function formatChanged() - { - var name = nameInput.value; - var dot = name.lastIndexOf('.'); - - if (dot > 0) - { - nameInput.value = name.substring(0, dot + 1) + imageFormatSelect.value; - } - else - { - nameInput.value = name + '.' + imageFormatSelect.value; - } - - if (imageFormatSelect.value === 'xml') - { - zoomInput.setAttribute('disabled', 'true'); - widthInput.setAttribute('disabled', 'true'); - heightInput.setAttribute('disabled', 'true'); - borderInput.setAttribute('disabled', 'true'); - } - else - { - zoomInput.removeAttribute('disabled'); - widthInput.removeAttribute('disabled'); - heightInput.removeAttribute('disabled'); - borderInput.removeAttribute('disabled'); - } - - if (imageFormatSelect.value === 'png' || imageFormatSelect.value === 'svg') - { - transparentCheckbox.removeAttribute('disabled'); - } - else - { - transparentCheckbox.setAttribute('disabled', 'disabled'); - } - }; - - mxEvent.addListener(imageFormatSelect, 'change', formatChanged); - formatChanged(); - - function checkValues() - { - if (widthInput.value * heightInput.value > MAX_AREA || widthInput.value <= 0) - { - widthInput.style.backgroundColor = 'red'; - } - else - { - widthInput.style.backgroundColor = ''; - } - - if (widthInput.value * heightInput.value > MAX_AREA || heightInput.value <= 0) - { - heightInput.style.backgroundColor = 'red'; - } - else - { - heightInput.style.backgroundColor = ''; - } - }; - - mxEvent.addListener(zoomInput, 'change', function() - { - var s = Math.max(0, parseFloat(zoomInput.value) || 100) / 100; - zoomInput.value = parseFloat((s * 100).toFixed(2)); - - if (width > 0) - { - widthInput.value = Math.floor(width * s); - heightInput.value = Math.floor(height * s); - } - else - { - zoomInput.value = '100'; - widthInput.value = width; - heightInput.value = height; - } - - checkValues(); - }); - - mxEvent.addListener(widthInput, 'change', function() - { - var s = parseInt(widthInput.value) / width; - - if (s > 0) - { - zoomInput.value = parseFloat((s * 100).toFixed(2)); - heightInput.value = Math.floor(height * s); - } - else - { - zoomInput.value = '100'; - widthInput.value = width; - heightInput.value = height; - } - - checkValues(); - }); - - mxEvent.addListener(heightInput, 'change', function() - { - var s = parseInt(heightInput.value) / height; - - if (s > 0) - { - zoomInput.value = parseFloat((s * 100).toFixed(2)); - widthInput.value = Math.floor(width * s); - } - else - { - zoomInput.value = '100'; - widthInput.value = width; - heightInput.value = height; - } - - checkValues(); - }); - - row = document.createElement('tr'); - td = document.createElement('td'); - td.setAttribute('align', 'right'); - td.style.paddingTop = '22px'; - td.colSpan = 2; - - var saveBtn = mxUtils.button(mxResources.get('export'), mxUtils.bind(this, function() - { - if (parseInt(zoomInput.value) <= 0) - { - mxUtils.alert(mxResources.get('drawingEmpty')); - } - else - { - var name = nameInput.value; - var format = imageFormatSelect.value; - var s = Math.max(0, parseFloat(zoomInput.value) || 100) / 100; - var b = Math.max(0, parseInt(borderInput.value)); - var bg = graph.background; - - if ((format == 'svg' || format == 'png') && transparentCheckbox.checked) - { - bg = null; - } - else if (bg == null || bg == mxConstants.NONE) - { - bg = '#ffffff'; - } - - ExportDialog.lastBorderValue = b; - ExportDialog.exportFile(editorUi, name, format, bg, s, b); - } - })); - saveBtn.className = 'geBtn gePrimaryBtn'; - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - editorUi.hideDialog(); - }); - cancelBtn.className = 'geBtn'; - - if (editorUi.editor.cancelFirst) - { - td.appendChild(cancelBtn); - td.appendChild(saveBtn); - } - else - { - td.appendChild(saveBtn); - td.appendChild(cancelBtn); - } - - row.appendChild(td); - tbody.appendChild(row); - table.appendChild(tbody); - this.container = table; -}; - -/** - * Remembers last value for border. - */ -ExportDialog.lastBorderValue = 0; - -/** - * Global switches for the export dialog. - */ -ExportDialog.showGifOption = true; - -/** - * Global switches for the export dialog. - */ -ExportDialog.showXmlOption = true; - -/** - * Hook for getting the export format. Returns null for the default - * intermediate XML export format or a function that returns the - * parameter and value to be used in the request in the form - * key=value, where value should be URL encoded. - */ -ExportDialog.exportFile = function(editorUi, name, format, bg, s, b) -{ - var graph = editorUi.editor.graph; - - if (format == 'xml') - { - ExportDialog.saveLocalFile(editorUi, mxUtils.getXml(editorUi.editor.getGraphXml()), name, format); - } - else if (format == 'svg') - { - ExportDialog.saveLocalFile(editorUi, mxUtils.getXml(graph.getSvg(bg, s, b)), name, format); - } - else - { - var bounds = graph.getGraphBounds(); - - // New image export - var xmlDoc = mxUtils.createXmlDocument(); - var root = xmlDoc.createElement('output'); - xmlDoc.appendChild(root); - - // Renders graph. Offset will be multiplied with state's scale when painting state. - var xmlCanvas = new mxXmlCanvas2D(root); - xmlCanvas.translate(Math.floor((b / s - bounds.x) / graph.view.scale), - Math.floor((b / s - bounds.y) / graph.view.scale)); - xmlCanvas.scale(s / graph.view.scale); - - var imgExport = new mxImageExport() - imgExport.drawState(graph.getView().getState(graph.model.root), xmlCanvas); - - // Puts request data together - var param = 'xml=' + encodeURIComponent(mxUtils.getXml(root)); - var w = Math.ceil(bounds.width * s / graph.view.scale + 2 * b); - var h = Math.ceil(bounds.height * s / graph.view.scale + 2 * b); - - // Requests image if request is valid - if (param.length <= MAX_REQUEST_SIZE && w * h < MAX_AREA) - { - editorUi.hideDialog(); - var req = new mxXmlRequest(EXPORT_URL, 'format=' + format + - '&filename=' + encodeURIComponent(name) + - '&bg=' + ((bg != null) ? bg : 'none') + - '&w=' + w + '&h=' + h + '&' + param); - req.simulate(document, '_blank'); - } - else - { - mxUtils.alert(mxResources.get('drawingTooLarge')); - } - } -}; - -/** - * Hook for getting the export format. Returns null for the default - * intermediate XML export format or a function that returns the - * parameter and value to be used in the request in the form - * key=value, where value should be URL encoded. - */ -ExportDialog.saveLocalFile = function(editorUi, data, filename, format) -{ - if (data.length < MAX_REQUEST_SIZE) - { - editorUi.hideDialog(); - var req = new mxXmlRequest(SAVE_URL, 'xml=' + encodeURIComponent(data) + '&filename=' + - encodeURIComponent(filename) + '&format=' + format); - req.simulate(document, '_blank'); - } - else - { - mxUtils.alert(mxResources.get('drawingTooLarge')); - mxUtils.popup(xml); - } -}; - -/** - * Constructs a new metadata dialog. - */ -var EditDataDialog = function(ui, cell) -{ - var div = document.createElement('div'); - var graph = ui.editor.graph; - - var value = graph.getModel().getValue(cell); - - // Converts the value to an XML node - if (!mxUtils.isNode(value)) - { - var doc = mxUtils.createXmlDocument(); - var obj = doc.createElement('object'); - obj.setAttribute('label', value || ''); - value = obj; - } - - // Creates the dialog contents - var form = new mxForm('properties'); - form.table.style.width = '100%'; - - var attrs = value.attributes; - var names = []; - var texts = []; - var count = 0; - - var id = EditDataDialog.getDisplayIdForCell(ui, cell); - - // FIXME: Fix remove button for quirks mode - var addRemoveButton = function(text, name) - { - var wrapper = document.createElement('div'); - wrapper.style.position = 'relative'; - wrapper.style.paddingRight = '20px'; - wrapper.style.boxSizing = 'border-box'; - wrapper.style.width = '100%'; - - var removeAttr = document.createElement('a'); - var img = mxUtils.createImage(Dialog.prototype.closeImage); - img.style.height = '9px'; - img.style.fontSize = '9px'; - img.style.marginBottom = (mxClient.IS_IE11) ? '-1px' : '5px'; - - removeAttr.className = 'geButton'; - removeAttr.setAttribute('title', mxResources.get('delete')); - removeAttr.style.position = 'absolute'; - removeAttr.style.top = '4px'; - removeAttr.style.right = '0px'; - removeAttr.style.margin = '0px'; - removeAttr.style.width = '9px'; - removeAttr.style.height = '9px'; - removeAttr.style.cursor = 'pointer'; - removeAttr.appendChild(img); - - var removeAttrFn = (function(name) - { - return function() - { - var count = 0; - - for (var j = 0; j < names.length; j++) - { - if (names[j] == name) - { - texts[j] = null; - form.table.deleteRow(count + ((id != null) ? 1 : 0)); - - break; - } - - if (texts[j] != null) - { - count++; - } - } - }; - })(name); - - mxEvent.addListener(removeAttr, 'click', removeAttrFn); - - var parent = text.parentNode; - wrapper.appendChild(text); - wrapper.appendChild(removeAttr); - parent.appendChild(wrapper); - }; - - var addTextArea = function(index, name, value) - { - names[index] = name; - texts[index] = form.addTextarea(names[count] + ':', value, 2); - texts[index].style.width = '100%'; - - addRemoveButton(texts[index], name); - }; - - var temp = []; - var isLayer = graph.getModel().getParent(cell) == graph.getModel().getRoot(); - - for (var i = 0; i < attrs.length; i++) - { - if ((isLayer || attrs[i].nodeName != 'label') && attrs[i].nodeName != 'placeholders') - { - temp.push({name: attrs[i].nodeName, value: attrs[i].nodeValue}); - } - } - - // Sorts by name - temp.sort(function(a, b) - { - if (a.name < b.name) - { - return -1; - } - else if (a.name > b.name) - { - return 1; - } - else - { - return 0; - } - }); - - if (id != null) - { - var text = document.createElement('input'); - text.style.width = '280px'; - text.style.textAlign = 'center'; - text.setAttribute('type', 'text'); - text.setAttribute('readOnly', 'true'); - text.setAttribute('value', id); - - form.addField(mxResources.get('id') + ':', text); - } - - for (var i = 0; i < temp.length; i++) - { - addTextArea(count, temp[i].name, temp[i].value); - count++; - } - - var top = document.createElement('div'); - top.style.cssText = 'position:absolute;left:30px;right:30px;overflow-y:auto;top:30px;bottom:80px;'; - top.appendChild(form.table); - - var newProp = document.createElement('div'); - newProp.style.whiteSpace = 'nowrap'; - newProp.style.marginTop = '6px'; - - var nameInput = document.createElement('input'); - nameInput.setAttribute('placeholder', mxResources.get('enterPropertyName')); - nameInput.setAttribute('type', 'text'); - nameInput.setAttribute('size', (mxClient.IS_IE || mxClient.IS_IE11) ? '18' : '22'); - nameInput.style.marginLeft = '2px'; - - newProp.appendChild(nameInput); - top.appendChild(newProp); - div.appendChild(top); - - var addBtn = mxUtils.button(mxResources.get('addProperty'), function() - { - var name = nameInput.value; - - // Avoid ':' in attribute names which seems to be valid in Chrome - if (name.length > 0 && name != 'label' && name != 'placeholders' && name.indexOf(':') < 0) - { - try - { - var idx = mxUtils.indexOf(names, name); - - if (idx >= 0 && texts[idx] != null) - { - texts[idx].focus(); - } - else - { - // Checks if the name is valid - var clone = value.cloneNode(false); - clone.setAttribute(name, ''); - - if (idx >= 0) - { - names.splice(idx, 1); - texts.splice(idx, 1); - } - - names.push(name); - var text = form.addTextarea(name + ':', '', 2); - text.style.width = '100%'; - texts.push(text); - addRemoveButton(text, name); - - text.focus(); - } - - nameInput.value = ''; - } - catch (e) - { - mxUtils.alert(e); - } - } - else - { - mxUtils.alert(mxResources.get('invalidName')); - } - }); - - this.init = function() - { - if (texts.length > 0) - { - texts[0].focus(); - } - else - { - nameInput.focus(); - } - }; - - addBtn.setAttribute('disabled', 'disabled'); - addBtn.style.marginLeft = '10px'; - addBtn.style.width = '144px'; - newProp.appendChild(addBtn); - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - ui.hideDialog.apply(ui, arguments); - }); - - cancelBtn.className = 'geBtn'; - - var applyBtn = mxUtils.button(mxResources.get('apply'), function() - { - try - { - ui.hideDialog.apply(ui, arguments); - - // Clones and updates the value - value = value.cloneNode(true); - var removeLabel = false; - - for (var i = 0; i < names.length; i++) - { - if (texts[i] == null) - { - value.removeAttribute(names[i]); - } - else - { - value.setAttribute(names[i], texts[i].value); - removeLabel = removeLabel || (names[i] == 'placeholder' && - value.getAttribute('placeholders') == '1'); - } - } - - // Removes label if placeholder is assigned - if (removeLabel) - { - value.removeAttribute('label'); - } - - // Updates the value of the cell (undoable) - graph.getModel().setValue(cell, value); - } - catch (e) - { - mxUtils.alert(e); - } - }); - applyBtn.className = 'geBtn gePrimaryBtn'; - - function updateAddBtn() - { - if (nameInput.value.length > 0) - { - addBtn.removeAttribute('disabled'); - } - else - { - addBtn.setAttribute('disabled', 'disabled'); - } - }; - - mxEvent.addListener(nameInput, 'keyup', updateAddBtn); - - // Catches all changes that don't fire a keyup (such as paste via mouse) - mxEvent.addListener(nameInput, 'change', updateAddBtn); - - var buttons = document.createElement('div'); - buttons.style.cssText = 'position:absolute;left:30px;right:30px;text-align:right;bottom:30px;height:40px;' - - if (ui.editor.graph.getModel().isVertex(cell) || ui.editor.graph.getModel().isEdge(cell)) - { - var replace = document.createElement('span'); - replace.style.marginRight = '10px'; - var input = document.createElement('input'); - input.setAttribute('type', 'checkbox'); - input.style.marginRight = '6px'; - - if (value.getAttribute('placeholders') == '1') - { - input.setAttribute('checked', 'checked'); - input.defaultChecked = true; - } - - mxEvent.addListener(input, 'click', function() - { - if (value.getAttribute('placeholders') == '1') - { - value.removeAttribute('placeholders'); - } - else - { - value.setAttribute('placeholders', '1'); - } - }); - - replace.appendChild(input); - mxUtils.write(replace, mxResources.get('placeholders')); - - if (EditDataDialog.placeholderHelpLink != null) - { - var link = document.createElement('a'); - link.setAttribute('href', EditDataDialog.placeholderHelpLink); - link.setAttribute('title', mxResources.get('help')); - link.setAttribute('target', '_blank'); - link.style.marginLeft = '10px'; - link.style.cursor = 'help'; - - var icon = document.createElement('img'); - icon.setAttribute('border', '0'); - icon.setAttribute('valign', 'middle'); - icon.style.marginTop = (mxClient.IS_IE11) ? '0px' : '-4px'; - icon.setAttribute('src', Editor.helpImage); - link.appendChild(icon); - - replace.appendChild(link); - } - - buttons.appendChild(replace); - } - - if (ui.editor.cancelFirst) - { - buttons.appendChild(cancelBtn); - buttons.appendChild(applyBtn); - } - else - { - buttons.appendChild(applyBtn); - buttons.appendChild(cancelBtn); - } - - div.appendChild(buttons); - this.container = div; -}; - -/** - * Optional help link. - */ -EditDataDialog.getDisplayIdForCell = function(ui, cell) -{ - var id = null; - - if (ui.editor.graph.getModel().getParent(cell) != null) - { - id = cell.getId(); - } - - return id; -}; - -/** - * Optional help link. - */ -EditDataDialog.placeholderHelpLink = null; - -/** - * Constructs a new link dialog. - */ -var LinkDialog = function(editorUi, initialValue, btnLabel, fn) -{ - var div = document.createElement('div'); - mxUtils.write(div, mxResources.get('editLink') + ':'); - - var inner = document.createElement('div'); - inner.className = 'geTitle'; - inner.style.backgroundColor = 'transparent'; - inner.style.borderColor = 'transparent'; - inner.style.whiteSpace = 'nowrap'; - inner.style.textOverflow = 'clip'; - inner.style.cursor = 'default'; - - if (!mxClient.IS_VML) - { - inner.style.paddingRight = '20px'; - } - - var linkInput = document.createElement('input'); - linkInput.setAttribute('value', initialValue); - linkInput.setAttribute('placeholder', 'http://www.example.com/'); - linkInput.setAttribute('type', 'text'); - linkInput.style.marginTop = '6px'; - linkInput.style.width = '400px'; - linkInput.style.backgroundImage = 'url(\'' + Dialog.prototype.clearImage + '\')'; - linkInput.style.backgroundRepeat = 'no-repeat'; - linkInput.style.backgroundPosition = '100% 50%'; - linkInput.style.paddingRight = '14px'; - - var cross = document.createElement('div'); - cross.setAttribute('title', mxResources.get('reset')); - cross.style.position = 'relative'; - cross.style.left = '-16px'; - cross.style.width = '12px'; - cross.style.height = '14px'; - cross.style.cursor = 'pointer'; - - // Workaround for inline-block not supported in IE - cross.style.display = (mxClient.IS_VML) ? 'inline' : 'inline-block'; - cross.style.top = ((mxClient.IS_VML) ? 0 : 3) + 'px'; - - // Needed to block event transparency in IE - cross.style.background = 'url(' + IMAGE_PATH + '/transparent.gif)'; - - mxEvent.addListener(cross, 'click', function() - { - linkInput.value = ''; - linkInput.focus(); - }); - - inner.appendChild(linkInput); - inner.appendChild(cross); - div.appendChild(inner); - - this.init = function() - { - linkInput.focus(); - - if (mxClient.IS_GC || mxClient.IS_FF || document.documentMode >= 5 || mxClient.IS_QUIRKS) - { - linkInput.select(); - } - else - { - document.execCommand('selectAll', false, null); - } - }; - - var btns = document.createElement('div'); - btns.style.marginTop = '18px'; - btns.style.textAlign = 'right'; - - mxEvent.addListener(linkInput, 'keypress', function(e) - { - if (e.keyCode == 13) - { - editorUi.hideDialog(); - fn(linkInput.value); - } - }); - - var cancelBtn = mxUtils.button(mxResources.get('cancel'), function() - { - editorUi.hideDialog(); - }); - cancelBtn.className = 'geBtn'; - - if (editorUi.editor.cancelFirst) - { - btns.appendChild(cancelBtn); - } - - var mainBtn = mxUtils.button(btnLabel, function() - { - editorUi.hideDialog(); - fn(linkInput.value); - }); - mainBtn.className = 'geBtn gePrimaryBtn'; - btns.appendChild(mainBtn); - - if (!editorUi.editor.cancelFirst) - { - btns.appendChild(cancelBtn); - } - - div.appendChild(btns); - - this.container = div; -}; - -/** - * - */ -var OutlineWindow = function(editorUi, x, y, w, h) -{ - var graph = editorUi.editor.graph; - - var div = document.createElement('div'); - div.style.position = 'absolute'; - div.style.width = '100%'; - div.style.height = '100%'; - div.style.border = '1px solid whiteSmoke'; - div.style.overflow = 'hidden'; - - this.window = new mxWindow(mxResources.get('outline'), div, x, y, w, h, true, true); - this.window.minimumSize = new mxRectangle(0, 0, 80, 80); - this.window.destroyOnClose = false; - this.window.setMaximizable(false); - this.window.setResizable(true); - this.window.setClosable(true); - this.window.setVisible(true); - - this.window.setLocation = function(x, y) - { - var iw = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; - var ih = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; - - x = Math.max(0, Math.min(x, iw - this.table.clientWidth)); - y = Math.max(0, Math.min(y, ih - this.table.clientHeight - 48)); - - if (this.getX() != x || this.getY() != y) - { - mxWindow.prototype.setLocation.apply(this, arguments); - } - }; - - var resizeListener = mxUtils.bind(this, function() - { - var x = this.window.getX(); - var y = this.window.getY(); - - this.window.setLocation(x, y); - }); - - mxEvent.addListener(window, 'resize', resizeListener); - - var outline = editorUi.createOutline(this.window); - - this.destroy = function() - { - mxEvent.removeListener(window, 'resize', resizeListener); - this.window.destroy(); - outline.destroy(); - } - - this.window.addListener(mxEvent.RESIZE, mxUtils.bind(this, function() - { - outline.update(false); - outline.outline.sizeDidChange(); - })); - - this.window.addListener(mxEvent.SHOW, mxUtils.bind(this, function() - { - outline.suspended = false; - outline.outline.refresh(); - outline.update(); - })); - - this.window.addListener(mxEvent.HIDE, mxUtils.bind(this, function() - { - outline.suspended = true; - })); - - this.window.addListener(mxEvent.NORMALIZE, mxUtils.bind(this, function() - { - outline.suspended = false; - outline.update(); - })); - - this.window.addListener(mxEvent.MINIMIZE, mxUtils.bind(this, function() - { - outline.suspended = true; - })); - - var outlineCreateGraph = outline.createGraph; - outline.createGraph = function(container) - { - var g = outlineCreateGraph.apply(this, arguments); - g.gridEnabled = false; - g.pageScale = graph.pageScale; - g.pageFormat = graph.pageFormat; - g.background = (graph.background == null || graph.background == mxConstants.NONE) ? graph.defaultPageBackgroundColor : graph.background; - g.pageVisible = graph.pageVisible; - - var current = mxUtils.getCurrentStyle(graph.container); - div.style.backgroundColor = current.backgroundColor; - - return g; - }; - - function update() - { - outline.outline.pageScale = graph.pageScale; - outline.outline.pageFormat = graph.pageFormat; - outline.outline.pageVisible = graph.pageVisible; - outline.outline.background = (graph.background == null || graph.background == mxConstants.NONE) ? graph.defaultPageBackgroundColor : graph.background;; - - var current = mxUtils.getCurrentStyle(graph.container); - div.style.backgroundColor = current.backgroundColor; - - if (graph.view.backgroundPageShape != null && outline.outline.view.backgroundPageShape != null) - { - outline.outline.view.backgroundPageShape.fill = graph.view.backgroundPageShape.fill; - } - - outline.outline.refresh(); - }; - - outline.init(div); - - editorUi.editor.addListener('resetGraphView', update); - editorUi.addListener('pageFormatChanged', update); - editorUi.addListener('backgroundColorChanged', update); - editorUi.addListener('backgroundImageChanged', update); - editorUi.addListener('pageViewChanged', function() - { - update(); - outline.update(true); - }); - - if (outline.outline.dialect == mxConstants.DIALECT_SVG) - { - var zoomInAction = editorUi.actions.get('zoomIn'); - var zoomOutAction = editorUi.actions.get('zoomOut'); - - mxEvent.addMouseWheelListener(function(evt, up) - { - var outlineWheel = false; - var source = mxEvent.getSource(evt); - - while (source != null) - { - if (source == outline.outline.view.canvas.ownerSVGElement) - { - outlineWheel = true; - break; - } - - source = source.parentNode; - } - - if (outlineWheel) - { - if (up) - { - zoomInAction.funct(); - } - else - { - zoomOutAction.funct(); - } - - mxEvent.consume(evt); - } - }); - } -}; - -/** - * - */ -var LayersWindow = function(editorUi, x, y, w, h) -{ - var graph = editorUi.editor.graph; - - var div = document.createElement('div'); - div.style.userSelect = 'none'; - div.style.background = (Dialog.backdropColor == 'white') ? 'whiteSmoke' : Dialog.backdropColor; - div.style.border = '1px solid whiteSmoke'; - div.style.height = '100%'; - div.style.marginBottom = '10px'; - div.style.overflow = 'auto'; - - var tbarHeight = (!EditorUi.compactUi) ? '30px' : '26px'; - - var listDiv = document.createElement('div') - listDiv.style.backgroundColor = (Dialog.backdropColor == 'white') ? '#dcdcdc' : '#e5e5e5'; - listDiv.style.position = 'absolute'; - listDiv.style.overflow = 'auto'; - listDiv.style.left = '0px'; - listDiv.style.right = '0px'; - listDiv.style.top = '0px'; - listDiv.style.bottom = (parseInt(tbarHeight) + 7) + 'px'; - div.appendChild(listDiv); - - var dragSource = null; - var dropIndex = null; - - mxEvent.addListener(div, 'dragover', function(evt) - { - evt.dataTransfer.dropEffect = 'move'; - dropIndex = 0; - evt.stopPropagation(); - evt.preventDefault(); - }); - - // Workaround for "no element found" error in FF - mxEvent.addListener(div, 'drop', function(evt) - { - evt.stopPropagation(); - evt.preventDefault(); - }); - - var layerCount = null; - var selectionLayer = null; - - var ldiv = document.createElement('div'); - - ldiv.className = 'geToolbarContainer'; - ldiv.style.position = 'absolute'; - ldiv.style.bottom = '0px'; - ldiv.style.left = '0px'; - ldiv.style.right = '0px'; - ldiv.style.height = tbarHeight; - ldiv.style.overflow = 'hidden'; - ldiv.style.padding = (!EditorUi.compactUi) ? '1px' : '4px 0px 3px 0px'; - ldiv.style.backgroundColor = (Dialog.backdropColor == 'white') ? 'whiteSmoke' : Dialog.backdropColor; - ldiv.style.borderWidth = '1px 0px 0px 0px'; - ldiv.style.borderColor = '#c3c3c3'; - ldiv.style.borderStyle = 'solid'; - ldiv.style.display = 'block'; - ldiv.style.whiteSpace = 'nowrap'; - - if (mxClient.IS_QUIRKS) - { - ldiv.style.filter = 'none'; - } - - var link = document.createElement('a'); - link.className = 'geButton'; - - if (mxClient.IS_QUIRKS) - { - link.style.filter = 'none'; - } - - var removeLink = link.cloneNode(); - removeLink.innerHTML = '
'; - - mxEvent.addListener(removeLink, 'click', function(evt) - { - if (graph.isEnabled()) - { - graph.model.beginUpdate(); - try - { - var index = graph.model.root.getIndex(selectionLayer); - graph.removeCells([selectionLayer], false); - - // Creates default layer if no layer exists - if (graph.model.getChildCount(graph.model.root) == 0) - { - graph.model.add(graph.model.root, new mxCell()); - graph.setDefaultParent(null); - } - else if (index > 0 && index <= graph.model.getChildCount(graph.model.root)) - { - graph.setDefaultParent(graph.model.getChildAt(graph.model.root, index - 1)); - } - else - { - graph.setDefaultParent(null); - } - } - finally - { - graph.model.endUpdate(); - } - } - - mxEvent.consume(evt); - }); - - if (!graph.isEnabled()) - { - removeLink.className = 'geButton mxDisabled'; - } - - ldiv.appendChild(removeLink); - - var insertLink = link.cloneNode(); - insertLink.innerHTML = '
'; - - mxEvent.addListener(insertLink, 'click', function(evt) - { - if (graph.isEnabled() && !graph.isSelectionEmpty()) - { - graph.moveCells(graph.getSelectionCells(), 0, 0, false, selectionLayer); - } - }); - - ldiv.appendChild(insertLink); - - var dataLink = link.cloneNode(); - dataLink.innerHTML = '
'; - dataLink.setAttribute('title', mxResources.get('rename')); - - mxEvent.addListener(dataLink, 'click', function(evt) - { - if (graph.isEnabled()) - { - editorUi.showDataDialog(selectionLayer); - } - - mxEvent.consume(evt); - }); - - if (!graph.isEnabled()) - { - dataLink.className = 'geButton mxDisabled'; - } - - ldiv.appendChild(dataLink); - - function renameLayer(layer) - { - if (graph.isEnabled() && layer != null) - { - var label = graph.convertValueToString(layer); - var dlg = new FilenameDialog(editorUi, label || mxResources.get('background'), mxResources.get('rename'), mxUtils.bind(this, function(newValue) - { - if (newValue != null) - { - graph.cellLabelChanged(layer, newValue); - } - }), mxResources.get('enterName')); - editorUi.showDialog(dlg.container, 300, 100, true, true); - dlg.init(); - } - }; - - var duplicateLink = link.cloneNode(); - duplicateLink.innerHTML = '
'; - - mxEvent.addListener(duplicateLink, 'click', function(evt) - { - if (graph.isEnabled()) - { - var newCell = null; - graph.model.beginUpdate(); - try - { - newCell = graph.cloneCells([selectionLayer])[0]; - graph.cellLabelChanged(newCell, mxResources.get('untitledLayer')); - newCell.setVisible(true); - newCell = graph.addCell(newCell, graph.model.root); - graph.setDefaultParent(newCell); - } - finally - { - graph.model.endUpdate(); - } - - if (newCell != null && !graph.isCellLocked(newCell)) - { - graph.selectAll(newCell); - } - } - }); - - if (!graph.isEnabled()) - { - duplicateLink.className = 'geButton mxDisabled'; - } - - ldiv.appendChild(duplicateLink); - - var addLink = link.cloneNode(); - addLink.innerHTML = '
'; - addLink.setAttribute('title', mxResources.get('addLayer')); - - mxEvent.addListener(addLink, 'click', function(evt) - { - if (graph.isEnabled()) - { - graph.model.beginUpdate(); - - try - { - var cell = graph.addCell(new mxCell(mxResources.get('untitledLayer')), graph.model.root); - graph.setDefaultParent(cell); - } - finally - { - graph.model.endUpdate(); - } - } - - mxEvent.consume(evt); - }); - - if (!graph.isEnabled()) - { - addLink.className = 'geButton mxDisabled'; - } - - ldiv.appendChild(addLink); - - div.appendChild(ldiv); - - function refresh() - { - layerCount = graph.model.getChildCount(graph.model.root) - listDiv.innerHTML = ''; - - function addLayer(index, label, child, defaultParent) - { - var ldiv = document.createElement('div'); - ldiv.className = 'geToolbarContainer'; - - ldiv.style.overflow = 'hidden'; - ldiv.style.position = 'relative'; - ldiv.style.padding = '4px'; - ldiv.style.height = '22px'; - ldiv.style.display = 'block'; - ldiv.style.backgroundColor = 'whiteSmoke'; - ldiv.style.borderWidth = '0px 0px 1px 0px'; - ldiv.style.borderColor = '#c3c3c3'; - ldiv.style.borderStyle = 'solid'; - ldiv.style.whiteSpace = 'nowrap'; - ldiv.setAttribute('title', label); - - var left = document.createElement('div'); - left.style.display = 'inline-block'; - left.style.width = '100%'; - left.style.textOverflow = 'ellipsis'; - left.style.overflow = 'hidden'; - - mxEvent.addListener(ldiv, 'dragover', function(evt) - { - evt.dataTransfer.dropEffect = 'move'; - dropIndex = index; - evt.stopPropagation(); - evt.preventDefault(); - }); - - mxEvent.addListener(ldiv, 'dragstart', function(evt) - { - dragSource = ldiv; - - // Workaround for no DnD on DIV in FF - if (mxClient.IS_FF) - { - // LATER: Check what triggers a parse as XML on this in FF after drop - evt.dataTransfer.setData('Text', ''); - } - }); - - mxEvent.addListener(ldiv, 'dragend', function(evt) - { - if (dragSource != null && dropIndex != null) - { - graph.addCell(child, graph.model.root, dropIndex); - } - - dragSource = null; - dropIndex = null; - evt.stopPropagation(); - evt.preventDefault(); - }); - - var btn = document.createElement('img'); - btn.setAttribute('draggable', 'false'); - btn.setAttribute('align', 'top'); - btn.setAttribute('border', '0'); - btn.style.padding = '4px'; - btn.setAttribute('title', mxResources.get('lockUnlock')); - - var state = graph.view.getState(child); - var style = (state != null) ? state.style : graph.getCellStyle(child); - - if (mxUtils.getValue(style, 'locked', '0') == '1') - { - btn.setAttribute('src', Dialog.prototype.lockedImage); - } - else - { - btn.setAttribute('src', Dialog.prototype.unlockedImage); - } - - if (graph.isEnabled()) - { - btn.style.cursor = 'pointer'; - } - - mxEvent.addListener(btn, 'click', function(evt) - { - if (graph.isEnabled()) - { - var value = null; - - graph.getModel().beginUpdate(); - try - { - value = (mxUtils.getValue(style, 'locked', '0') == '1') ? null : '1'; - graph.setCellStyles('locked', value, [child]); - } - finally - { - graph.getModel().endUpdate(); - } - - if (value == '1') - { - graph.removeSelectionCells(graph.getModel().getDescendants(child)); - } - - mxEvent.consume(evt); - } - }); - - left.appendChild(btn); - - var inp = document.createElement('input'); - inp.setAttribute('type', 'checkbox'); - inp.setAttribute('title', mxResources.get('hideIt', [child.value || mxResources.get('background')])); - inp.style.marginLeft = '4px'; - inp.style.marginRight = '6px'; - inp.style.marginTop = '4px'; - left.appendChild(inp); - - if (graph.model.isVisible(child)) - { - inp.setAttribute('checked', 'checked'); - inp.defaultChecked = true; - } - - mxEvent.addListener(inp, 'click', function(evt) - { - graph.model.setVisible(child, !graph.model.isVisible(child)); - mxEvent.consume(evt); - }); - - mxUtils.write(left, label); - ldiv.appendChild(left); - - if (graph.isEnabled()) - { - // Fallback if no drag and drop is available - if (mxClient.IS_TOUCH || mxClient.IS_POINTER || mxClient.IS_VML || - (mxClient.IS_IE && document.documentMode < 10)) - { - var right = document.createElement('div'); - right.style.display = 'block'; - right.style.textAlign = 'right'; - right.style.whiteSpace = 'nowrap'; - right.style.position = 'absolute'; - right.style.right = '6px'; - right.style.top = '6px'; - - // Poor man's change layer order - if (index > 0) - { - var img2 = document.createElement('a'); - - img2.setAttribute('title', mxResources.get('toBack')); - - img2.className = 'geButton'; - img2.style.cssFloat = 'none'; - img2.innerHTML = '▼'; - img2.style.width = '14px'; - img2.style.height = '14px'; - img2.style.fontSize = '14px'; - img2.style.margin = '0px'; - img2.style.marginTop = '-1px'; - right.appendChild(img2); - - mxEvent.addListener(img2, 'click', function(evt) - { - if (graph.isEnabled()) - { - graph.addCell(child, graph.model.root, index - 1); - } - - mxEvent.consume(evt); - }); - } - - if (index >= 0 && index < layerCount - 1) - { - var img1 = document.createElement('a'); - - img1.setAttribute('title', mxResources.get('toFront')); - - img1.className = 'geButton'; - img1.style.cssFloat = 'none'; - img1.innerHTML = '▲'; - img1.style.width = '14px'; - img1.style.height = '14px'; - img1.style.fontSize = '14px'; - img1.style.margin = '0px'; - img1.style.marginTop = '-1px'; - right.appendChild(img1); - - mxEvent.addListener(img1, 'click', function(evt) - { - if (graph.isEnabled()) - { - graph.addCell(child, graph.model.root, index + 1); - } - - mxEvent.consume(evt); - }); - } - - ldiv.appendChild(right); - } - - if (mxClient.IS_SVG && (!mxClient.IS_IE || document.documentMode >= 10)) - { - ldiv.setAttribute('draggable', 'true'); - ldiv.style.cursor = 'move'; - } - } - - mxEvent.addListener(ldiv, 'dblclick', function(evt) - { - var nodeName = mxEvent.getSource(evt).nodeName; - - if (nodeName != 'INPUT' && nodeName != 'IMG') - { - renameLayer(child); - mxEvent.consume(evt); - } - }); - - if (graph.getDefaultParent() == child) - { - ldiv.style.background = '#e6eff8'; - ldiv.style.fontWeight = (graph.isEnabled()) ? 'bold' : ''; - selectionLayer = child; - } - else - { - mxEvent.addListener(ldiv, 'click', function(evt) - { - if (graph.isEnabled()) - { - graph.setDefaultParent(defaultParent); - graph.view.setCurrentRoot(null); - refresh(); - } - }); - } - - listDiv.appendChild(ldiv); - }; - - // Cannot be moved or deleted - for (var i = layerCount - 1; i >= 0; i--) - { - (mxUtils.bind(this, function(child) - { - addLayer(i, graph.convertValueToString(child) || - mxResources.get('background'), child, child); - }))(graph.model.getChildAt(graph.model.root, i)); - } - - var label = graph.convertValueToString(selectionLayer) || mxResources.get('background'); - removeLink.setAttribute('title', mxResources.get('removeIt', [label])); - insertLink.setAttribute('title', mxResources.get('moveSelectionTo', [label])); - duplicateLink.setAttribute('title', mxResources.get('duplicateIt', [label])); - dataLink.setAttribute('title', mxResources.get('editData')); - - if (graph.isSelectionEmpty()) - { - insertLink.className = 'geButton mxDisabled'; - } - }; - - refresh(); - graph.model.addListener(mxEvent.CHANGE, function() - { - refresh(); - }); - - graph.selectionModel.addListener(mxEvent.CHANGE, function() - { - if (graph.isSelectionEmpty()) - { - insertLink.className = 'geButton mxDisabled'; - } - else - { - insertLink.className = 'geButton'; - } - }); - - this.window = new mxWindow(mxResources.get('layers'), div, x, y, w, h, true, true); - this.window.minimumSize = new mxRectangle(0, 0, 120, 120); - this.window.destroyOnClose = false; - this.window.setMaximizable(false); - this.window.setResizable(true); - this.window.setClosable(true); - this.window.setVisible(true); - - // Make refresh available via instance - this.refreshLayers = refresh; - - this.window.setLocation = function(x, y) - { - var iw = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; - var ih = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; - - x = Math.max(0, Math.min(x, iw - this.table.clientWidth)); - y = Math.max(0, Math.min(y, ih - this.table.clientHeight - 48)); - - if (this.getX() != x || this.getY() != y) - { - mxWindow.prototype.setLocation.apply(this, arguments); - } - }; - - var resizeListener = mxUtils.bind(this, function() - { - var x = this.window.getX(); - var y = this.window.getY(); - - this.window.setLocation(x, y); - }); - - mxEvent.addListener(window, 'resize', resizeListener); - - this.destroy = function() - { - mxEvent.removeListener(window, 'resize', resizeListener); - this.window.destroy(); - } -}; diff --git a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/Format.js b/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/Format.js deleted file mode 100644 index 981272f1..00000000 --- a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/Format.js +++ /dev/null @@ -1,5511 +0,0 @@ -/** - * Copyright (c) 2006-2012, JGraph Ltd - */ -Format = function(editorUi, container) -{ - this.editorUi = editorUi; - this.container = container; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.labelIndex = 0; - -/** - * Returns information about the current selection. - */ -Format.prototype.currentIndex = 0; - -/** - * Returns information about the current selection. - */ -Format.prototype.showCloseButton = true; - -/** - * Background color for inactive tabs. - */ -Format.prototype.inactiveTabBackgroundColor = '#d7d7d7'; - -/** - * Background color for inactive tabs. - */ -Format.prototype.roundableShapes = ['label', 'rectangle', 'internalStorage', 'corner', - 'parallelogram', 'swimlane', 'triangle', 'trapezoid', - 'ext', 'step', 'tee', 'process', 'link', - 'rhombus', 'offPageConnector', 'loopLimit', 'hexagon', - 'manualInput', 'curlyBracket', 'singleArrow', 'callout', - 'doubleArrow', 'flexArrow', 'card', 'umlLifeline']; - -/** - * Adds the label menu items to the given menu and parent. - */ -Format.prototype.init = function() -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - this.update = mxUtils.bind(this, function(sender, evt) - { - this.clearSelectionState(); - this.refresh(); - }); - - graph.getSelectionModel().addListener(mxEvent.CHANGE, this.update); - graph.addListener(mxEvent.EDITING_STARTED, this.update); - graph.addListener(mxEvent.EDITING_STOPPED, this.update); - graph.getModel().addListener(mxEvent.CHANGE, this.update); - graph.addListener(mxEvent.ROOT, mxUtils.bind(this, function() - { - this.refresh(); - })); - - editor.addListener('autosaveChanged', mxUtils.bind(this, function() - { - this.refresh(); - })); - - this.refresh(); -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.clearSelectionState = function() -{ - this.selectionState = null; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.getSelectionState = function() -{ - if (this.selectionState == null) - { - this.selectionState = this.createSelectionState(); - } - - return this.selectionState; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.createSelectionState = function() -{ - var cells = this.editorUi.editor.graph.getSelectionCells(); - var result = this.initSelectionState(); - - for (var i = 0; i < cells.length; i++) - { - this.updateSelectionStateForCell(result, cells[i], cells); - } - - return result; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.initSelectionState = function() -{ - return {vertices: [], edges: [], x: null, y: null, width: null, height: null, style: {}, - containsImage: false, containsLabel: false, fill: true, glass: true, rounded: true, - comic: true, autoSize: false, image: true, shadow: true, lineJumps: true}; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.updateSelectionStateForCell = function(result, cell, cells) -{ - var graph = this.editorUi.editor.graph; - - if (graph.getModel().isVertex(cell)) - { - result.vertices.push(cell); - var geo = graph.getCellGeometry(cell); - - if (geo != null) - { - if (geo.width > 0) - { - if (result.width == null) - { - result.width = geo.width; - } - else if (result.width != geo.width) - { - result.width = ''; - } - } - else - { - result.containsLabel = true; - } - - if (geo.height > 0) - { - if (result.height == null) - { - result.height = geo.height; - } - else if (result.height != geo.height) - { - result.height = ''; - } - } - else - { - result.containsLabel = true; - } - - if (!geo.relative || geo.offset != null) - { - var x = (geo.relative) ? geo.offset.x : geo.x; - var y = (geo.relative) ? geo.offset.y : geo.y; - - if (result.x == null) - { - result.x = x; - } - else if (result.x != x) - { - result.x = ''; - } - - if (result.y == null) - { - result.y = y; - } - else if (result.y != y) - { - result.y = ''; - } - } - } - } - else if (graph.getModel().isEdge(cell)) - { - result.edges.push(cell); - } - - var state = graph.view.getState(cell); - - if (state != null) - { - result.autoSize = result.autoSize || this.isAutoSizeState(state); - result.glass = result.glass && this.isGlassState(state); - result.rounded = result.rounded && this.isRoundedState(state); - result.lineJumps = result.lineJumps && this.isLineJumpState(state); - result.comic = result.comic && this.isComicState(state); - result.image = result.image && this.isImageState(state); - result.shadow = result.shadow && this.isShadowState(state); - result.fill = result.fill && this.isFillState(state); - - var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - result.containsImage = result.containsImage || shape == 'image'; - - for (var key in state.style) - { - var value = state.style[key]; - - if (value != null) - { - if (result.style[key] == null) - { - result.style[key] = value; - } - else if (result.style[key] != value) - { - result.style[key] = ''; - } - } - } - } -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isFillState = function(state) -{ - return state.view.graph.model.isVertex(state.cell) || - mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null) == 'arrow' || - mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null) == 'filledEdge' || - mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null) == 'flexArrow'; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isGlassState = function(state) -{ - var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - - return (shape == 'label' || shape == 'rectangle' || shape == 'internalStorage' || - shape == 'ext' || shape == 'umlLifeline' || shape == 'swimlane' || - shape == 'process'); -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isRoundedState = function(state) -{ - return (state.shape != null) ? state.shape.isRoundable() : - mxUtils.indexOf(this.roundableShapes, mxUtils.getValue(state.style, - mxConstants.STYLE_SHAPE, null)) >= 0; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isLineJumpState = function(state) -{ - var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - var curved = mxUtils.getValue(state.style, mxConstants.STYLE_CURVED, false); - - return !curved && (shape == 'connector' || shape == 'filledEdge'); -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isComicState = function(state) -{ - var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - - return mxUtils.indexOf(['label', 'rectangle', 'internalStorage', 'corner', 'parallelogram', 'note', 'collate', - 'swimlane', 'triangle', 'trapezoid', 'ext', 'step', 'tee', 'process', 'link', 'rhombus', - 'offPageConnector', 'loopLimit', 'hexagon', 'manualInput', 'singleArrow', 'doubleArrow', - 'flexArrow', 'filledEdge', 'card', 'umlLifeline', 'connector', 'folder', 'component', 'sortShape', - 'cross', 'umlFrame', 'cube', 'isoCube', 'isoRectangle', 'partialRectangle'], shape) >= 0; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isAutoSizeState = function(state) -{ - return mxUtils.getValue(state.style, mxConstants.STYLE_AUTOSIZE, null) == '1'; -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isImageState = function(state) -{ - var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - - return (shape == 'label' || shape == 'image'); -}; - -/** - * Returns information about the current selection. - */ -Format.prototype.isShadowState = function(state) -{ - var shape = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - - return (shape != 'image'); -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -Format.prototype.clear = function() -{ - this.container.innerHTML = ''; - - // Destroy existing panels - if (this.panels != null) - { - for (var i = 0; i < this.panels.length; i++) - { - this.panels[i].destroy(); - } - } - - this.panels = []; -}; - - -Format.prototype.getTabs =function(){ - return -} - -//begin add by wsp================================================================== -/** - * 获取格式化面板包含的格式化 tab 数组 - */ -Format.prototype.getDiagramFormaters =function(){ - var result =[]; - var index =0; - var ui = this.editorUi; - var graph = ui.editor.graph; - if (graph.isSelectionEmpty()){ - result[index++] ='diagram'; - }else if(graph.isEditing()){ - result[index++] ='text'; - }else{ - //是否是正在编辑连线上的文本 - var containsLabel = this.getSelectionState().containsLabel; - if(containsLabel){ - result[index++] ='text'; - result[index++] ='arrange'; - }else{ - result[index++] ='style'; - result[index++] ='text'; - result[index++] ='arrange'; - } - } - return result; -} - -/** - * 创建 tab 容器 Div - */ -Format.prototype.createTabContainerlDiv =function(){ - var div = document.createElement('div'); - div.style.whiteSpace = 'nowrap'; - div.style.color = 'rgb(112, 112, 112)'; - div.style.textAlign = 'left'; - div.style.cursor = 'default'; - this.container.appendChild(div); - return div; -} - -/** - * 创建 tab 项 Div - */ -Format.prototype.createTabItemLabelDiv =function(){ - var label = document.createElement('div'); - label.style.border = '1px solid #c0c0c0'; - label.style.borderWidth = '0px 0px 1px 0px'; - label.style.textAlign = 'center'; - label.style.fontWeight = 'bold'; - label.style.overflow = 'hidden'; - label.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; - label.style.paddingTop = '8px'; - label.style.height = (mxClient.IS_QUIRKS) ? '34px' : '25px'; - return label; -} - -/** - * 创建 tab panel Div - */ -Format.prototype.createTabPanelDiv =function(){ - var div = document.createElement('div'); - div.style.whiteSpace = 'nowrap'; - div.style.color = 'rgb(112, 112, 112)'; - div.style.textAlign = 'left'; - div.style.cursor = 'default'; - this.container.appendChild(div); - return div; -} -//end add by wsp================================================================== - -/** - * Adds the label menu items to the given menu and parent. - */ -Format.prototype.refresh = function() -{ - if (this.container.style.width == '0px'){ - return; - } - - this.clear(); - - var ui = this.editorUi; - var graph = ui.editor.graph; - - var tabContainerlDiv =this.createTabContainerlDiv(); - this.container.appendChild(tabContainerlDiv); - - var tabs =this.getDiagramFormaters(); - if(tabs){ - var containsLabel = this.getSelectionState().containsLabel; - var currentLabel = null; - var currentPanel = null; - - var addClickHandler = mxUtils.bind(this, function(elt, panel, index) - { - var clickHandler = mxUtils.bind(this, function(evt) - { - if (currentLabel != elt) - { - if (containsLabel) - { - this.labelIndex = index; - } - else - { - this.currentIndex = index; - } - - if (currentLabel != null) - { - currentLabel.style.backgroundColor = this.inactiveTabBackgroundColor; - currentLabel.style.borderBottomWidth = '1px'; - } - - currentLabel = elt; - currentLabel.style.backgroundColor = ''; - currentLabel.style.borderBottomWidth = '0px'; - - if (currentPanel != panel) - { - if (currentPanel != null) - { - currentPanel.style.display = 'none'; - } - - currentPanel = panel; - currentPanel.style.display = ''; - } - } - }); - - mxEvent.addListener(elt, 'click', clickHandler); - - if (index == ((containsLabel) ? this.labelIndex : this.currentIndex)) - { - // Invokes handler directly as a workaround for no click on DIV in KHTML. - clickHandler(); - } - }); - - var tabWidth =100/tabs.length + '%'; - var isMultiTab =tabs.length>1; - for(var i=0;i0){ - label.style.borderLeftWidth = '1px'; - } - }else{ - label.style.borderLeftWidth = '0px'; - } - - var panel =null; - - if(tab=='configure'){ - mxUtils.write(label, mxResources.get(tab)); - panel =new ConfigureFormatPanel(this, ui, panelDiv); - }else if(tab=='diagram'){ - mxUtils.write(label, mxResources.get(tab)); - panel =new DiagramFormatPanel(this, ui, panelDiv); - }else if(tab=='text'){ - mxUtils.write(label, mxResources.get(tab)); - panel =new TextFormatPanel(this, ui, panelDiv); - }else if(tab=='style'){ - mxUtils.write(label, mxResources.get(tab)); - panel =new StyleFormatPanel(this, ui, panelDiv); - }else if(tab=='arrange'){ - mxUtils.write(label, mxResources.get(tab)); - panel =new ArrangePanel(this, ui, panelDiv); - } - - tabContainerlDiv.appendChild(label); - this.panels.push(panel); - this.container.appendChild(panelDiv); - - if(tabs.length>1){ - addClickHandler(label, panelDiv, i); - } - } - } -}; - -/** - * Base class for format panels. - */ -BaseFormatPanel = function(format, editorUi, container) -{ - this.format = format; - this.editorUi = editorUi; - this.container = container; - this.listeners = []; -}; - -/** - * - */ -BaseFormatPanel.prototype.buttonBackgroundColor = 'white'; - -/** - * Adds the given color option. - */ -BaseFormatPanel.prototype.getSelectionState = function() -{ - var graph = this.editorUi.editor.graph; - var cells = graph.getSelectionCells(); - var shape = null; - - for (var i = 0; i < cells.length; i++) - { - var state = graph.view.getState(cells[i]); - - if (state != null) - { - var tmp = mxUtils.getValue(state.style, mxConstants.STYLE_SHAPE, null); - - if (tmp != null) - { - if (shape == null) - { - shape = tmp; - } - else if (shape != tmp) - { - return null; - } - } - - } - } - - return shape; -}; - -/** - * Install input handler. - */ -BaseFormatPanel.prototype.installInputHandler = function(input, key, defaultValue, min, max, unit, textEditFallback, isFloat) -{ - unit = (unit != null) ? unit : ''; - isFloat = (isFloat != null) ? isFloat : false; - - var ui = this.editorUi; - var graph = ui.editor.graph; - - min = (min != null) ? min : 1; - max = (max != null) ? max : 999; - - var selState = null; - var updating = false; - - var update = mxUtils.bind(this, function(evt) - { - var value = (isFloat) ? parseFloat(input.value) : parseInt(input.value); - - // Special case: angle mod 360 - if (!isNaN(value) && key == mxConstants.STYLE_ROTATION) - { - // Workaround for decimal rounding errors in floats is to - // use integer and round all numbers to two decimal point - value = mxUtils.mod(Math.round(value * 100), 36000) / 100; - } - - value = Math.min(max, Math.max(min, (isNaN(value)) ? defaultValue : value)); - - if (graph.cellEditor.isContentEditing() && textEditFallback) - { - if (!updating) - { - updating = true; - - if (selState != null) - { - graph.cellEditor.restoreSelection(selState); - selState = null; - } - - textEditFallback(value); - input.value = value + unit; - - // Restore focus and selection in input - updating = false; - } - } - else if (value != mxUtils.getValue(this.format.getSelectionState().style, key, defaultValue)) - { - if (graph.isEditing()) - { - graph.stopEditing(true); - } - - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles(key, value, graph.getSelectionCells()); - - // Handles special case for fontSize where HTML labels are parsed and updated - if (key == mxConstants.STYLE_FONTSIZE) - { - graph.updateLabelElements(graph.getSelectionCells(), function(elt) - { - elt.style.fontSize = value + 'px'; - elt.removeAttribute('size'); - }); - } - - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [key], - 'values', [value], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - } - - input.value = value + unit; - mxEvent.consume(evt); - }); - - if (textEditFallback && graph.cellEditor.isContentEditing()) - { - // KNOWN: Arrow up/down clear selection text in quirks/IE 8 - // Text size via arrow button limits to 16 in IE11. Why? - mxEvent.addListener(input, 'mousedown', function() - { - if (document.activeElement == graph.cellEditor.textarea) - { - selState = graph.cellEditor.saveSelection(); - } - }); - - mxEvent.addListener(input, 'touchstart', function() - { - if (document.activeElement == graph.cellEditor.textarea) - { - selState = graph.cellEditor.saveSelection(); - } - }); - } - - mxEvent.addListener(input, 'change', update); - mxEvent.addListener(input, 'blur', update); - - return update; -}; - -/** - * Adds the given option. - */ -BaseFormatPanel.prototype.createPanel = function() -{ - var div = document.createElement('div'); - div.style.padding = '12px 0px 12px 18px'; - div.style.borderBottom = '1px solid #c0c0c0'; - - return div; -}; - -/** - * Adds the given option. - */ -BaseFormatPanel.prototype.createTitle = function(title) -{ - var div = document.createElement('div'); - div.style.padding = '0px 0px 6px 0px'; - div.style.whiteSpace = 'nowrap'; - div.style.overflow = 'hidden'; - div.style.width = '200px'; - div.style.fontWeight = 'bold'; - mxUtils.write(div, title); - - return div; -}; - -/** - * - */ -BaseFormatPanel.prototype.createStepper = function(input, update, step, height, disableFocus, defaultValue) -{ - step = (step != null) ? step : 1; - height = (height != null) ? height : 8; - - if (mxClient.IS_QUIRKS) - { - height = height - 2; - } - else if (mxClient.IS_MT || document.documentMode >= 8) - { - height = height + 1; - } - - var stepper = document.createElement('div'); - mxUtils.setPrefixedStyle(stepper.style, 'borderRadius', '3px'); - stepper.style.border = '1px solid rgb(192, 192, 192)'; - stepper.style.position = 'absolute'; - - var up = document.createElement('div'); - up.style.borderBottom = '1px solid rgb(192, 192, 192)'; - up.style.position = 'relative'; - up.style.height = height + 'px'; - up.style.width = '10px'; - up.className = 'geBtnUp'; - stepper.appendChild(up); - - var down = up.cloneNode(false); - down.style.border = 'none'; - down.style.height = height + 'px'; - down.className = 'geBtnDown'; - stepper.appendChild(down); - - mxEvent.addListener(down, 'click', function(evt) - { - if (input.value == '') - { - input.value = defaultValue || '2'; - } - - var val = parseInt(input.value); - - if (!isNaN(val)) - { - input.value = val - step; - - if (update != null) - { - update(evt); - } - } - - mxEvent.consume(evt); - }); - - mxEvent.addListener(up, 'click', function(evt) - { - if (input.value == '') - { - input.value = defaultValue || '0'; - } - - var val = parseInt(input.value); - - if (!isNaN(val)) - { - input.value = val + step; - - if (update != null) - { - update(evt); - } - } - - mxEvent.consume(evt); - }); - - // Disables transfer of focus to DIV but also :active CSS - // so it's only used for fontSize where the focus should - // stay on the selected text, but not for any other input. - if (disableFocus) - { - var currentSelection = null; - - mxEvent.addGestureListeners(stepper, - function(evt) - { - // Workaround for lost current selection in page because of focus in IE - if (mxClient.IS_QUIRKS || document.documentMode == 8) - { - currentSelection = document.selection.createRange(); - } - - mxEvent.consume(evt); - }, - null, - function(evt) - { - // Workaround for lost current selection in page because of focus in IE - if (currentSelection != null) - { - try - { - currentSelection.select(); - } - catch (e) - { - // ignore - } - - currentSelection = null; - mxEvent.consume(evt); - } - } - ); - } - - return stepper; -}; - -/** - * Adds the given option. - */ -BaseFormatPanel.prototype.createOption = function(label, isCheckedFn, setCheckedFn, listener) -{ - var div = document.createElement('div'); - div.style.padding = '6px 0px 1px 0px'; - div.style.whiteSpace = 'nowrap'; - div.style.overflow = 'hidden'; - div.style.width = '200px'; - div.style.height = (mxClient.IS_QUIRKS) ? '27px' : '18px'; - - var cb = document.createElement('input'); - cb.setAttribute('type', 'checkbox'); - cb.style.margin = '0px 6px 0px 0px'; - div.appendChild(cb); - - var span = document.createElement('span'); - mxUtils.write(span, label); - div.appendChild(span); - - var applying = false; - var value = isCheckedFn(); - - var apply = function(newValue) - { - if (!applying) - { - applying = true; - - if (newValue) - { - cb.setAttribute('checked', 'checked'); - cb.defaultChecked = true; - cb.checked = true; - } - else - { - cb.removeAttribute('checked'); - cb.defaultChecked = false; - cb.checked = false; - } - - if (value != newValue) - { - value = newValue; - - // Checks if the color value needs to be updated in the model - if (isCheckedFn() != value) - { - setCheckedFn(value); - } - } - - applying = false; - } - }; - - mxEvent.addListener(div, 'click', function(evt) - { - if (cb.getAttribute('disabled') != 'disabled') - { - // Toggles checkbox state for click on label - var source = mxEvent.getSource(evt); - - if (source == div || source == span) - { - cb.checked = !cb.checked; - } - - apply(cb.checked); - } - }); - - apply(value); - - if (listener != null) - { - listener.install(apply); - this.listeners.push(listener); - } - - return div; -}; - -/** - * The string 'null' means use null in values. - */ -BaseFormatPanel.prototype.createCellOption = function(label, key, defaultValue, enabledValue, disabledValue, fn, action, stopEditing) -{ - enabledValue = (enabledValue != null) ? ((enabledValue == 'null') ? null : enabledValue) : '1'; - disabledValue = (disabledValue != null) ? ((disabledValue == 'null') ? null : disabledValue) : '0'; - - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - return this.createOption(label, function() - { - // Seems to be null sometimes, not sure why... - var state = graph.view.getState(graph.getSelectionCell()); - - if (state != null) - { - return mxUtils.getValue(state.style, key, defaultValue) != disabledValue; - } - - return null; - }, function(checked) - { - if (stopEditing) - { - graph.stopEditing(); - } - - if (action != null) - { - action.funct(); - } - else - { - graph.getModel().beginUpdate(); - try - { - var value = (checked) ? enabledValue : disabledValue; - graph.setCellStyles(key, value, graph.getSelectionCells()); - - if (fn != null) - { - fn(graph.getSelectionCells(), value); - } - - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [key], - 'values', [value], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - } - }, - { - install: function(apply) - { - this.listener = function() - { - // Seems to be null sometimes, not sure why... - var state = graph.view.getState(graph.getSelectionCell()); - - if (state != null) - { - apply(mxUtils.getValue(state.style, key, defaultValue) != disabledValue); - } - }; - - graph.getModel().addListener(mxEvent.CHANGE, this.listener); - }, - destroy: function() - { - graph.getModel().removeListener(this.listener); - } - }); -}; - -/** - * Adds the given color option. - */ -BaseFormatPanel.prototype.createColorOption = function(label, getColorFn, setColorFn, defaultColor, listener, callbackFn, hideCheckbox) -{ - var div = document.createElement('div'); - div.style.padding = '6px 0px 1px 0px'; - div.style.whiteSpace = 'nowrap'; - div.style.overflow = 'hidden'; - div.style.width = '200px'; - div.style.height = (mxClient.IS_QUIRKS) ? '27px' : '18px'; - - var cb = document.createElement('input'); - cb.setAttribute('type', 'checkbox'); - cb.style.margin = '0px 6px 0px 0px'; - - if (!hideCheckbox) - { - div.appendChild(cb); - } - - var span = document.createElement('span'); - mxUtils.write(span, label); - div.appendChild(span); - - var applying = false; - var value = getColorFn(); - - var btn = null; - - var apply = function(color, disableUpdate, forceUpdate) - { - if (!applying) - { - applying = true; - btn.innerHTML = '
'; - - // Fine-tuning in Firefox, quirks mode and IE8 standards - if (mxClient.IS_QUIRKS || document.documentMode == 8) - { - btn.firstChild.style.margin = '0px'; - } - - if (color != null && color != mxConstants.NONE) - { - cb.setAttribute('checked', 'checked'); - cb.defaultChecked = true; - cb.checked = true; - } - else - { - cb.removeAttribute('checked'); - cb.defaultChecked = false; - cb.checked = false; - } - - btn.style.display = (cb.checked || hideCheckbox) ? '' : 'none'; - - if (callbackFn != null) - { - callbackFn(color); - } - - if (!disableUpdate) - { - value = color; - - // Checks if the color value needs to be updated in the model - if (forceUpdate || hideCheckbox || getColorFn() != value) - { - setColorFn(value); - } - } - - applying = false; - } - }; - - btn = mxUtils.button('', mxUtils.bind(this, function(evt) - { - this.editorUi.pickColor(value, function(color) - { - apply(color, null, true); - }); - mxEvent.consume(evt); - })); - - btn.style.position = 'absolute'; - btn.style.marginTop = '-4px'; - btn.style.right = (mxClient.IS_QUIRKS) ? '0px' : '20px'; - btn.style.height = '22px'; - btn.className = 'geColorBtn'; - btn.style.display = (cb.checked || hideCheckbox) ? '' : 'none'; - div.appendChild(btn); - - mxEvent.addListener(div, 'click', function(evt) - { - var source = mxEvent.getSource(evt); - - if (source == cb || source.nodeName != 'INPUT') - { - // Toggles checkbox state for click on label - if (source != cb) - { - cb.checked = !cb.checked; - } - - // Overrides default value with current value to make it easier - // to restore previous value if the checkbox is clicked twice - if (!cb.checked && value != null && value != mxConstants.NONE && - defaultColor != mxConstants.NONE) - { - defaultColor = value; - } - - apply((cb.checked) ? defaultColor : mxConstants.NONE); - } - }); - - apply(value, true); - - if (listener != null) - { - listener.install(apply); - this.listeners.push(listener); - } - - return div; -}; - -/** - * - */ -BaseFormatPanel.prototype.createCellColorOption = function(label, colorKey, defaultColor, callbackFn, setStyleFn) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - return this.createColorOption(label, function() - { - // Seems to be null sometimes, not sure why... - var state = graph.view.getState(graph.getSelectionCell()); - - if (state != null) - { - return mxUtils.getValue(state.style, colorKey, null); - } - - return null; - }, function(color) - { - graph.getModel().beginUpdate(); - try - { - if (setStyleFn != null) - { - setStyleFn(color); - } - - graph.setCellStyles(colorKey, color, graph.getSelectionCells()); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [colorKey], - 'values', [color], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - }, defaultColor || mxConstants.NONE, - { - install: function(apply) - { - this.listener = function() - { - // Seems to be null sometimes, not sure why... - var state = graph.view.getState(graph.getSelectionCell()); - - if (state != null) - { - apply(mxUtils.getValue(state.style, colorKey, null)); - } - }; - - graph.getModel().addListener(mxEvent.CHANGE, this.listener); - }, - destroy: function() - { - graph.getModel().removeListener(this.listener); - } - }, callbackFn); -}; - -/** - * - */ -BaseFormatPanel.prototype.addArrow = function(elt, height) -{ - height = (height != null) ? height : 10; - - var arrow = document.createElement('div'); - arrow.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; - arrow.style.padding = '6px'; - arrow.style.paddingRight = '4px'; - - var m = (10 - height); - - if (m == 2) - { - arrow.style.paddingTop = 6 + 'px'; - } - else if (m > 0) - { - arrow.style.paddingTop = (6 - m) + 'px'; - } - else - { - arrow.style.marginTop = '-2px'; - } - - arrow.style.height = height + 'px'; - arrow.style.borderLeft = '1px solid #a0a0a0'; - arrow.innerHTML = ''; - mxUtils.setOpacity(arrow, 70); - - var symbol = elt.getElementsByTagName('div')[0]; - - if (symbol != null) - { - symbol.style.paddingRight = '6px'; - symbol.style.marginLeft = '4px'; - symbol.style.marginTop = '-1px'; - symbol.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block'; - mxUtils.setOpacity(symbol, 60); - } - - mxUtils.setOpacity(elt, 100); - elt.style.border = '1px solid #a0a0a0'; - elt.style.backgroundColor = this.buttonBackgroundColor; - elt.style.backgroundImage = 'none'; - elt.style.width = 'auto'; - elt.className += ' geColorBtn'; - mxUtils.setPrefixedStyle(elt.style, 'borderRadius', '3px'); - - elt.appendChild(arrow); - - return symbol; -}; - -/** - * - */ -BaseFormatPanel.prototype.addUnitInput = function(container, unit, right, width, update, step, marginTop, disableFocus) -{ - marginTop = (marginTop != null) ? marginTop : 0; - - var input = document.createElement('input'); - input.style.position = 'absolute'; - input.style.textAlign = 'right'; - input.style.marginTop = '-2px'; - input.style.right = (right + 12) + 'px'; - input.style.width = width + 'px'; - container.appendChild(input); - - var stepper = this.createStepper(input, update, step, null, disableFocus); - stepper.style.marginTop = (marginTop - 2) + 'px'; - stepper.style.right = right + 'px'; - container.appendChild(stepper); - - return input; -}; - -/** - * - */ -BaseFormatPanel.prototype.createRelativeOption = function(label, key, width, handler, init) -{ - width = (width != null) ? width : 44; - - var graph = this.editorUi.editor.graph; - var div = this.createPanel(); - div.style.paddingTop = '10px'; - div.style.paddingBottom = '10px'; - mxUtils.write(div, label); - div.style.fontWeight = 'bold'; - - var update = mxUtils.bind(this, function(evt) - { - if (handler != null) - { - handler(input); - } - else - { - var value = parseInt(input.value); - value = Math.min(100, Math.max(0, (isNaN(value)) ? 100 : value)); - var state = graph.view.getState(graph.getSelectionCell()); - - if (state != null && value != mxUtils.getValue(state.style, key, 100)) - { - // Removes entry in style (assumes 100 is default for relative values) - if (value == 100) - { - value = null; - } - - graph.setCellStyles(key, value, graph.getSelectionCells()); - this.editorUi.fireEvent(new mxEventObject('styleChanged', 'keys', [key], - 'values', [value], 'cells', graph.getSelectionCells())); - } - - input.value = ((value != null) ? value : '100') + ' %'; - } - - mxEvent.consume(evt); - }); - - var input = this.addUnitInput(div, '%', 20, width, update, 10, -15, handler != null); - - if (key != null) - { - var listener = mxUtils.bind(this, function(sender, evt, force) - { - if (force || input != document.activeElement) - { - var ss = this.format.getSelectionState(); - var tmp = parseInt(mxUtils.getValue(ss.style, key, 100)); - input.value = (isNaN(tmp)) ? '' : tmp + ' %'; - } - }); - - mxEvent.addListener(input, 'keydown', function(e) - { - if (e.keyCode == 13) - { - graph.container.focus(); - mxEvent.consume(e); - } - else if (e.keyCode == 27) - { - listener(null, null, true); - graph.container.focus(); - mxEvent.consume(e); - } - }); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - } - - mxEvent.addListener(input, 'blur', update); - mxEvent.addListener(input, 'change', update); - - if (init != null) - { - init(input); - } - - return div; -}; - -/** - * - */ -BaseFormatPanel.prototype.addLabel = function(div, title, right, width) -{ - width = (width != null) ? width : 61; - - var label = document.createElement('div'); - mxUtils.write(label, title); - label.style.position = 'absolute'; - label.style.right = right + 'px'; - label.style.width = width + 'px'; - label.style.marginTop = '6px'; - label.style.textAlign = 'center'; - div.appendChild(label); -}; - -/** - * - */ -BaseFormatPanel.prototype.addKeyHandler = function(input, listener) -{ - mxEvent.addListener(input, 'keydown', mxUtils.bind(this, function(e) - { - if (e.keyCode == 13) - { - this.editorUi.editor.graph.container.focus(); - mxEvent.consume(e); - } - else if (e.keyCode == 27) - { - if (listener != null) - { - listener(null, null, true); - } - - this.editorUi.editor.graph.container.focus(); - mxEvent.consume(e); - } - })); -}; - -/** - * - */ -BaseFormatPanel.prototype.styleButtons = function(elts) -{ - for (var i = 0; i < elts.length; i++) - { - mxUtils.setPrefixedStyle(elts[i].style, 'borderRadius', '3px'); - mxUtils.setOpacity(elts[i], 100); - elts[i].style.border = '1px solid #a0a0a0'; - elts[i].style.padding = '4px'; - elts[i].style.paddingTop = '3px'; - elts[i].style.paddingRight = '1px'; - elts[i].style.margin = '1px'; - elts[i].style.width = '24px'; - elts[i].style.height = '20px'; - elts[i].className += ' geColorBtn'; - } -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -BaseFormatPanel.prototype.destroy = function() -{ - if (this.listeners != null) - { - for (var i = 0; i < this.listeners.length; i++) - { - this.listeners[i].destroy(); - } - - this.listeners = null; - } -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -ArrangePanel = function(format, editorUi, container) -{ - BaseFormatPanel.call(this, format, editorUi, container); - this.init(); -}; - -mxUtils.extend(ArrangePanel, BaseFormatPanel); - -/** - * Adds the label menu items to the given menu and parent. - */ -ArrangePanel.prototype.init = function() -{ - var graph = this.editorUi.editor.graph; - var ss = this.format.getSelectionState(); - - this.container.appendChild(this.addLayerOps(this.createPanel())); - // Special case that adds two panels - this.addGeometry(this.container); - this.addEdgeGeometry(this.container); - - if (!ss.containsLabel || ss.edges.length == 0) - { - this.container.appendChild(this.addAngle(this.createPanel())); - } - - if (!ss.containsLabel && ss.edges.length == 0) - { - this.container.appendChild(this.addFlip(this.createPanel())); - } - - if (ss.vertices.length > 1) - { - this.container.appendChild(this.addAlign(this.createPanel())); - this.container.appendChild(this.addDistribute(this.createPanel())); - } - - this.container.appendChild(this.addGroupOps(this.createPanel())); -}; - -/** - * - */ -ArrangePanel.prototype.addLayerOps = function(div) -{ - var ui = this.editorUi; - - var btn = mxUtils.button(mxResources.get('toFront'), function(evt) - { - ui.actions.get('toFront').funct(); - }) - - btn.setAttribute('title', mxResources.get('toFront') + ' (' + this.editorUi.actions.get('toFront').shortcut + ')'); - btn.style.width = '100px'; - btn.style.marginRight = '2px'; - div.appendChild(btn); - - var btn = mxUtils.button(mxResources.get('toBack'), function(evt) - { - ui.actions.get('toBack').funct(); - }) - - btn.setAttribute('title', mxResources.get('toBack') + ' (' + this.editorUi.actions.get('toBack').shortcut + ')'); - btn.style.width = '100px'; - div.appendChild(btn); - - return div; -}; - -/** - * - */ -ArrangePanel.prototype.addGroupOps = function(div) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var cell = graph.getSelectionCell(); - var ss = this.format.getSelectionState(); - var count = 0; - var btn = null; - - div.style.paddingTop = '8px'; - div.style.paddingBottom = '6px'; - - if (graph.getSelectionCount() > 1) - { - btn = mxUtils.button(mxResources.get('group'), function(evt) - { - ui.actions.get('group').funct(); - }) - - btn.setAttribute('title', mxResources.get('group') + ' (' + this.editorUi.actions.get('group').shortcut + ')'); - btn.style.width = '202px'; - btn.style.marginBottom = '2px'; - div.appendChild(btn); - count++; - } - else if (graph.getSelectionCount() == 1 && !graph.getModel().isEdge(cell) && !graph.isSwimlane(cell) && - graph.getModel().getChildCount(cell) > 0) - { - btn = mxUtils.button(mxResources.get('ungroup'), function(evt) - { - ui.actions.get('ungroup').funct(); - }) - - btn.setAttribute('title', mxResources.get('ungroup') + ' (' + - this.editorUi.actions.get('ungroup').shortcut + ')'); - btn.style.width = '202px'; - btn.style.marginBottom = '2px'; - div.appendChild(btn); - count++; - } - - if (ss.vertices.length > 0) - { - if (count > 0) - { - mxUtils.br(div); - count = 0; - } - - var btn = mxUtils.button(mxResources.get('copySize'), function(evt) - { - ui.actions.get('copySize').funct(); - }); - - btn.setAttribute('title', mxResources.get('copySize') + ' (' + - this.editorUi.actions.get('copySize').shortcut + ')'); - btn.style.width = '202px'; - btn.style.marginBottom = '2px'; - - div.appendChild(btn); - count++; - - if (ui.copiedSize != null) - { - var btn2 = mxUtils.button(mxResources.get('pasteSize'), function(evt) - { - ui.actions.get('pasteSize').funct(); - }); - - btn2.setAttribute('title', mxResources.get('pasteSize') + ' (' + - this.editorUi.actions.get('pasteSize').shortcut + ')'); - - div.appendChild(btn2); - count++; - - btn.style.width = '100px'; - btn.style.marginBottom = '2px'; - btn2.style.width = '100px'; - btn2.style.marginBottom = '2px'; - } - } - - if (graph.getSelectionCount() == 1 && graph.getModel().isVertex(cell) && - graph.getModel().isVertex(graph.getModel().getParent(cell))) - { - if (count > 0) - { - mxUtils.br(div); - } - - btn = mxUtils.button(mxResources.get('removeFromGroup'), function(evt) - { - ui.actions.get('removeFromGroup').funct(); - }) - - btn.setAttribute('title', mxResources.get('removeFromGroup')); - btn.style.width = '202px'; - btn.style.marginBottom = '2px'; - div.appendChild(btn); - count++; - } - else if (graph.getSelectionCount() > 0) - { - if (count > 0) - { - mxUtils.br(div); - } - - btn = mxUtils.button(mxResources.get('clearWaypoints'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('clearWaypoints').funct(); - })); - - btn.setAttribute('title', mxResources.get('clearWaypoints') + ' (' + this.editorUi.actions.get('clearWaypoints').shortcut + ')'); - btn.style.width = '202px'; - btn.style.marginBottom = '2px'; - div.appendChild(btn); - - count++; - } - - if (graph.getSelectionCount() == 1) - { - if (count > 0) - { - mxUtils.br(div); - } - - btn = mxUtils.button(mxResources.get('editData'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('editData').funct(); - })); - - btn.setAttribute('title', mxResources.get('editData') + ' (' + this.editorUi.actions.get('editData').shortcut + ')'); - btn.style.width = '100px'; - btn.style.marginBottom = '2px'; - div.appendChild(btn); - count++; - - btn = mxUtils.button(mxResources.get('editLink'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('editLink').funct(); - })); - - btn.setAttribute('title', mxResources.get('editLink')); - btn.style.width = '100px'; - btn.style.marginLeft = '2px'; - btn.style.marginBottom = '2px'; - div.appendChild(btn); - count++; - } - - if (count == 0) - { - div.style.display = 'none'; - } - - return div; -}; - -/** - * - */ -ArrangePanel.prototype.addAlign = function(div) -{ - var graph = this.editorUi.editor.graph; - div.style.paddingTop = '6px'; - div.style.paddingBottom = '12px'; - div.appendChild(this.createTitle(mxResources.get('align'))); - - var stylePanel = document.createElement('div'); - stylePanel.style.position = 'relative'; - stylePanel.style.paddingLeft = '0px'; - stylePanel.style.borderWidth = '0px'; - stylePanel.className = 'geToolbarContainer'; - - if (mxClient.IS_QUIRKS) - { - div.style.height = '60px'; - } - - var left = this.editorUi.toolbar.addButton('geSprite-alignleft', mxResources.get('left'), - function() { graph.alignCells(mxConstants.ALIGN_LEFT); }, stylePanel); - var center = this.editorUi.toolbar.addButton('geSprite-aligncenter', mxResources.get('center'), - function() { graph.alignCells(mxConstants.ALIGN_CENTER); }, stylePanel); - var right = this.editorUi.toolbar.addButton('geSprite-alignright', mxResources.get('right'), - function() { graph.alignCells(mxConstants.ALIGN_RIGHT); }, stylePanel); - - var top = this.editorUi.toolbar.addButton('geSprite-aligntop', mxResources.get('top'), - function() { graph.alignCells(mxConstants.ALIGN_TOP); }, stylePanel); - var middle = this.editorUi.toolbar.addButton('geSprite-alignmiddle', mxResources.get('middle'), - function() { graph.alignCells(mxConstants.ALIGN_MIDDLE); }, stylePanel); - var bottom = this.editorUi.toolbar.addButton('geSprite-alignbottom', mxResources.get('bottom'), - function() { graph.alignCells(mxConstants.ALIGN_BOTTOM); }, stylePanel); - - this.styleButtons([left, center, right, top, middle, bottom]); - right.style.marginRight = '6px'; - div.appendChild(stylePanel); - - return div; -}; - -/** - * - */ -ArrangePanel.prototype.addFlip = function(div) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - div.style.paddingTop = '6px'; - div.style.paddingBottom = '10px'; - - var span = document.createElement('div'); - span.style.marginTop = '2px'; - span.style.marginBottom = '8px'; - span.style.fontWeight = 'bold'; - mxUtils.write(span, mxResources.get('flip')); - div.appendChild(span); - - var btn = mxUtils.button(mxResources.get('horizontal'), function(evt) - { - graph.toggleCellStyles(mxConstants.STYLE_FLIPH, false); - }) - - btn.setAttribute('title', mxResources.get('horizontal')); - btn.style.width = '100px'; - btn.style.marginRight = '2px'; - div.appendChild(btn); - - var btn = mxUtils.button(mxResources.get('vertical'), function(evt) - { - graph.toggleCellStyles(mxConstants.STYLE_FLIPV, false); - }) - - btn.setAttribute('title', mxResources.get('vertical')); - btn.style.width = '100px'; - div.appendChild(btn); - - return div; -}; - -/** - * - */ -ArrangePanel.prototype.addDistribute = function(div) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - div.style.paddingTop = '6px'; - div.style.paddingBottom = '12px'; - - div.appendChild(this.createTitle(mxResources.get('distribute'))); - - var btn = mxUtils.button(mxResources.get('horizontal'), function(evt) - { - graph.distributeCells(true); - }) - - btn.setAttribute('title', mxResources.get('horizontal')); - btn.style.width = '100px'; - btn.style.marginRight = '2px'; - div.appendChild(btn); - - var btn = mxUtils.button(mxResources.get('vertical'), function(evt) - { - graph.distributeCells(false); - }) - - btn.setAttribute('title', mxResources.get('vertical')); - btn.style.width = '100px'; - div.appendChild(btn); - - return div; -}; - -/** - * - */ -ArrangePanel.prototype.addAngle = function(div) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - var ss = this.format.getSelectionState(); - - div.style.paddingBottom = '8px'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.width = '70px'; - span.style.marginTop = '0px'; - span.style.fontWeight = 'bold'; - - var input = null; - var update = null; - var btn = null; - - if (ss.edges.length == 0) - { - mxUtils.write(span, mxResources.get('angle')); - div.appendChild(span); - - input = this.addUnitInput(div, '°', 20, 44, function() - { - update.apply(this, arguments); - }); - - mxUtils.br(div); - div.style.paddingTop = '10px'; - } - else - { - div.style.paddingTop = '8px'; - } - - if (!ss.containsLabel) - { - var label = mxResources.get('reverse'); - - if (ss.vertices.length > 0 && ss.edges.length > 0) - { - label = mxResources.get('turn') + ' / ' + label; - } - else if (ss.vertices.length > 0) - { - label = mxResources.get('turn'); - } - - btn = mxUtils.button(label, function(evt) - { - ui.actions.get('turn').funct(); - }) - - btn.setAttribute('title', label + ' (' + this.editorUi.actions.get('turn').shortcut + ')'); - btn.style.width = '202px'; - div.appendChild(btn); - - if (input != null) - { - btn.style.marginTop = '8px'; - } - } - - if (input != null) - { - var listener = mxUtils.bind(this, function(sender, evt, force) - { - if (force || document.activeElement != input) - { - ss = this.format.getSelectionState(); - var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_ROTATION, 0)); - input.value = (isNaN(tmp)) ? '' : tmp + '°'; - } - }); - - update = this.installInputHandler(input, mxConstants.STYLE_ROTATION, 0, 0, 360, '°', null, true); - this.addKeyHandler(input, listener); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - } - - return div; -}; - -/** - * - */ -ArrangePanel.prototype.addGeometry = function(container) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var rect = this.format.getSelectionState(); - - var div = this.createPanel(); - div.style.paddingBottom = '8px'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.width = '50px'; - span.style.marginTop = '0px'; - span.style.fontWeight = 'bold'; - mxUtils.write(span, mxResources.get('size')); - div.appendChild(span); - - var widthUpdate, heightUpdate, leftUpdate, topUpdate; - var width = this.addUnitInput(div, 'pt', 84, 44, function() - { - widthUpdate.apply(this, arguments); - }); - var height = this.addUnitInput(div, 'pt', 20, 44, function() - { - heightUpdate.apply(this, arguments); - }); - - var autosizeBtn = document.createElement('div'); - autosizeBtn.className = 'geSprite geSprite-fit'; - autosizeBtn.setAttribute('title', mxResources.get('autosize') + ' (' + this.editorUi.actions.get('autosize').shortcut + ')'); - autosizeBtn.style.position = 'relative'; - autosizeBtn.style.cursor = 'pointer'; - autosizeBtn.style.marginTop = '-3px'; - autosizeBtn.style.border = '0px'; - autosizeBtn.style.left = '52px'; - mxUtils.setOpacity(autosizeBtn, 50); - - mxEvent.addListener(autosizeBtn, 'mouseenter', function() - { - mxUtils.setOpacity(autosizeBtn, 100); - }); - - mxEvent.addListener(autosizeBtn, 'mouseleave', function() - { - mxUtils.setOpacity(autosizeBtn, 50); - }); - - mxEvent.addListener(autosizeBtn, 'click', function() - { - ui.actions.get('autosize').funct(); - }); - - div.appendChild(autosizeBtn); - this.addLabel(div, mxResources.get('width'), 84); - this.addLabel(div, mxResources.get('height'), 20); - mxUtils.br(div); - - var wrapper = document.createElement('div'); - wrapper.style.paddingTop = '8px'; - wrapper.style.paddingRight = '20px'; - wrapper.style.whiteSpace = 'nowrap'; - wrapper.style.textAlign = 'right'; - var opt = this.createCellOption(mxResources.get('constrainProportions'), - mxConstants.STYLE_ASPECT, null, 'fixed', 'null'); - opt.style.width = '100%'; - wrapper.appendChild(opt); - div.appendChild(wrapper); - - var constrainCheckbox = opt.getElementsByTagName('input')[0]; - this.addKeyHandler(width, listener); - this.addKeyHandler(height, listener); - - widthUpdate = this.addGeometryHandler(width, function(geo, value) - { - if (geo.width > 0) - { - var value = Math.max(1, value); - - if (constrainCheckbox.checked) - { - geo.height = Math.round((geo.height * value * 100) / geo.width) / 100; - } - - geo.width = value; - } - }); - heightUpdate = this.addGeometryHandler(height, function(geo, value) - { - if (geo.height > 0) - { - var value = Math.max(1, value); - - if (constrainCheckbox.checked) - { - geo.width = Math.round((geo.width * value * 100) / geo.height) / 100; - } - - geo.height = value; - } - }); - - container.appendChild(div); - - var div2 = this.createPanel(); - div2.style.paddingBottom = '30px'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.width = '70px'; - span.style.marginTop = '0px'; - span.style.fontWeight = 'bold'; - mxUtils.write(span, mxResources.get('position')); - div2.appendChild(span); - - var left = this.addUnitInput(div2, 'pt', 84, 44, function() - { - leftUpdate.apply(this, arguments); - }); - var top = this.addUnitInput(div2, 'pt', 20, 44, function() - { - topUpdate.apply(this, arguments); - }); - - mxUtils.br(div2); - this.addLabel(div2, mxResources.get('left'), 84); - this.addLabel(div2, mxResources.get('top'), 20); - - var listener = mxUtils.bind(this, function(sender, evt, force) - { - rect = this.format.getSelectionState(); - - if (!rect.containsLabel && rect.vertices.length == graph.getSelectionCount() && - rect.width != null && rect.height != null) - { - div.style.display = ''; - - if (force || document.activeElement != width) - { - width.value = rect.width + ((rect.width == '') ? '' : ' pt'); - } - - if (force || document.activeElement != height) - { - height.value = rect.height + ((rect.height == '') ? '' : ' pt'); - } - } - else - { - div.style.display = 'none'; - } - - if (rect.vertices.length == graph.getSelectionCount() && - rect.x != null && rect.y != null) - { - div2.style.display = ''; - - if (force || document.activeElement != left) - { - left.value = rect.x + ((rect.x == '') ? '' : ' pt'); - } - - if (force || document.activeElement != top) - { - top.value = rect.y + ((rect.y == '') ? '' : ' pt'); - } - } - else - { - div2.style.display = 'none'; - } - }); - - this.addKeyHandler(left, listener); - this.addKeyHandler(top, listener); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - - leftUpdate = this.addGeometryHandler(left, function(geo, value) - { - if (geo.relative) - { - geo.offset.x = value; - } - else - { - geo.x = value; - } - }); - topUpdate = this.addGeometryHandler(top, function(geo, value) - { - if (geo.relative) - { - geo.offset.y = value; - } - else - { - geo.y = value; - } - }); - - container.appendChild(div2); -}; - -/** - * - */ -ArrangePanel.prototype.addGeometryHandler = function(input, fn) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var initialValue = null; - - function update(evt) - { - if (input.value != '') - { - var value = parseFloat(input.value); - - if (value != initialValue) - { - graph.getModel().beginUpdate(); - try - { - var cells = graph.getSelectionCells(); - - for (var i = 0; i < cells.length; i++) - { - if (graph.getModel().isVertex(cells[i])) - { - var geo = graph.getCellGeometry(cells[i]); - - if (geo != null) - { - geo = geo.clone(); - fn(geo, value); - - graph.getModel().setGeometry(cells[i], geo); - } - } - } - } - finally - { - graph.getModel().endUpdate(); - } - - initialValue = value; - input.value = value + ' pt'; - } - else if (isNaN(value)) - { - input.value = initialValue + ' pt'; - } - } - - mxEvent.consume(evt); - }; - - mxEvent.addListener(input, 'blur', update); - mxEvent.addListener(input, 'change', update); - mxEvent.addListener(input, 'focus', function() - { - initialValue = input.value; - }); - - return update; -}; - -ArrangePanel.prototype.addEdgeGeometryHandler = function(input, fn) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var initialValue = null; - - function update(evt) - { - if (input.value != '') - { - var value = parseFloat(input.value); - - if (isNaN(value)) - { - input.value = initialValue + ' pt'; - } - else if (value != initialValue) - { - graph.getModel().beginUpdate(); - try - { - var cells = graph.getSelectionCells(); - - for (var i = 0; i < cells.length; i++) - { - if (graph.getModel().isEdge(cells[i])) - { - var geo = graph.getCellGeometry(cells[i]); - - if (geo != null) - { - geo = geo.clone(); - fn(geo, value); - - graph.getModel().setGeometry(cells[i], geo); - } - } - } - } - finally - { - graph.getModel().endUpdate(); - } - - initialValue = value; - input.value = value + ' pt'; - } - } - - mxEvent.consume(evt); - }; - - mxEvent.addListener(input, 'blur', update); - mxEvent.addListener(input, 'change', update); - mxEvent.addListener(input, 'focus', function() - { - initialValue = input.value; - }); - - return update; -}; - -/** - * - */ -ArrangePanel.prototype.addEdgeGeometry = function(container) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var rect = this.format.getSelectionState(); - - var div = this.createPanel(); - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.width = '70px'; - span.style.marginTop = '0px'; - span.style.fontWeight = 'bold'; - mxUtils.write(span, mxResources.get('width')); - div.appendChild(span); - - var widthUpdate, xtUpdate, ytUpdate, xsUpdate, ysUpdate; - var width = this.addUnitInput(div, 'pt', 20, 44, function() - { - widthUpdate.apply(this, arguments); - }); - - mxUtils.br(div); - this.addKeyHandler(width, listener); - - function widthUpdate(evt) - { - // Maximum stroke width is 999 - var value = parseInt(width.value); - value = Math.min(999, Math.max(1, (isNaN(value)) ? 1 : value)); - - if (value != mxUtils.getValue(rect.style, 'width', mxCellRenderer.defaultShapes['flexArrow'].prototype.defaultWidth)) - { - graph.setCellStyles('width', value, graph.getSelectionCells()); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['width'], - 'values', [value], 'cells', graph.getSelectionCells())); - } - - width.value = value + ' pt'; - mxEvent.consume(evt); - }; - - mxEvent.addListener(width, 'blur', widthUpdate); - mxEvent.addListener(width, 'change', widthUpdate); - - container.appendChild(div); - - var divs = this.createPanel(); - divs.style.paddingBottom = '30px'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.width = '70px'; - span.style.marginTop = '0px'; - span.style.fontWeight = 'bold'; - mxUtils.write(span, 'Start'); - divs.appendChild(span); - - var xs = this.addUnitInput(divs, 'pt', 84, 44, function() - { - xsUpdate.apply(this, arguments); - }); - var ys = this.addUnitInput(divs, 'pt', 20, 44, function() - { - ysUpdate.apply(this, arguments); - }); - - mxUtils.br(divs); - this.addLabel(divs, mxResources.get('left'), 84); - this.addLabel(divs, mxResources.get('top'), 20); - container.appendChild(divs); - this.addKeyHandler(xs, listener); - this.addKeyHandler(ys, listener); - - var divt = this.createPanel(); - divt.style.paddingBottom = '30px'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.width = '70px'; - span.style.marginTop = '0px'; - span.style.fontWeight = 'bold'; - mxUtils.write(span, 'End'); - divt.appendChild(span); - - var xt = this.addUnitInput(divt, 'pt', 84, 44, function() - { - xtUpdate.apply(this, arguments); - }); - var yt = this.addUnitInput(divt, 'pt', 20, 44, function() - { - ytUpdate.apply(this, arguments); - }); - - mxUtils.br(divt); - this.addLabel(divt, mxResources.get('left'), 84); - this.addLabel(divt, mxResources.get('top'), 20); - container.appendChild(divt); - this.addKeyHandler(xt, listener); - this.addKeyHandler(yt, listener); - - var listener = mxUtils.bind(this, function(sender, evt, force) - { - rect = this.format.getSelectionState(); - var cell = graph.getSelectionCell(); - - if (rect.style.shape == 'link' || rect.style.shape == 'flexArrow') - { - div.style.display = ''; - - if (force || document.activeElement != width) - { - var value = mxUtils.getValue(rect.style, 'width', - mxCellRenderer.defaultShapes['flexArrow'].prototype.defaultWidth); - width.value = value + ' pt'; - } - } - else - { - div.style.display = 'none'; - } - - if (graph.getSelectionCount() == 1 && graph.model.isEdge(cell)) - { - var geo = graph.model.getGeometry(cell); - - if (geo.sourcePoint != null && graph.model.getTerminal(cell, true) == null) - { - xs.value = geo.sourcePoint.x; - ys.value = geo.sourcePoint.y; - } - else - { - divs.style.display = 'none'; - } - - if (geo.targetPoint != null && graph.model.getTerminal(cell, false) == null) - { - xt.value = geo.targetPoint.x; - yt.value = geo.targetPoint.y; - } - else - { - divt.style.display = 'none'; - } - } - else - { - divs.style.display = 'none'; - divt.style.display = 'none'; - } - }); - - xsUpdate = this.addEdgeGeometryHandler(xs, function(geo, value) - { - geo.sourcePoint.x = value; - }); - - ysUpdate = this.addEdgeGeometryHandler(ys, function(geo, value) - { - geo.sourcePoint.y = value; - }); - - xtUpdate = this.addEdgeGeometryHandler(xt, function(geo, value) - { - geo.targetPoint.x = value; - }); - - ytUpdate = this.addEdgeGeometryHandler(yt, function(geo, value) - { - geo.targetPoint.y = value; - }); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -TextFormatPanel = function(format, editorUi, container) -{ - BaseFormatPanel.call(this, format, editorUi, container); - this.init(); -}; - -mxUtils.extend(TextFormatPanel, BaseFormatPanel); - -/** - * Adds the label menu items to the given menu and parent. - */ -TextFormatPanel.prototype.init = function() -{ - this.container.style.borderBottom = 'none'; - this.addFont(this.container); -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -TextFormatPanel.prototype.addFont = function(container) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - var ss = this.format.getSelectionState(); - - var title = this.createTitle(mxResources.get('font')); - title.style.paddingLeft = '18px'; - title.style.paddingTop = '10px'; - title.style.paddingBottom = '6px'; - container.appendChild(title); - - var stylePanel = this.createPanel(); - stylePanel.style.paddingTop = '2px'; - stylePanel.style.paddingBottom = '2px'; - stylePanel.style.position = 'relative'; - stylePanel.style.marginLeft = '-2px'; - stylePanel.style.borderWidth = '0px'; - stylePanel.className = 'geToolbarContainer'; - - if (mxClient.IS_QUIRKS) - { - stylePanel.style.display = 'block'; - } - - if (graph.cellEditor.isContentEditing()) - { - var cssPanel = stylePanel.cloneNode(); - - var cssMenu = this.editorUi.toolbar.addMenu(mxResources.get('style'), - mxResources.get('style'), true, 'formatBlock', cssPanel); - cssMenu.style.color = 'rgb(112, 112, 112)'; - cssMenu.style.whiteSpace = 'nowrap'; - cssMenu.style.overflow = 'hidden'; - cssMenu.style.margin = '0px'; - this.addArrow(cssMenu); - cssMenu.style.width = '192px'; - cssMenu.style.height = '15px'; - - var arrow = cssMenu.getElementsByTagName('div')[0]; - arrow.style.cssFloat = 'right'; - container.appendChild(cssPanel); - - // Workaround for offset in FF - if (mxClient.IS_FF) - { - cssMenu.getElementsByTagName('div')[0].style.marginTop = '-18px'; - } - } - - container.appendChild(stylePanel); - - var colorPanel = this.createPanel(); - colorPanel.style.marginTop = '8px'; - colorPanel.style.borderTop = '1px solid #c0c0c0'; - colorPanel.style.paddingTop = '6px'; - colorPanel.style.paddingBottom = '6px'; - - var fontMenu = this.editorUi.toolbar.addMenu('Helvetica', mxResources.get('fontFamily'), true, 'fontFamily', stylePanel); - fontMenu.style.color = 'rgb(112, 112, 112)'; - fontMenu.style.whiteSpace = 'nowrap'; - fontMenu.style.overflow = 'hidden'; - fontMenu.style.margin = '0px'; - - this.addArrow(fontMenu); - fontMenu.style.width = '192px'; - fontMenu.style.height = '15px'; - - // Workaround for offset in FF - if (mxClient.IS_FF) - { - fontMenu.getElementsByTagName('div')[0].style.marginTop = '-18px'; - } - - var stylePanel2 = stylePanel.cloneNode(false); - stylePanel2.style.marginLeft = '-3px'; - var fontStyleItems = this.editorUi.toolbar.addItems(['bold', 'italic', 'underline'], stylePanel2, true); - fontStyleItems[0].setAttribute('title', mxResources.get('bold') + ' (' + this.editorUi.actions.get('bold').shortcut + ')'); - fontStyleItems[1].setAttribute('title', mxResources.get('italic') + ' (' + this.editorUi.actions.get('italic').shortcut + ')'); - fontStyleItems[2].setAttribute('title', mxResources.get('underline') + ' (' + this.editorUi.actions.get('underline').shortcut + ')'); - - var verticalItem = this.editorUi.toolbar.addItems(['vertical'], stylePanel2, true)[0]; - - if (mxClient.IS_QUIRKS) - { - mxUtils.br(container); - } - - container.appendChild(stylePanel2); - - this.styleButtons(fontStyleItems); - this.styleButtons([verticalItem]); - - var stylePanel3 = stylePanel.cloneNode(false); - stylePanel3.style.marginLeft = '-3px'; - stylePanel3.style.paddingBottom = '0px'; - - // Helper function to return a wrapper function does not pass any arguments - var callFn = function(fn) - { - return function() - { - return fn(); - }; - }; - - var left = this.editorUi.toolbar.addButton('geSprite-left', mxResources.get('left'), - (graph.cellEditor.isContentEditing()) ? - function() - { - document.execCommand('justifyleft', false, null); - } : callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_LEFT])), stylePanel3); - var center = this.editorUi.toolbar.addButton('geSprite-center', mxResources.get('center'), - (graph.cellEditor.isContentEditing()) ? - function() - { - document.execCommand('justifycenter', false, null); - } : callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_CENTER])), stylePanel3); - var right = this.editorUi.toolbar.addButton('geSprite-right', mxResources.get('right'), - (graph.cellEditor.isContentEditing()) ? - function() - { - document.execCommand('justifyright', false, null); - } : callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_RIGHT])), stylePanel3); - - this.styleButtons([left, center, right]); - - if (graph.cellEditor.isContentEditing()) - { - var clear = this.editorUi.toolbar.addButton('geSprite-removeformat', mxResources.get('removeFormat'), - function() - { - document.execCommand('removeformat', false, null); - }, stylePanel2); - this.styleButtons([clear]); - } - - var top = this.editorUi.toolbar.addButton('geSprite-top', mxResources.get('top'), - callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_TOP])), stylePanel3); - var middle = this.editorUi.toolbar.addButton('geSprite-middle', mxResources.get('middle'), - callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_MIDDLE])), stylePanel3); - var bottom = this.editorUi.toolbar.addButton('geSprite-bottom', mxResources.get('bottom'), - callFn(this.editorUi.menus.createStyleChangeFunction([mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_BOTTOM])), stylePanel3); - - this.styleButtons([top, middle, bottom]); - - if (mxClient.IS_QUIRKS) - { - mxUtils.br(container); - } - - container.appendChild(stylePanel3); - - // Hack for updating UI state below based on current text selection - // currentTable is the current selected DOM table updated below - var sub, sup, full, tableWrapper, currentTable, tableCell, tableRow; - - if (graph.cellEditor.isContentEditing()) - { - top.style.display = 'none'; - middle.style.display = 'none'; - bottom.style.display = 'none'; - verticalItem.style.display = 'none'; - - full = this.editorUi.toolbar.addButton('geSprite-justifyfull', null, - function() - { - document.execCommand('justifyfull', false, null); - }, stylePanel3); - this.styleButtons([full, - sub = this.editorUi.toolbar.addButton('geSprite-subscript', - mxResources.get('subscript') + ' (' + Editor.ctrlKey + '+,)', - function() - { - document.execCommand('subscript', false, null); - }, stylePanel3), sup = this.editorUi.toolbar.addButton('geSprite-superscript', - mxResources.get('superscript') + ' (' + Editor.ctrlKey + '+.)', - function() - { - document.execCommand('superscript', false, null); - }, stylePanel3)]); - full.style.marginRight = '9px'; - - var tmp = stylePanel3.cloneNode(false); - tmp.style.paddingTop = '4px'; - var btns = [this.editorUi.toolbar.addButton('geSprite-orderedlist', mxResources.get('numberedList'), - function() - { - document.execCommand('insertorderedlist', false, null); - }, tmp), - this.editorUi.toolbar.addButton('geSprite-unorderedlist', mxResources.get('bulletedList'), - function() - { - document.execCommand('insertunorderedlist', false, null); - }, tmp), - this.editorUi.toolbar.addButton('geSprite-outdent', mxResources.get('decreaseIndent'), - function() - { - document.execCommand('outdent', false, null); - }, tmp), - this.editorUi.toolbar.addButton('geSprite-indent', mxResources.get('increaseIndent'), - function() - { - document.execCommand('indent', false, null); - }, tmp), - this.editorUi.toolbar.addButton('geSprite-code', mxResources.get('html'), - function() - { - graph.cellEditor.toggleViewMode(); - }, tmp)]; - this.styleButtons(btns); - btns[btns.length - 1].style.marginLeft = '9px'; - - if (mxClient.IS_QUIRKS) - { - mxUtils.br(container); - tmp.style.height = '40'; - } - - container.appendChild(tmp); - } - else - { - fontStyleItems[2].style.marginRight = '9px'; - right.style.marginRight = '9px'; - } - - // Label position - var stylePanel4 = stylePanel.cloneNode(false); - stylePanel4.style.marginLeft = '0px'; - stylePanel4.style.paddingTop = '8px'; - stylePanel4.style.paddingBottom = '4px'; - stylePanel4.style.fontWeight = 'normal'; - - mxUtils.write(stylePanel4, mxResources.get('position')); - - // Adds label position options - var positionSelect = document.createElement('select'); - positionSelect.style.position = 'absolute'; - positionSelect.style.right = '20px'; - positionSelect.style.width = '97px'; - positionSelect.style.marginTop = '-2px'; - - var directions = ['topLeft', 'top', 'topRight', 'left', 'center', 'right', 'bottomLeft', 'bottom', 'bottomRight']; - var lset = {'topLeft': [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_TOP, mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_BOTTOM], - 'top': [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_TOP, mxConstants.ALIGN_CENTER, mxConstants.ALIGN_BOTTOM], - 'topRight': [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_TOP, mxConstants.ALIGN_LEFT, mxConstants.ALIGN_BOTTOM], - 'left': [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_MIDDLE], - 'center': [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_CENTER, mxConstants.ALIGN_MIDDLE], - 'right': [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_LEFT, mxConstants.ALIGN_MIDDLE], - 'bottomLeft': [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_TOP], - 'bottom': [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_CENTER, mxConstants.ALIGN_TOP], - 'bottomRight': [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_LEFT, mxConstants.ALIGN_TOP]}; - - for (var i = 0; i < directions.length; i++) - { - var positionOption = document.createElement('option'); - positionOption.setAttribute('value', directions[i]); - mxUtils.write(positionOption, mxResources.get(directions[i])); - positionSelect.appendChild(positionOption); - } - - stylePanel4.appendChild(positionSelect); - - // Writing direction - var stylePanel5 = stylePanel.cloneNode(false); - stylePanel5.style.marginLeft = '0px'; - stylePanel5.style.paddingTop = '4px'; - stylePanel5.style.paddingBottom = '4px'; - stylePanel5.style.fontWeight = 'normal'; - - mxUtils.write(stylePanel5, mxResources.get('writingDirection')); - - // Adds writing direction options - // LATER: Handle reselect of same option in all selects (change event - // is not fired for same option so have opened state on click) and - // handle multiple different styles for current selection - var dirSelect = document.createElement('select'); - dirSelect.style.position = 'absolute'; - dirSelect.style.right = '20px'; - dirSelect.style.width = '97px'; - dirSelect.style.marginTop = '-2px'; - - // NOTE: For automatic we use the value null since automatic - // requires the text to be non formatted and non-wrapped - var dirs = ['automatic', 'leftToRight', 'rightToLeft']; - var dirSet = {'automatic': null, - 'leftToRight': mxConstants.TEXT_DIRECTION_LTR, - 'rightToLeft': mxConstants.TEXT_DIRECTION_RTL}; - - for (var i = 0; i < dirs.length; i++) - { - var dirOption = document.createElement('option'); - dirOption.setAttribute('value', dirs[i]); - mxUtils.write(dirOption, mxResources.get(dirs[i])); - dirSelect.appendChild(dirOption); - } - - stylePanel5.appendChild(dirSelect); - - if (!graph.isEditing()) - { - container.appendChild(stylePanel4); - - mxEvent.addListener(positionSelect, 'change', function(evt) - { - graph.getModel().beginUpdate(); - try - { - var vals = lset[positionSelect.value]; - - if (vals != null) - { - graph.setCellStyles(mxConstants.STYLE_LABEL_POSITION, vals[0], graph.getSelectionCells()); - graph.setCellStyles(mxConstants.STYLE_VERTICAL_LABEL_POSITION, vals[1], graph.getSelectionCells()); - graph.setCellStyles(mxConstants.STYLE_ALIGN, vals[2], graph.getSelectionCells()); - graph.setCellStyles(mxConstants.STYLE_VERTICAL_ALIGN, vals[3], graph.getSelectionCells()); - } - } - finally - { - graph.getModel().endUpdate(); - } - - mxEvent.consume(evt); - }); - - // LATER: Update dir in text editor while editing and update style with label - // NOTE: The tricky part is handling and passing on the auto value - container.appendChild(stylePanel5); - - mxEvent.addListener(dirSelect, 'change', function(evt) - { - graph.setCellStyles(mxConstants.STYLE_TEXT_DIRECTION, dirSet[dirSelect.value], graph.getSelectionCells()); - mxEvent.consume(evt); - }); - } - - // Font size - var input = document.createElement('input'); - input.style.textAlign = 'right'; - input.style.marginTop = '4px'; - - if (!mxClient.IS_QUIRKS) - { - input.style.position = 'absolute'; - input.style.right = '32px'; - } - - input.style.width = '46px'; - input.style.height = (mxClient.IS_QUIRKS) ? '21px' : '17px'; - stylePanel2.appendChild(input); - - // Workaround for font size 4 if no text is selected is update font size below - // after first character was entered (as the font element is lazy created) - var pendingFontSize = null; - - var inputUpdate = this.installInputHandler(input, mxConstants.STYLE_FONTSIZE, Menus.prototype.defaultFontSize, 1, 999, ' pt', - function(fontSize) - { - // IE does not support containsNode - // KNOWN: Fixes font size issues but bypasses undo - if (window.getSelection && !mxClient.IS_IE && !mxClient.IS_IE11) - { - var selection = window.getSelection(); - var container = (selection.rangeCount > 0) ? selection.getRangeAt(0).commonAncestorContainer : - graph.cellEditor.textarea; - - function updateSize(elt, ignoreContains) - { - if (elt != graph.cellEditor.textarea && graph.cellEditor.textarea.contains(elt) && - (ignoreContains || selection.containsNode(elt, true))) - { - if (elt.nodeName == 'FONT') - { - elt.removeAttribute('size'); - elt.style.fontSize = fontSize + 'px'; - } - else - { - var css = mxUtils.getCurrentStyle(elt); - - if (css.fontSize != fontSize + 'px') - { - if (mxUtils.getCurrentStyle(elt.parentNode).fontSize != fontSize + 'px') - { - elt.style.fontSize = fontSize + 'px'; - } - else - { - elt.style.fontSize = ''; - } - } - } - } - }; - - // Wraps text node or mixed selection with leading text in a font element - if (container == graph.cellEditor.textarea || - container.nodeType != mxConstants.NODETYPE_ELEMENT) - { - document.execCommand('fontSize', false, '1'); - } - - if (container != graph.cellEditor.textarea) - { - container = container.parentNode; - } - - if (container.nodeType == mxConstants.NODETYPE_ELEMENT) - { - var elts = container.getElementsByTagName('*'); - updateSize(container); - - for (var i = 0; i < elts.length; i++) - { - updateSize(elts[i]); - } - } - - input.value = fontSize + ' pt'; - } - else if (window.getSelection || document.selection) - { - // Checks selection - var par = null; - - if (document.selection) - { - par = document.selection.createRange().parentElement(); - } - else - { - var selection = window.getSelection(); - - if (selection.rangeCount > 0) - { - par = selection.getRangeAt(0).commonAncestorContainer; - } - } - - // Node.contains does not work for text nodes in IE11 - function isOrContains(container, node) - { - while (node != null) - { - if (node === container) - { - return true; - } - - node = node.parentNode; - } - - return false; - }; - - if (par != null && isOrContains(graph.cellEditor.textarea, par)) - { - pendingFontSize = fontSize; - - // Workaround for can't set font size in px is to change font size afterwards - document.execCommand('fontSize', false, '4'); - var elts = graph.cellEditor.textarea.getElementsByTagName('font'); - - for (var i = 0; i < elts.length; i++) - { - if (elts[i].getAttribute('size') == '4') - { - elts[i].removeAttribute('size'); - elts[i].style.fontSize = pendingFontSize + 'px'; - - // Overrides fontSize in input with the one just assigned as a workaround - // for potential fontSize values of parent elements that don't match - window.setTimeout(function() - { - input.value = pendingFontSize + ' pt'; - pendingFontSize = null; - }, 0); - - break; - } - } - } - } - }, true); - - var stepper = this.createStepper(input, inputUpdate, 1, 10, true, Menus.prototype.defaultFontSize); - stepper.style.display = input.style.display; - stepper.style.marginTop = '4px'; - - if (!mxClient.IS_QUIRKS) - { - stepper.style.right = '20px'; - } - - stylePanel2.appendChild(stepper); - - var arrow = fontMenu.getElementsByTagName('div')[0]; - arrow.style.cssFloat = 'right'; - - var bgColorApply = null; - var currentBgColor = '#ffffff'; - - var fontColorApply = null; - var currentFontColor = '#000000'; - - var bgPanel = (graph.cellEditor.isContentEditing()) ? this.createColorOption(mxResources.get('backgroundColor'), function() - { - return currentBgColor; - }, function(color) - { - document.execCommand('backcolor', false, (color != mxConstants.NONE) ? color : 'transparent'); - }, '#ffffff', - { - install: function(apply) { bgColorApply = apply; }, - destroy: function() { bgColorApply = null; } - }, null, true) : this.createCellColorOption(mxResources.get('backgroundColor'), mxConstants.STYLE_LABEL_BACKGROUNDCOLOR, '#ffffff', null, function(color) - { - graph.updateLabelElements(graph.getSelectionCells(), function(elt) - { - elt.style.backgroundColor = null; - }); - }); - bgPanel.style.fontWeight = 'bold'; - - var borderPanel = this.createCellColorOption(mxResources.get('borderColor'), mxConstants.STYLE_LABEL_BORDERCOLOR, '#000000'); - borderPanel.style.fontWeight = 'bold'; - - var panel = (graph.cellEditor.isContentEditing()) ? this.createColorOption(mxResources.get('fontColor'), function() - { - return currentFontColor; - }, function(color) - { - document.execCommand('forecolor', false, (color != mxConstants.NONE) ? color : 'transparent'); - }, '#000000', - { - install: function(apply) { fontColorApply = apply; }, - destroy: function() { fontColorApply = null; } - }, null, true) : this.createCellColorOption(mxResources.get('fontColor'), mxConstants.STYLE_FONTCOLOR, '#000000', function(color) - { - if (color == null || color == mxConstants.NONE) - { - bgPanel.style.display = 'none'; - } - else - { - bgPanel.style.display = ''; - } - - borderPanel.style.display = bgPanel.style.display; - }, function(color) - { - if (color == null || color == mxConstants.NONE) - { - graph.setCellStyles(mxConstants.STYLE_NOLABEL, '1', graph.getSelectionCells()); - } - else - { - graph.setCellStyles(mxConstants.STYLE_NOLABEL, null, graph.getSelectionCells()); - } - - graph.updateLabelElements(graph.getSelectionCells(), function(elt) - { - elt.removeAttribute('color'); - elt.style.color = null; - }); - }); - panel.style.fontWeight = 'bold'; - - colorPanel.appendChild(panel); - colorPanel.appendChild(bgPanel); - - if (!graph.cellEditor.isContentEditing()) - { - colorPanel.appendChild(borderPanel); - } - - container.appendChild(colorPanel); - - var extraPanel = this.createPanel(); - extraPanel.style.paddingTop = '2px'; - extraPanel.style.paddingBottom = '4px'; - - // LATER: Fix toggle using '' instead of 'null' - var wwOpt = this.createCellOption(mxResources.get('wordWrap'), mxConstants.STYLE_WHITE_SPACE, null, 'wrap', 'null', null, null, true); - wwOpt.style.fontWeight = 'bold'; - - // Word wrap in edge labels only supported via labelWidth style - if (!ss.containsLabel && !ss.autoSize && ss.edges.length == 0) - { - extraPanel.appendChild(wwOpt); - } - - // Delegates switch of style to formattedText action as it also convertes newlines - var htmlOpt = this.createCellOption(mxResources.get('formattedText'), 'html', '0', - null, null, null, ui.actions.get('formattedText')); - htmlOpt.style.fontWeight = 'bold'; - extraPanel.appendChild(htmlOpt); - - var spacingPanel = this.createPanel(); - spacingPanel.style.paddingTop = '10px'; - spacingPanel.style.paddingBottom = '28px'; - spacingPanel.style.fontWeight = 'normal'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.width = '70px'; - span.style.marginTop = '0px'; - span.style.fontWeight = 'bold'; - mxUtils.write(span, mxResources.get('spacing')); - spacingPanel.appendChild(span); - - var topUpdate, globalUpdate, leftUpdate, bottomUpdate, rightUpdate; - var topSpacing = this.addUnitInput(spacingPanel, 'pt', 91, 44, function() - { - topUpdate.apply(this, arguments); - }); - var globalSpacing = this.addUnitInput(spacingPanel, 'pt', 20, 44, function() - { - globalUpdate.apply(this, arguments); - }); - - mxUtils.br(spacingPanel); - this.addLabel(spacingPanel, mxResources.get('top'), 91); - this.addLabel(spacingPanel, mxResources.get('global'), 20); - mxUtils.br(spacingPanel); - mxUtils.br(spacingPanel); - - var leftSpacing = this.addUnitInput(spacingPanel, 'pt', 162, 44, function() - { - leftUpdate.apply(this, arguments); - }); - var bottomSpacing = this.addUnitInput(spacingPanel, 'pt', 91, 44, function() - { - bottomUpdate.apply(this, arguments); - }); - var rightSpacing = this.addUnitInput(spacingPanel, 'pt', 20, 44, function() - { - rightUpdate.apply(this, arguments); - }); - - mxUtils.br(spacingPanel); - this.addLabel(spacingPanel, mxResources.get('left'), 162); - this.addLabel(spacingPanel, mxResources.get('bottom'), 91); - this.addLabel(spacingPanel, mxResources.get('right'), 20); - - if (!graph.cellEditor.isContentEditing()) - { - container.appendChild(extraPanel); - container.appendChild(this.createRelativeOption(mxResources.get('opacity'), mxConstants.STYLE_TEXT_OPACITY)); - container.appendChild(spacingPanel); - } - else - { - var selState = null; - var lineHeightInput = null; - - container.appendChild(this.createRelativeOption(mxResources.get('lineheight'), null, null, function(input) - { - var value = (input.value == '') ? 120 : parseInt(input.value); - value = Math.max(0, (isNaN(value)) ? 120 : value); - - if (selState != null) - { - graph.cellEditor.restoreSelection(selState); - selState = null; - } - - var selectedElement = graph.getSelectedElement(); - var node = selectedElement; - - while (node != null && node.nodeType != mxConstants.NODETYPE_ELEMENT) - { - node = node.parentNode; - } - - if (node != null && node == graph.cellEditor.textarea && graph.cellEditor.textarea.firstChild != null) - { - if (graph.cellEditor.textarea.firstChild.nodeName != 'P') - { - graph.cellEditor.textarea.innerHTML = '

' + graph.cellEditor.textarea.innerHTML + '

'; - } - - node = graph.cellEditor.textarea.firstChild; - } - - if (node != null && node != graph.cellEditor.textarea && graph.cellEditor.textarea.contains(node)) - { - node.style.lineHeight = value + '%'; - } - - input.value = value + ' %'; - }, function(input) - { - // Used in CSS handler to update current value - lineHeightInput = input; - - // KNOWN: Arrow up/down clear selection text in quirks/IE 8 - // Text size via arrow button limits to 16 in IE11. Why? - mxEvent.addListener(input, 'mousedown', function() - { - if (document.activeElement == graph.cellEditor.textarea) - { - selState = graph.cellEditor.saveSelection(); - } - }); - - mxEvent.addListener(input, 'touchstart', function() - { - if (document.activeElement == graph.cellEditor.textarea) - { - selState = graph.cellEditor.saveSelection(); - } - }); - - input.value = '120 %'; - })); - - var insertPanel = stylePanel.cloneNode(false); - insertPanel.style.paddingLeft = '0px'; - var insertBtns = this.editorUi.toolbar.addItems(['link', 'image'], insertPanel, true); - - var btns = [ - this.editorUi.toolbar.addButton('geSprite-horizontalrule', mxResources.get('insertHorizontalRule'), - function() - { - document.execCommand('inserthorizontalrule', false); - }, insertPanel), - this.editorUi.toolbar.addMenuFunctionInContainer(insertPanel, 'geSprite-table', mxResources.get('table'), false, mxUtils.bind(this, function(menu) - { - this.editorUi.menus.addInsertTableItem(menu); - }))]; - this.styleButtons(insertBtns); - this.styleButtons(btns); - - var wrapper2 = this.createPanel(); - wrapper2.style.paddingTop = '10px'; - wrapper2.style.paddingBottom = '10px'; - wrapper2.appendChild(this.createTitle(mxResources.get('insert'))); - wrapper2.appendChild(insertPanel); - container.appendChild(wrapper2); - - if (mxClient.IS_QUIRKS) - { - wrapper2.style.height = '70'; - } - - var tablePanel = stylePanel.cloneNode(false); - tablePanel.style.paddingLeft = '0px'; - - var btns = [ - this.editorUi.toolbar.addButton('geSprite-insertcolumnbefore', mxResources.get('insertColumnBefore'), - mxUtils.bind(this, function() - { - try - { - if (currentTable != null) - { - graph.selectNode(graph.insertColumn(currentTable, (tableCell != null) ? tableCell.cellIndex : 0)); - } - } - catch (e) - { - this.editorUi.handleError(e); - } - }), tablePanel), - this.editorUi.toolbar.addButton('geSprite-insertcolumnafter', mxResources.get('insertColumnAfter'), - mxUtils.bind(this, function() - { - try - { - if (currentTable != null) - { - graph.selectNode(graph.insertColumn(currentTable, (tableCell != null) ? tableCell.cellIndex + 1 : -1)); - } - } - catch (e) - { - this.editorUi.handleError(e); - } - }), tablePanel), - this.editorUi.toolbar.addButton('geSprite-deletecolumn', mxResources.get('deleteColumn'), - mxUtils.bind(this, function() - { - try - { - if (currentTable != null && tableCell != null) - { - graph.deleteColumn(currentTable, tableCell.cellIndex); - } - } - catch (e) - { - this.editorUi.handleError(e); - } - }), tablePanel), - this.editorUi.toolbar.addButton('geSprite-insertrowbefore', mxResources.get('insertRowBefore'), - mxUtils.bind(this, function() - { - try - { - if (currentTable != null && tableRow != null) - { - graph.selectNode(graph.insertRow(currentTable, tableRow.sectionRowIndex)); - } - } - catch (e) - { - this.editorUi.handleError(e); - } - }), tablePanel), - this.editorUi.toolbar.addButton('geSprite-insertrowafter', mxResources.get('insertRowAfter'), - mxUtils.bind(this, function() - { - try - { - if (currentTable != null && tableRow != null) - { - graph.selectNode(graph.insertRow(currentTable, tableRow.sectionRowIndex + 1)); - } - } - catch (e) - { - this.editorUi.handleError(e); - } - }), tablePanel), - this.editorUi.toolbar.addButton('geSprite-deleterow', mxResources.get('deleteRow'), - mxUtils.bind(this, function() - { - try - { - if (currentTable != null && tableRow != null) - { - graph.deleteRow(currentTable, tableRow.sectionRowIndex); - } - } - catch (e) - { - this.editorUi.handleError(e); - } - }), tablePanel)]; - this.styleButtons(btns); - btns[2].style.marginRight = '9px'; - - var wrapper3 = this.createPanel(); - wrapper3.style.paddingTop = '10px'; - wrapper3.style.paddingBottom = '10px'; - wrapper3.appendChild(this.createTitle(mxResources.get('table'))); - wrapper3.appendChild(tablePanel); - - if (mxClient.IS_QUIRKS) - { - mxUtils.br(container); - wrapper3.style.height = '70'; - } - - var tablePanel2 = stylePanel.cloneNode(false); - tablePanel2.style.paddingLeft = '0px'; - - var btns = [ - this.editorUi.toolbar.addButton('geSprite-strokecolor', mxResources.get('borderColor'), - mxUtils.bind(this, function() - { - if (currentTable != null) - { - // Converts rgb(r,g,b) values - var color = currentTable.style.borderColor.replace( - /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g, - function($0, $1, $2, $3) { - return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2); - }); - this.editorUi.pickColor(color, function(newColor) - { - if (newColor == null || newColor == mxConstants.NONE) - { - currentTable.removeAttribute('border'); - currentTable.style.border = ''; - currentTable.style.borderCollapse = ''; - } - else - { - currentTable.setAttribute('border', '1'); - currentTable.style.border = '1px solid ' + newColor; - currentTable.style.borderCollapse = 'collapse'; - } - }); - } - }), tablePanel2), - this.editorUi.toolbar.addButton('geSprite-fillcolor', mxResources.get('backgroundColor'), - mxUtils.bind(this, function() - { - // Converts rgb(r,g,b) values - if (currentTable != null) - { - var color = currentTable.style.backgroundColor.replace( - /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g, - function($0, $1, $2, $3) { - return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2); - }); - this.editorUi.pickColor(color, function(newColor) - { - if (newColor == null || newColor == mxConstants.NONE) - { - currentTable.style.backgroundColor = ''; - } - else - { - currentTable.style.backgroundColor = newColor; - } - }); - } - }), tablePanel2), - this.editorUi.toolbar.addButton('geSprite-fit', mxResources.get('spacing'), - function() - { - if (currentTable != null) - { - var value = currentTable.getAttribute('cellPadding') || 0; - - var dlg = new FilenameDialog(ui, value, mxResources.get('apply'), mxUtils.bind(this, function(newValue) - { - if (newValue != null && newValue.length > 0) - { - currentTable.setAttribute('cellPadding', newValue); - } - else - { - currentTable.removeAttribute('cellPadding'); - } - }), mxResources.get('spacing')); - ui.showDialog(dlg.container, 300, 80, true, true); - dlg.init(); - } - }, tablePanel2), - this.editorUi.toolbar.addButton('geSprite-left', mxResources.get('left'), - function() - { - if (currentTable != null) - { - currentTable.setAttribute('align', 'left'); - } - }, tablePanel2), - this.editorUi.toolbar.addButton('geSprite-center', mxResources.get('center'), - function() - { - if (currentTable != null) - { - currentTable.setAttribute('align', 'center'); - } - }, tablePanel2), - this.editorUi.toolbar.addButton('geSprite-right', mxResources.get('right'), - function() - { - if (currentTable != null) - { - currentTable.setAttribute('align', 'right'); - } - }, tablePanel2)]; - this.styleButtons(btns); - btns[2].style.marginRight = '9px'; - - if (mxClient.IS_QUIRKS) - { - mxUtils.br(wrapper3); - mxUtils.br(wrapper3); - } - - wrapper3.appendChild(tablePanel2); - container.appendChild(wrapper3); - - tableWrapper = wrapper3; - } - - function setSelected(elt, selected) - { - if (mxClient.IS_IE && (mxClient.IS_QUIRKS || document.documentMode < 10)) - { - elt.style.filter = (selected) ? 'progid:DXImageTransform.Microsoft.Gradient('+ - 'StartColorStr=\'#c5ecff\', EndColorStr=\'#87d4fb\', GradientType=0)' : ''; - } - else - { - elt.style.backgroundImage = (selected) ? 'linear-gradient(#c5ecff 0px,#87d4fb 100%)' : ''; - } - }; - - var listener = mxUtils.bind(this, function(sender, evt, force) - { - ss = this.format.getSelectionState(); - var fontStyle = mxUtils.getValue(ss.style, mxConstants.STYLE_FONTSTYLE, 0); - setSelected(fontStyleItems[0], (fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD); - setSelected(fontStyleItems[1], (fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC); - setSelected(fontStyleItems[2], (fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE); - fontMenu.firstChild.nodeValue = mxUtils.htmlEntities(mxUtils.getValue(ss.style, mxConstants.STYLE_FONTFAMILY, Menus.prototype.defaultFont)); - - setSelected(verticalItem, mxUtils.getValue(ss.style, mxConstants.STYLE_HORIZONTAL, '1') == '0'); - - if (force || document.activeElement != input) - { - var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_FONTSIZE, Menus.prototype.defaultFontSize)); - input.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - var align = mxUtils.getValue(ss.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_CENTER); - setSelected(left, align == mxConstants.ALIGN_LEFT); - setSelected(center, align == mxConstants.ALIGN_CENTER); - setSelected(right, align == mxConstants.ALIGN_RIGHT); - - var valign = mxUtils.getValue(ss.style, mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE); - setSelected(top, valign == mxConstants.ALIGN_TOP); - setSelected(middle, valign == mxConstants.ALIGN_MIDDLE); - setSelected(bottom, valign == mxConstants.ALIGN_BOTTOM); - - var pos = mxUtils.getValue(ss.style, mxConstants.STYLE_LABEL_POSITION, mxConstants.ALIGN_CENTER); - var vpos = mxUtils.getValue(ss.style, mxConstants.STYLE_VERTICAL_LABEL_POSITION, mxConstants.ALIGN_MIDDLE); - - if (pos == mxConstants.ALIGN_LEFT && vpos == mxConstants.ALIGN_TOP) - { - positionSelect.value = 'topLeft'; - } - else if (pos == mxConstants.ALIGN_CENTER && vpos == mxConstants.ALIGN_TOP) - { - positionSelect.value = 'top'; - } - else if (pos == mxConstants.ALIGN_RIGHT && vpos == mxConstants.ALIGN_TOP) - { - positionSelect.value = 'topRight'; - } - else if (pos == mxConstants.ALIGN_LEFT && vpos == mxConstants.ALIGN_BOTTOM) - { - positionSelect.value = 'bottomLeft'; - } - else if (pos == mxConstants.ALIGN_CENTER && vpos == mxConstants.ALIGN_BOTTOM) - { - positionSelect.value = 'bottom'; - } - else if (pos == mxConstants.ALIGN_RIGHT && vpos == mxConstants.ALIGN_BOTTOM) - { - positionSelect.value = 'bottomRight'; - } - else if (pos == mxConstants.ALIGN_LEFT) - { - positionSelect.value = 'left'; - } - else if (pos == mxConstants.ALIGN_RIGHT) - { - positionSelect.value = 'right'; - } - else - { - positionSelect.value = 'center'; - } - - var dir = mxUtils.getValue(ss.style, mxConstants.STYLE_TEXT_DIRECTION, mxConstants.DEFAULT_TEXT_DIRECTION); - - if (dir == mxConstants.TEXT_DIRECTION_RTL) - { - dirSelect.value = 'rightToLeft'; - } - else if (dir == mxConstants.TEXT_DIRECTION_LTR) - { - dirSelect.value = 'leftToRight'; - } - else if (dir == mxConstants.TEXT_DIRECTION_AUTO) - { - dirSelect.value = 'automatic'; - } - - if (force || document.activeElement != globalSpacing) - { - var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING, 2)); - globalSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != topSpacing) - { - var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_TOP, 0)); - topSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != rightSpacing) - { - var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_RIGHT, 0)); - rightSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != bottomSpacing) - { - var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_BOTTOM, 0)); - bottomSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != leftSpacing) - { - var tmp = parseFloat(mxUtils.getValue(ss.style, mxConstants.STYLE_SPACING_LEFT, 0)); - leftSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - }); - - globalUpdate = this.installInputHandler(globalSpacing, mxConstants.STYLE_SPACING, 2, -999, 999, ' pt'); - topUpdate = this.installInputHandler(topSpacing, mxConstants.STYLE_SPACING_TOP, 0, -999, 999, ' pt'); - rightUpdate = this.installInputHandler(rightSpacing, mxConstants.STYLE_SPACING_RIGHT, 0, -999, 999, ' pt'); - bottomUpdate = this.installInputHandler(bottomSpacing, mxConstants.STYLE_SPACING_BOTTOM, 0, -999, 999, ' pt'); - leftUpdate = this.installInputHandler(leftSpacing, mxConstants.STYLE_SPACING_LEFT, 0, -999, 999, ' pt'); - - this.addKeyHandler(input, listener); - this.addKeyHandler(globalSpacing, listener); - this.addKeyHandler(topSpacing, listener); - this.addKeyHandler(rightSpacing, listener); - this.addKeyHandler(bottomSpacing, listener); - this.addKeyHandler(leftSpacing, listener); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - - if (graph.cellEditor.isContentEditing()) - { - var updating = false; - - var updateCssHandler = function() - { - if (!updating) - { - updating = true; - - window.setTimeout(function() - { - var selectedElement = graph.getSelectedElement(); - var node = selectedElement; - - while (node != null && node.nodeType != mxConstants.NODETYPE_ELEMENT) - { - node = node.parentNode; - } - - if (node != null) - { - // Workaround for commonAncestor on range in IE11 returning parent of common ancestor - if (node == graph.cellEditor.textarea && graph.cellEditor.textarea.children.length == 1 && - graph.cellEditor.textarea.firstChild.nodeType == mxConstants.NODETYPE_ELEMENT) - { - node = graph.cellEditor.textarea.firstChild; - } - - function getRelativeLineHeight(fontSize, lineHeight, elt) - { - if (elt.style.lineHeight.substring(elt.style.lineHeight.length - 1) == '%') - { - return parseInt(elt.style.lineHeight) / 100; - } - else - { - return (lineHeight.substring(lineHeight.length - 2) == 'px') ? - parseFloat(lineHeight) / fontSize : parseInt(lineHeight); - } - }; - - function getAbsoluteFontSize(fontSize) - { - if (fontSize.substring(fontSize.length - 2) == 'px') - { - return parseFloat(fontSize); - } - else - { - return mxConstants.DEFAULT_FONTSIZE; - } - } - - //var realCss = mxUtils.getCurrentStyle(selectedElement); - var css = mxUtils.getCurrentStyle(node); - var fontSize = getAbsoluteFontSize(css.fontSize); - var lineHeight = getRelativeLineHeight(fontSize, css.lineHeight, node); - - // Finds common font size - var elts = node.getElementsByTagName('*'); - - // IE does not support containsNode - if (elts.length > 0 && window.getSelection && !mxClient.IS_IE && !mxClient.IS_IE11) - { - var selection = window.getSelection(); - - for (var i = 0; i < elts.length; i++) - { - if (selection.containsNode(elts[i], true)) - { - temp = mxUtils.getCurrentStyle(elts[i]); - fontSize = Math.max(getAbsoluteFontSize(temp.fontSize), fontSize); - var lh = getRelativeLineHeight(fontSize, temp.lineHeight, elts[i]); - - if (lh != lineHeight || isNaN(lh)) - { - lineHeight = ''; - } - } - } - } - - if (css != null) - { - setSelected(fontStyleItems[0], css.fontWeight == 'bold' || graph.getParentByName(node, 'B', graph.cellEditor.textarea) != null); - setSelected(fontStyleItems[1], css.fontStyle == 'italic' || graph.getParentByName(node, 'I', graph.cellEditor.textarea) != null); - setSelected(fontStyleItems[2], graph.getParentByName(node, 'U', graph.cellEditor.textarea) != null); - setSelected(left, css.textAlign == 'left'); - setSelected(center, css.textAlign == 'center'); - setSelected(right, css.textAlign == 'right'); - setSelected(full, css.textAlign == 'justify'); - setSelected(sup, graph.getParentByName(node, 'SUP', graph.cellEditor.textarea) != null); - setSelected(sub, graph.getParentByName(node, 'SUB', graph.cellEditor.textarea) != null); - - currentTable = graph.getParentByName(node, 'TABLE', graph.cellEditor.textarea); - tableRow = (currentTable == null) ? null : graph.getParentByName(node, 'TR', currentTable); - tableCell = (currentTable == null) ? null : graph.getParentByName(node, 'TD', currentTable); - tableWrapper.style.display = (currentTable != null) ? '' : 'none'; - - if (document.activeElement != input) - { - if (node.nodeName == 'FONT' && node.getAttribute('size') == '4' && - pendingFontSize != null) - { - node.removeAttribute('size'); - node.style.fontSize = pendingFontSize + ' pt'; - pendingFontSize = null; - } - else - { - input.value = (isNaN(fontSize)) ? '' : fontSize + ' pt'; - } - - var lh = parseFloat(lineHeight); - - if (!isNaN(lh)) - { - lineHeightInput.value = Math.round(lh * 100) + ' %'; - } - else - { - lineHeightInput.value = '100 %'; - } - } - - // Converts rgb(r,g,b) values - var color = css.color.replace( - /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g, - function($0, $1, $2, $3) { - return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2); - }); - var color2 = css.backgroundColor.replace( - /\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g, - function($0, $1, $2, $3) { - return "#" + ("0"+Number($1).toString(16)).substr(-2) + ("0"+Number($2).toString(16)).substr(-2) + ("0"+Number($3).toString(16)).substr(-2); - }); - - // Updates the color picker for the current font - if (fontColorApply != null) - { - if (color.charAt(0) == '#') - { - currentFontColor = color; - } - else - { - currentFontColor = '#000000'; - } - - fontColorApply(currentFontColor, true); - } - - if (bgColorApply != null) - { - if (color2.charAt(0) == '#') - { - currentBgColor = color2; - } - else - { - currentBgColor = null; - } - - bgColorApply(currentBgColor, true); - } - - // Workaround for firstChild is null or not an object - // in the log which seems to be IE8- only / 29.01.15 - if (fontMenu.firstChild != null) - { - // Strips leading and trailing quotes - var ff = css.fontFamily; - - if (ff.charAt(0) == '\'') - { - ff = ff.substring(1); - } - - if (ff.charAt(ff.length - 1) == '\'') - { - ff = ff.substring(0, ff.length - 1); - } - - if (ff.charAt(0) == '"') - { - ff = ff.substring(1); - } - - if (ff.charAt(ff.length - 1) == '"') - { - ff = ff.substring(0, ff.length - 1); - } - - fontMenu.firstChild.nodeValue = ff; - } - } - } - - updating = false; - }, 0); - } - }; - - mxEvent.addListener(graph.cellEditor.textarea, 'input', updateCssHandler) - mxEvent.addListener(graph.cellEditor.textarea, 'touchend', updateCssHandler); - mxEvent.addListener(graph.cellEditor.textarea, 'mouseup', updateCssHandler); - mxEvent.addListener(graph.cellEditor.textarea, 'keyup', updateCssHandler); - this.listeners.push({destroy: function() - { - // No need to remove listener since textarea is destroyed after edit - }}); - updateCssHandler(); - } - - return container; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel = function(format, editorUi, container) -{ - BaseFormatPanel.call(this, format, editorUi, container); - this.init(); -}; - -mxUtils.extend(StyleFormatPanel, BaseFormatPanel); - -/** - * - */ -StyleFormatPanel.prototype.defaultStrokeColor = 'black'; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.init = function() -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - var ss = this.format.getSelectionState(); - - if (ss.containsImage && ss.vertices.length == 1 && ss.style.shape == 'image' && - ss.style.image != null && ss.style.image.substring(0, 19) == 'data:image/svg+xml;') - { - this.container.appendChild(this.addSvgStyles(this.createPanel())); - } - - if (!ss.containsImage || ss.style.shape == 'image') - { - this.container.appendChild(this.addFill(this.createPanel())); - } - - this.container.appendChild(this.addStroke(this.createPanel())); - this.container.appendChild(this.addLineJumps(this.createPanel())); - var opacityPanel = this.createRelativeOption(mxResources.get('opacity'), mxConstants.STYLE_OPACITY, 41); - opacityPanel.style.paddingTop = '8px'; - opacityPanel.style.paddingBottom = '8px'; - this.container.appendChild(opacityPanel); - this.container.appendChild(this.addEffects(this.createPanel())); - var opsPanel = this.addEditOps(this.createPanel()); - - if (opsPanel.firstChild != null) - { - mxUtils.br(opsPanel); - } - - this.container.appendChild(this.addStyleOps(opsPanel)); -}; - -/** - * Use browser for parsing CSS. - */ -StyleFormatPanel.prototype.getCssRules = function(css) -{ - var doc = document.implementation.createHTMLDocument(''); - var styleElement = document.createElement('style'); - - mxUtils.setTextContent(styleElement, css); - doc.body.appendChild(styleElement); - - return styleElement.sheet.cssRules; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.addSvgStyles = function(container) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var ss = this.format.getSelectionState(); - container.style.paddingTop = '6px'; - container.style.paddingBottom = '6px'; - container.style.fontWeight = 'bold'; - container.style.display = 'none'; - - try - { - var exp = ss.style.editableCssRules; - - if (exp != null) - { - var regex = new RegExp(exp); - - var data = ss.style.image.substring(ss.style.image.indexOf(',') + 1); - var xml = (window.atob) ? atob(data) : Base64.decode(data, true); - var svg = mxUtils.parseXml(xml); - - if (svg != null) - { - var styles = svg.getElementsByTagName('style'); - - for (var i = 0; i < styles.length; i++) - { - var rules = this.getCssRules(mxUtils.getTextContent(styles[i])); - - for (var j = 0; j < rules.length; j++) - { - this.addSvgRule(container, rules[j], svg, styles[i], rules, j, regex); - } - } - } - } - } - catch (e) - { - // ignore - } - - return container; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.addSvgRule = function(container, rule, svg, styleElem, rules, ruleIndex, regex) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - - if (regex.test(rule.selectorText)) - { - function rgb2hex(rgb) - { - rgb = rgb.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i); - - return (rgb && rgb.length === 4) ? "#" + - ("0" + parseInt(rgb[1],10).toString(16)).slice(-2) + - ("0" + parseInt(rgb[2],10).toString(16)).slice(-2) + - ("0" + parseInt(rgb[3],10).toString(16)).slice(-2) : ''; - }; - - var addStyleRule = mxUtils.bind(this, function(rule, key, label) - { - if (rule.style[key] != '') - { - var option = this.createColorOption(label + ' ' + rule.selectorText, function() - { - return rgb2hex(rule.style[key]); - }, function(color) - { - rules[ruleIndex].style[key] = color; - var cssTxt = ''; - - for (var i = 0; i < rules.length; i++) - { - cssTxt += rules[i].cssText + ' '; - } - - styleElem.textContent = cssTxt; - var xml = mxUtils.getXml(svg.documentElement); - - graph.setCellStyles(mxConstants.STYLE_IMAGE, 'data:image/svg+xml,' + - ((window.btoa) ? btoa(xml) : Base64.encode(xml, true)), - graph.getSelectionCells()); - }, '#ffffff', - { - install: function(apply) - { - // ignore - }, - destroy: function() - { - // ignore - } - }); - - container.appendChild(option); - - // Shows container if rules are added - container.style.display = ''; - } - }); - - addStyleRule(rule, 'fill', mxResources.get('fill')); - addStyleRule(rule, 'stroke', mxResources.get('line')); - } -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.addEditOps = function(div) -{ - var ss = this.format.getSelectionState(); - var btn = null; - - if (this.editorUi.editor.graph.getSelectionCount() == 1) - { - btn = mxUtils.button(mxResources.get('editStyle'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('editStyle').funct(); - })); - - btn.setAttribute('title', mxResources.get('editStyle') + ' (' + this.editorUi.actions.get('editStyle').shortcut + ')'); - btn.style.width = '202px'; - btn.style.marginBottom = '2px'; - - div.appendChild(btn); - } - - if (ss.image) - { - var btn2 = mxUtils.button(mxResources.get('editImage'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('image').funct(); - })); - - btn2.setAttribute('title', mxResources.get('editImage')); - btn2.style.marginBottom = '2px'; - - if (btn == null) - { - btn2.style.width = '202px'; - } - else - { - btn.style.width = '100px'; - btn2.style.width = '100px'; - btn2.style.marginLeft = '2px'; - } - - div.appendChild(btn2); - } - - return div; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.addFill = function(container) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var ss = this.format.getSelectionState(); - container.style.paddingTop = '6px'; - container.style.paddingBottom = '6px'; - - // Adds gradient direction option - var gradientSelect = document.createElement('select'); - gradientSelect.style.position = 'absolute'; - gradientSelect.style.marginTop = '-2px'; - gradientSelect.style.right = (mxClient.IS_QUIRKS) ? '52px' : '72px'; - gradientSelect.style.width = '70px'; - - // Stops events from bubbling to color option event handler - mxEvent.addListener(gradientSelect, 'click', function(evt) - { - mxEvent.consume(evt); - }); - - var gradientPanel = this.createCellColorOption(mxResources.get('gradient'), mxConstants.STYLE_GRADIENTCOLOR, '#ffffff', function(color) - { - if (color == null || color == mxConstants.NONE) - { - gradientSelect.style.display = 'none'; - } - else - { - gradientSelect.style.display = ''; - } - }); - - var fillKey = (ss.style.shape == 'image') ? mxConstants.STYLE_IMAGE_BACKGROUND : mxConstants.STYLE_FILLCOLOR; - var label = (ss.style.shape == 'image') ? mxResources.get('background') : mxResources.get('fill'); - - var fillPanel = this.createCellColorOption(label, fillKey, '#ffffff'); - fillPanel.style.fontWeight = 'bold'; - - var tmpColor = mxUtils.getValue(ss.style, fillKey, null); - gradientPanel.style.display = (tmpColor != null && tmpColor != mxConstants.NONE && - ss.fill && ss.style.shape != 'image') ? '' : 'none'; - - var directions = [mxConstants.DIRECTION_NORTH, mxConstants.DIRECTION_EAST, - mxConstants.DIRECTION_SOUTH, mxConstants.DIRECTION_WEST]; - - for (var i = 0; i < directions.length; i++) - { - var gradientOption = document.createElement('option'); - gradientOption.setAttribute('value', directions[i]); - mxUtils.write(gradientOption, mxResources.get(directions[i])); - gradientSelect.appendChild(gradientOption); - } - - gradientPanel.appendChild(gradientSelect); - - var listener = mxUtils.bind(this, function() - { - ss = this.format.getSelectionState(); - var value = mxUtils.getValue(ss.style, mxConstants.STYLE_GRADIENT_DIRECTION, mxConstants.DIRECTION_SOUTH); - - // Handles empty string which is not allowed as a value - if (value == '') - { - value = mxConstants.DIRECTION_SOUTH; - } - - gradientSelect.value = value; - container.style.display = (ss.fill) ? '' : 'none'; - - var fillColor = mxUtils.getValue(ss.style, mxConstants.STYLE_FILLCOLOR, null); - - if (!ss.fill || ss.containsImage || fillColor == null || fillColor == mxConstants.NONE || ss.style.shape == 'filledEdge') - { - gradientPanel.style.display = 'none'; - } - else - { - gradientPanel.style.display = ''; - } - }); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - - mxEvent.addListener(gradientSelect, 'change', function(evt) - { - graph.setCellStyles(mxConstants.STYLE_GRADIENT_DIRECTION, gradientSelect.value, graph.getSelectionCells()); - mxEvent.consume(evt); - }); - - container.appendChild(fillPanel); - container.appendChild(gradientPanel); - - // Adds custom colors - var custom = this.getCustomColors(); - - for (var i = 0; i < custom.length; i++) - { - container.appendChild(this.createCellColorOption(custom[i].title, custom[i].key, custom[i].defaultValue)); - } - - return container; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.getCustomColors = function() -{ - var ss = this.format.getSelectionState(); - var result = []; - - if (ss.style.shape == 'swimlane') - { - result.push({title: mxResources.get('laneColor'), key: 'swimlaneFillColor', defaultValue: '#ffffff'}); - } - - return result; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.addStroke = function(container) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - var ss = this.format.getSelectionState(); - - container.style.paddingTop = '4px'; - container.style.paddingBottom = '4px'; - container.style.whiteSpace = 'normal'; - - var colorPanel = document.createElement('div'); - colorPanel.style.fontWeight = 'bold'; - - // Adds gradient direction option - var styleSelect = document.createElement('select'); - styleSelect.style.position = 'absolute'; - styleSelect.style.marginTop = '-2px'; - styleSelect.style.right = '72px'; - styleSelect.style.width = '80px'; - - var styles = ['sharp', 'rounded', 'curved']; - - for (var i = 0; i < styles.length; i++) - { - var styleOption = document.createElement('option'); - styleOption.setAttribute('value', styles[i]); - mxUtils.write(styleOption, mxResources.get(styles[i])); - styleSelect.appendChild(styleOption); - } - - mxEvent.addListener(styleSelect, 'change', function(evt) - { - graph.getModel().beginUpdate(); - try - { - var keys = [mxConstants.STYLE_ROUNDED, mxConstants.STYLE_CURVED]; - // Default for rounded is 1 - var values = ['0', null]; - - if (styleSelect.value == 'rounded') - { - values = ['1', null]; - } - else if (styleSelect.value == 'curved') - { - values = [null, '1']; - } - - for (var i = 0; i < keys.length; i++) - { - graph.setCellStyles(keys[i], values[i], graph.getSelectionCells()); - } - - ui.fireEvent(new mxEventObject('styleChanged', 'keys', keys, - 'values', values, 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - - mxEvent.consume(evt); - }); - - // Stops events from bubbling to color option event handler - mxEvent.addListener(styleSelect, 'click', function(evt) - { - mxEvent.consume(evt); - }); - - var strokeKey = (ss.style.shape == 'image') ? mxConstants.STYLE_IMAGE_BORDER : mxConstants.STYLE_STROKECOLOR; - var label = (ss.style.shape == 'image') ? mxResources.get('border') : mxResources.get('line'); - - var lineColor = this.createCellColorOption(label, strokeKey, '#000000'); - lineColor.appendChild(styleSelect); - colorPanel.appendChild(lineColor); - - // Used if only edges selected - var stylePanel = colorPanel.cloneNode(false); - stylePanel.style.fontWeight = 'normal'; - stylePanel.style.whiteSpace = 'nowrap'; - stylePanel.style.position = 'relative'; - stylePanel.style.paddingLeft = '16px' - stylePanel.style.marginBottom = '2px'; - stylePanel.style.marginTop = '2px'; - stylePanel.className = 'geToolbarContainer'; - - var addItem = mxUtils.bind(this, function(menu, width, cssName, keys, values) - { - var item = this.editorUi.menus.styleChange(menu, '', keys, values, 'geIcon', null); - - var pat = document.createElement('div'); - pat.style.width = width + 'px'; - pat.style.height = '1px'; - pat.style.borderBottom = '1px ' + cssName + ' ' + this.defaultStrokeColor; - pat.style.paddingTop = '6px'; - - item.firstChild.firstChild.style.padding = '0px 4px 0px 4px'; - item.firstChild.firstChild.style.width = width + 'px'; - item.firstChild.firstChild.appendChild(pat); - - return item; - }); - - var pattern = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel, 'geSprite-orthogonal', mxResources.get('pattern'), false, mxUtils.bind(this, function(menu) - { - addItem(menu, 75, 'solid', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], [null, null]).setAttribute('title', mxResources.get('solid')); - addItem(menu, 75, 'dashed', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', null]).setAttribute('title', mxResources.get('dashed')); - addItem(menu, 75, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 1']).setAttribute('title', mxResources.get('dotted') + ' (1)'); - addItem(menu, 75, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 2']).setAttribute('title', mxResources.get('dotted') + ' (2)'); - addItem(menu, 75, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 4']).setAttribute('title', mxResources.get('dotted') + ' (3)'); - })); - - // Used for mixed selection (vertices and edges) - var altStylePanel = stylePanel.cloneNode(false); - - var edgeShape = this.editorUi.toolbar.addMenuFunctionInContainer(altStylePanel, 'geSprite-connection', mxResources.get('connection'), false, mxUtils.bind(this, function(menu) - { - this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], [null, null, null, null], 'geIcon geSprite geSprite-connection', null, true).setAttribute('title', mxResources.get('line')); - this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], ['link', null, null, null], 'geIcon geSprite geSprite-linkedge', null, true).setAttribute('title', mxResources.get('link')); - this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], ['flexArrow', null, null, null], 'geIcon geSprite geSprite-arrow', null, true).setAttribute('title', mxResources.get('arrow')); - this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_SHAPE, mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE, 'width'], ['arrow', null, null, null], 'geIcon geSprite geSprite-simplearrow', null, true).setAttribute('title', mxResources.get('simpleArrow')); - })); - - var altPattern = this.editorUi.toolbar.addMenuFunctionInContainer(altStylePanel, 'geSprite-orthogonal', mxResources.get('pattern'), false, mxUtils.bind(this, function(menu) - { - addItem(menu, 33, 'solid', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], [null, null]).setAttribute('title', mxResources.get('solid')); - addItem(menu, 33, 'dashed', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', null]).setAttribute('title', mxResources.get('dashed')); - addItem(menu, 33, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 1']).setAttribute('title', mxResources.get('dotted') + ' (1)'); - addItem(menu, 33, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 2']).setAttribute('title', mxResources.get('dotted') + ' (2)'); - addItem(menu, 33, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 4']).setAttribute('title', mxResources.get('dotted') + ' (3)'); - })); - - var stylePanel2 = stylePanel.cloneNode(false); - - // Stroke width - var input = document.createElement('input'); - input.style.textAlign = 'right'; - input.style.marginTop = '2px'; - input.style.width = '41px'; - input.setAttribute('title', mxResources.get('linewidth')); - - stylePanel.appendChild(input); - - var altInput = input.cloneNode(true); - altStylePanel.appendChild(altInput); - - function update(evt) - { - // Maximum stroke width is 999 - var value = parseInt(input.value); - value = Math.min(999, Math.max(1, (isNaN(value)) ? 1 : value)); - - if (value != mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1)) - { - graph.setCellStyles(mxConstants.STYLE_STROKEWIDTH, value, graph.getSelectionCells()); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_STROKEWIDTH], - 'values', [value], 'cells', graph.getSelectionCells())); - } - - input.value = value + ' pt'; - mxEvent.consume(evt); - }; - - function altUpdate(evt) - { - // Maximum stroke width is 999 - var value = parseInt(altInput.value); - value = Math.min(999, Math.max(1, (isNaN(value)) ? 1 : value)); - - if (value != mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1)) - { - graph.setCellStyles(mxConstants.STYLE_STROKEWIDTH, value, graph.getSelectionCells()); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', [mxConstants.STYLE_STROKEWIDTH], - 'values', [value], 'cells', graph.getSelectionCells())); - } - - altInput.value = value + ' pt'; - mxEvent.consume(evt); - }; - - var stepper = this.createStepper(input, update, 1, 9); - stepper.style.display = input.style.display; - stepper.style.marginTop = '2px'; - stylePanel.appendChild(stepper); - - var altStepper = this.createStepper(altInput, altUpdate, 1, 9); - altStepper.style.display = altInput.style.display; - altStepper.style.marginTop = '2px'; - altStylePanel.appendChild(altStepper); - - if (!mxClient.IS_QUIRKS) - { - input.style.position = 'absolute'; - input.style.right = '32px'; - input.style.height = '15px'; - stepper.style.right = '20px'; - - altInput.style.position = 'absolute'; - altInput.style.right = '32px'; - altInput.style.height = '15px'; - altStepper.style.right = '20px'; - } - else - { - input.style.height = '17px'; - altInput.style.height = '17px'; - } - - mxEvent.addListener(input, 'blur', update); - mxEvent.addListener(input, 'change', update); - - mxEvent.addListener(altInput, 'blur', altUpdate); - mxEvent.addListener(altInput, 'change', altUpdate); - - if (mxClient.IS_QUIRKS) - { - mxUtils.br(stylePanel2); - mxUtils.br(stylePanel2); - } - - var edgeStyle = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel2, 'geSprite-orthogonal', mxResources.get('waypoints'), false, mxUtils.bind(this, function(menu) - { - if (ss.style.shape != 'arrow') - { - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], [null, null, null], 'geIcon geSprite geSprite-straight', null, true).setAttribute('title', mxResources.get('straight')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['orthogonalEdgeStyle', null, null], 'geIcon geSprite geSprite-orthogonal', null, true).setAttribute('title', mxResources.get('orthogonal')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['elbowEdgeStyle', null, null, null], 'geIcon geSprite geSprite-horizontalelbow', null, true).setAttribute('title', mxResources.get('simple')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['elbowEdgeStyle', 'vertical', null, null], 'geIcon geSprite geSprite-verticalelbow', null, true).setAttribute('title', mxResources.get('simple')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['isometricEdgeStyle', null, null, null], 'geIcon geSprite geSprite-horizontalisometric', null, true).setAttribute('title', mxResources.get('isometric')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['isometricEdgeStyle', 'vertical', null, null], 'geIcon geSprite geSprite-verticalisometric', null, true).setAttribute('title', mxResources.get('isometric')); - - if (ss.style.shape == 'connector') - { - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['orthogonalEdgeStyle', '1', null], 'geIcon geSprite geSprite-curved', null, true).setAttribute('title', mxResources.get('curved')); - } - - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE], ['entityRelationEdgeStyle', null, null], 'geIcon geSprite geSprite-entity', null, true).setAttribute('title', mxResources.get('entityRelation')); - } - })); - - var lineStart = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel2, 'geSprite-startclassic', mxResources.get('linestart'), false, mxUtils.bind(this, function(menu) - { - if (ss.style.shape == 'connector' || ss.style.shape == 'flexArrow' || ss.style.shape == 'filledEdge') - { - var item = this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.NONE, 0], 'geIcon', null, false); - item.setAttribute('title', mxResources.get('none')); - item.firstChild.firstChild.innerHTML = '' + mxUtils.htmlEntities(mxResources.get('none')) + ''; - - if (ss.style.shape == 'connector' || ss.style.shape == 'filledEdge') - { - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-startclassic', null, false).setAttribute('title', mxResources.get('classic')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC_THIN, 1], 'geIcon geSprite geSprite-startclassicthin', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OPEN, 0], 'geIcon geSprite geSprite-startopen', null, false).setAttribute('title', mxResources.get('openArrow')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OPEN_THIN, 0], 'geIcon geSprite geSprite-startopenthin', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['openAsync', 0], 'geIcon geSprite geSprite-startopenasync', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-startblock', null, false).setAttribute('title', mxResources.get('block')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK_THIN, 1], 'geIcon geSprite geSprite-startblockthin', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['async', 1], 'geIcon geSprite geSprite-startasync', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-startoval', null, false).setAttribute('title', mxResources.get('oval')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-startdiamond', null, false).setAttribute('title', mxResources.get('diamond')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-startthindiamond', null, false).setAttribute('title', mxResources.get('diamondThin')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-startclassictrans', null, false).setAttribute('title', mxResources.get('classic')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC_THIN, 0], 'geIcon geSprite geSprite-startclassicthintrans', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-startblocktrans', null, false).setAttribute('title', mxResources.get('block')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK_THIN, 0], 'geIcon geSprite geSprite-startblockthintrans', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['async', 0], 'geIcon geSprite geSprite-startasynctrans', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-startovaltrans', null, false).setAttribute('title', mxResources.get('oval')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-startdiamondtrans', null, false).setAttribute('title', mxResources.get('diamond')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-startthindiamondtrans', null, false).setAttribute('title', mxResources.get('diamondThin')); - - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['dash', 0], 'geIcon geSprite geSprite-startdash', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['cross', 0], 'geIcon geSprite geSprite-startcross', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['circlePlus', 0], 'geIcon geSprite geSprite-startcircleplus', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['circle', 1], 'geIcon geSprite geSprite-startcircle', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERone', 0], 'geIcon geSprite geSprite-starterone', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERmandOne', 0], 'geIcon geSprite geSprite-starteronetoone', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERmany', 0], 'geIcon geSprite geSprite-startermany', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERoneToMany', 0], 'geIcon geSprite geSprite-starteronetomany', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERzeroToOne', 1], 'geIcon geSprite geSprite-starteroneopt', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], ['ERzeroToMany', 1], 'geIcon geSprite geSprite-startermanyopt', null, false); - } - else - { - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_STARTARROW], [mxConstants.ARROW_BLOCK], 'geIcon geSprite geSprite-startblocktrans', null, false).setAttribute('title', mxResources.get('block')); - } - } - })); - - var lineEnd = this.editorUi.toolbar.addMenuFunctionInContainer(stylePanel2, 'geSprite-endclassic', mxResources.get('lineend'), false, mxUtils.bind(this, function(menu) - { - if (ss.style.shape == 'connector' || ss.style.shape == 'flexArrow' || ss.style.shape == 'filledEdge') - { - var item = this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.NONE, 0], 'geIcon', null, false); - item.setAttribute('title', mxResources.get('none')); - item.firstChild.firstChild.innerHTML = '' + mxUtils.htmlEntities(mxResources.get('none')) + ''; - - if (ss.style.shape == 'connector' || ss.style.shape == 'filledEdge') - { - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-endclassic', null, false).setAttribute('title', mxResources.get('classic')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC_THIN, 1], 'geIcon geSprite geSprite-endclassicthin', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OPEN, 0], 'geIcon geSprite geSprite-endopen', null, false).setAttribute('title', mxResources.get('openArrow')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OPEN_THIN, 0], 'geIcon geSprite geSprite-endopenthin', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['openAsync', 0], 'geIcon geSprite geSprite-endopenasync', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-endblock', null, false).setAttribute('title', mxResources.get('block')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK_THIN, 1], 'geIcon geSprite geSprite-endblockthin', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['async', 1], 'geIcon geSprite geSprite-endasync', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-endoval', null, false).setAttribute('title', mxResources.get('oval')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-enddiamond', null, false).setAttribute('title', mxResources.get('diamond')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-endthindiamond', null, false).setAttribute('title', mxResources.get('diamondThin')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-endclassictrans', null, false).setAttribute('title', mxResources.get('classic')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC_THIN, 0], 'geIcon geSprite geSprite-endclassicthintrans', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-endblocktrans', null, false).setAttribute('title', mxResources.get('block')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK_THIN, 0], 'geIcon geSprite geSprite-endblockthintrans', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['async', 0], 'geIcon geSprite geSprite-endasynctrans', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-endovaltrans', null, false).setAttribute('title', mxResources.get('oval')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-enddiamondtrans', null, false).setAttribute('title', mxResources.get('diamond')); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-endthindiamondtrans', null, false).setAttribute('title', mxResources.get('diamondThin')); - - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['dash', 0], 'geIcon geSprite geSprite-enddash', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['cross', 0], 'geIcon geSprite geSprite-endcross', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['circlePlus', 0], 'geIcon geSprite geSprite-endcircleplus', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['circle', 1], 'geIcon geSprite geSprite-endcircle', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERone', 0], 'geIcon geSprite geSprite-enderone', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERmandOne', 0], 'geIcon geSprite geSprite-enderonetoone', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERmany', 0], 'geIcon geSprite geSprite-endermany', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERoneToMany', 0], 'geIcon geSprite geSprite-enderonetomany', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERzeroToOne', 1], 'geIcon geSprite geSprite-enderoneopt', null, false); - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], ['ERzeroToMany', 1], 'geIcon geSprite geSprite-endermanyopt', null, false); - } - else - { - this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_ENDARROW], [mxConstants.ARROW_BLOCK], 'geIcon geSprite geSprite-endblocktrans', null, false).setAttribute('title', mxResources.get('block')); - } - } - })); - - this.addArrow(edgeShape, 8); - this.addArrow(edgeStyle); - this.addArrow(lineStart); - this.addArrow(lineEnd); - - var symbol = this.addArrow(pattern, 9); - symbol.className = 'geIcon'; - symbol.style.width = '84px'; - - var altSymbol = this.addArrow(altPattern, 9); - altSymbol.className = 'geIcon'; - altSymbol.style.width = '22px'; - - var solid = document.createElement('div'); - solid.style.width = '85px'; - solid.style.height = '1px'; - solid.style.borderBottom = '1px solid ' + this.defaultStrokeColor; - solid.style.marginBottom = '9px'; - symbol.appendChild(solid); - - var altSolid = document.createElement('div'); - altSolid.style.width = '23px'; - altSolid.style.height = '1px'; - altSolid.style.borderBottom = '1px solid ' + this.defaultStrokeColor; - altSolid.style.marginBottom = '9px'; - altSymbol.appendChild(altSolid); - - pattern.style.height = '15px'; - altPattern.style.height = '15px'; - edgeShape.style.height = '15px'; - edgeStyle.style.height = '17px'; - lineStart.style.marginLeft = '3px'; - lineStart.style.height = '17px'; - lineEnd.style.marginLeft = '3px'; - lineEnd.style.height = '17px'; - - container.appendChild(colorPanel); - container.appendChild(altStylePanel); - container.appendChild(stylePanel); - - var arrowPanel = stylePanel.cloneNode(false); - arrowPanel.style.paddingBottom = '6px'; - arrowPanel.style.paddingTop = '4px'; - arrowPanel.style.fontWeight = 'normal'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.marginLeft = '3px'; - span.style.marginBottom = '12px'; - span.style.marginTop = '2px'; - span.style.fontWeight = 'normal'; - span.style.width = '76px'; - - mxUtils.write(span, mxResources.get('lineend')); - arrowPanel.appendChild(span); - - var endSpacingUpdate, endSizeUpdate; - var endSpacing = this.addUnitInput(arrowPanel, 'pt', 74, 33, function() - { - endSpacingUpdate.apply(this, arguments); - }); - var endSize = this.addUnitInput(arrowPanel, 'pt', 20, 33, function() - { - endSizeUpdate.apply(this, arguments); - }); - - mxUtils.br(arrowPanel); - - var spacer = document.createElement('div'); - spacer.style.height = '8px'; - arrowPanel.appendChild(spacer); - - span = span.cloneNode(false); - mxUtils.write(span, mxResources.get('linestart')); - arrowPanel.appendChild(span); - - var startSpacingUpdate, startSizeUpdate; - var startSpacing = this.addUnitInput(arrowPanel, 'pt', 74, 33, function() - { - startSpacingUpdate.apply(this, arguments); - }); - var startSize = this.addUnitInput(arrowPanel, 'pt', 20, 33, function() - { - startSizeUpdate.apply(this, arguments); - }); - - mxUtils.br(arrowPanel); - this.addLabel(arrowPanel, mxResources.get('spacing'), 74, 50); - this.addLabel(arrowPanel, mxResources.get('size'), 20, 50); - mxUtils.br(arrowPanel); - - var perimeterPanel = colorPanel.cloneNode(false); - perimeterPanel.style.fontWeight = 'normal'; - perimeterPanel.style.position = 'relative'; - perimeterPanel.style.paddingLeft = '16px' - perimeterPanel.style.marginBottom = '2px'; - perimeterPanel.style.marginTop = '6px'; - perimeterPanel.style.borderWidth = '0px'; - perimeterPanel.style.paddingBottom = '18px'; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.marginLeft = '3px'; - span.style.marginBottom = '12px'; - span.style.marginTop = '1px'; - span.style.fontWeight = 'normal'; - span.style.width = '120px'; - mxUtils.write(span, mxResources.get('perimeter')); - perimeterPanel.appendChild(span); - - var perimeterUpdate; - var perimeterSpacing = this.addUnitInput(perimeterPanel, 'pt', 20, 41, function() - { - perimeterUpdate.apply(this, arguments); - }); - - if (ss.edges.length == graph.getSelectionCount()) - { - container.appendChild(stylePanel2); - - if (mxClient.IS_QUIRKS) - { - mxUtils.br(container); - mxUtils.br(container); - } - - container.appendChild(arrowPanel); - } - else if (ss.vertices.length == graph.getSelectionCount()) - { - if (mxClient.IS_QUIRKS) - { - mxUtils.br(container); - } - - container.appendChild(perimeterPanel); - } - - var listener = mxUtils.bind(this, function(sender, evt, force) - { - ss = this.format.getSelectionState(); - var color = mxUtils.getValue(ss.style, strokeKey, null); - - if (force || document.activeElement != input) - { - var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1)); - input.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != altInput) - { - var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_STROKEWIDTH, 1)); - altInput.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - styleSelect.style.visibility = (ss.style.shape == 'connector' || ss.style.shape == 'filledEdge') ? '' : 'hidden'; - - if (mxUtils.getValue(ss.style, mxConstants.STYLE_CURVED, null) == '1') - { - styleSelect.value = 'curved'; - } - else if (mxUtils.getValue(ss.style, mxConstants.STYLE_ROUNDED, null) == '1') - { - styleSelect.value = 'rounded'; - } - - if (mxUtils.getValue(ss.style, mxConstants.STYLE_DASHED, null) == '1') - { - if (mxUtils.getValue(ss.style, mxConstants.STYLE_DASH_PATTERN, null) == null) - { - solid.style.borderBottom = '1px dashed ' + this.defaultStrokeColor; - } - else - { - solid.style.borderBottom = '1px dotted ' + this.defaultStrokeColor; - } - } - else - { - solid.style.borderBottom = '1px solid ' + this.defaultStrokeColor; - } - - altSolid.style.borderBottom = solid.style.borderBottom; - - // Updates toolbar icon for edge style - var edgeStyleDiv = edgeStyle.getElementsByTagName('div')[0]; - var es = mxUtils.getValue(ss.style, mxConstants.STYLE_EDGE, null); - - if (mxUtils.getValue(ss.style, mxConstants.STYLE_NOEDGESTYLE, null) == '1') - { - es = null; - } - - if (es == 'orthogonalEdgeStyle' && mxUtils.getValue(ss.style, mxConstants.STYLE_CURVED, null) == '1') - { - edgeStyleDiv.className = 'geSprite geSprite-curved'; - } - else if (es == 'straight' || es == 'none' || es == null) - { - edgeStyleDiv.className = 'geSprite geSprite-straight'; - } - else if (es == 'entityRelationEdgeStyle') - { - edgeStyleDiv.className = 'geSprite geSprite-entity'; - } - else if (es == 'elbowEdgeStyle') - { - edgeStyleDiv.className = 'geSprite ' + ((mxUtils.getValue(ss.style, - mxConstants.STYLE_ELBOW, null) == 'vertical') ? - 'geSprite-verticalelbow' : 'geSprite-horizontalelbow'); - } - else if (es == 'isometricEdgeStyle') - { - edgeStyleDiv.className = 'geSprite ' + ((mxUtils.getValue(ss.style, - mxConstants.STYLE_ELBOW, null) == 'vertical') ? - 'geSprite-verticalisometric' : 'geSprite-horizontalisometric'); - } - else - { - edgeStyleDiv.className = 'geSprite geSprite-orthogonal'; - } - - // Updates icon for edge shape - var edgeShapeDiv = edgeShape.getElementsByTagName('div')[0]; - - if (ss.style.shape == 'link') - { - edgeShapeDiv.className = 'geSprite geSprite-linkedge'; - } - else if (ss.style.shape == 'flexArrow') - { - edgeShapeDiv.className = 'geSprite geSprite-arrow'; - } - else if (ss.style.shape == 'arrow') - { - edgeShapeDiv.className = 'geSprite geSprite-simplearrow'; - } - else - { - edgeShapeDiv.className = 'geSprite geSprite-connection'; - } - - if (ss.edges.length == graph.getSelectionCount()) - { - altStylePanel.style.display = ''; - stylePanel.style.display = 'none'; - } - else - { - altStylePanel.style.display = 'none'; - stylePanel.style.display = ''; - } - - function updateArrow(marker, fill, elt, prefix) - { - var markerDiv = elt.getElementsByTagName('div')[0]; - - markerDiv.className = ui.getCssClassForMarker(prefix, ss.style.shape, marker, fill); - - if (markerDiv.className == 'geSprite geSprite-noarrow') - { - markerDiv.innerHTML = mxUtils.htmlEntities(mxResources.get('none')); - markerDiv.style.backgroundImage = 'none'; - markerDiv.style.verticalAlign = 'top'; - markerDiv.style.marginTop = '5px'; - markerDiv.style.fontSize = '10px'; - markerDiv.style.filter = 'none'; - markerDiv.style.color = this.defaultStrokeColor; - markerDiv.nextSibling.style.marginTop = '0px'; - } - - return markerDiv; - }; - - var sourceDiv = updateArrow(mxUtils.getValue(ss.style, mxConstants.STYLE_STARTARROW, null), - mxUtils.getValue(ss.style, 'startFill', '1'), lineStart, 'start'); - var targetDiv = updateArrow(mxUtils.getValue(ss.style, mxConstants.STYLE_ENDARROW, null), - mxUtils.getValue(ss.style, 'endFill', '1'), lineEnd, 'end'); - - // Special cases for markers - if (ss.style.shape == 'arrow') - { - sourceDiv.className = 'geSprite geSprite-noarrow'; - targetDiv.className = 'geSprite geSprite-endblocktrans'; - } - else if (ss.style.shape == 'link') - { - sourceDiv.className = 'geSprite geSprite-noarrow'; - targetDiv.className = 'geSprite geSprite-noarrow'; - } - - mxUtils.setOpacity(edgeStyle, (ss.style.shape == 'arrow') ? 30 : 100); - - if (ss.style.shape != 'connector' && ss.style.shape != 'flexArrow' && ss.style.shape != 'filledEdge') - { - mxUtils.setOpacity(lineStart, 30); - mxUtils.setOpacity(lineEnd, 30); - } - else - { - mxUtils.setOpacity(lineStart, 100); - mxUtils.setOpacity(lineEnd, 100); - } - - if (force || document.activeElement != startSize) - { - var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_MARKERSIZE)); - startSize.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != startSpacing) - { - var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_SOURCE_PERIMETER_SPACING, 0)); - startSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != endSize) - { - var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_ENDSIZE, mxConstants.DEFAULT_MARKERSIZE)); - endSize.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != startSpacing) - { - var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_TARGET_PERIMETER_SPACING, 0)); - endSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - - if (force || document.activeElement != perimeterSpacing) - { - var tmp = parseInt(mxUtils.getValue(ss.style, mxConstants.STYLE_PERIMETER_SPACING, 0)); - perimeterSpacing.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - }); - - startSizeUpdate = this.installInputHandler(startSize, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_MARKERSIZE, 0, 999, ' pt'); - startSpacingUpdate = this.installInputHandler(startSpacing, mxConstants.STYLE_SOURCE_PERIMETER_SPACING, 0, -999, 999, ' pt'); - endSizeUpdate = this.installInputHandler(endSize, mxConstants.STYLE_ENDSIZE, mxConstants.DEFAULT_MARKERSIZE, 0, 999, ' pt'); - endSpacingUpdate = this.installInputHandler(endSpacing, mxConstants.STYLE_TARGET_PERIMETER_SPACING, 0, -999, 999, ' pt'); - perimeterUpdate = this.installInputHandler(perimeterSpacing, mxConstants.STYLE_PERIMETER_SPACING, 0, 0, 999, ' pt'); - - this.addKeyHandler(input, listener); - this.addKeyHandler(startSize, listener); - this.addKeyHandler(startSpacing, listener); - this.addKeyHandler(endSize, listener); - this.addKeyHandler(endSpacing, listener); - this.addKeyHandler(perimeterSpacing, listener); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - - return container; -}; - -/** - * Adds UI for configuring line jumps. - */ -StyleFormatPanel.prototype.addLineJumps = function(container) -{ - var ss = this.format.getSelectionState(); - - if (Graph.lineJumpsEnabled && ss.edges.length > 0 && - ss.vertices.length == 0 && ss.lineJumps) - { - container.style.padding = '8px 0px 24px 18px'; - - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - var span = document.createElement('div'); - span.style.position = 'absolute'; - span.style.fontWeight = 'bold'; - span.style.width = '80px'; - - mxUtils.write(span, mxResources.get('lineJumps')); - container.appendChild(span); - - var styleSelect = document.createElement('select'); - styleSelect.style.position = 'absolute'; - styleSelect.style.marginTop = '-2px'; - styleSelect.style.right = '76px'; - styleSelect.style.width = '62px'; - - var styles = ['none', 'arc', 'gap', 'sharp']; - - for (var i = 0; i < styles.length; i++) - { - var styleOption = document.createElement('option'); - styleOption.setAttribute('value', styles[i]); - mxUtils.write(styleOption, mxResources.get(styles[i])); - styleSelect.appendChild(styleOption); - } - - mxEvent.addListener(styleSelect, 'change', function(evt) - { - graph.getModel().beginUpdate(); - try - { - graph.setCellStyles('jumpStyle', styleSelect.value, graph.getSelectionCells()); - ui.fireEvent(new mxEventObject('styleChanged', 'keys', ['jumpStyle'], - 'values', [styleSelect.value], 'cells', graph.getSelectionCells())); - } - finally - { - graph.getModel().endUpdate(); - } - - mxEvent.consume(evt); - }); - - // Stops events from bubbling to color option event handler - mxEvent.addListener(styleSelect, 'click', function(evt) - { - mxEvent.consume(evt); - }); - - container.appendChild(styleSelect); - - var jumpSizeUpdate; - - var jumpSize = this.addUnitInput(container, 'pt', 22, 33, function() - { - jumpSizeUpdate.apply(this, arguments); - }); - - jumpSizeUpdate = this.installInputHandler(jumpSize, 'jumpSize', - Graph.defaultJumpSize, 0, 999, ' pt'); - - var listener = mxUtils.bind(this, function(sender, evt, force) - { - ss = this.format.getSelectionState(); - styleSelect.value = mxUtils.getValue(ss.style, 'jumpStyle', 'none'); - - if (force || document.activeElement != jumpSize) - { - var tmp = parseInt(mxUtils.getValue(ss.style, 'jumpSize', Graph.defaultJumpSize)); - jumpSize.value = (isNaN(tmp)) ? '' : tmp + ' pt'; - } - }); - - this.addKeyHandler(jumpSize, listener); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - } - else - { - container.style.display = 'none'; - } - - return container; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.addEffects = function(div) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - var ss = this.format.getSelectionState(); - - div.style.paddingTop = '0px'; - div.style.paddingBottom = '2px'; - - var table = document.createElement('table'); - - if (mxClient.IS_QUIRKS) - { - table.style.fontSize = '1em'; - } - - table.style.width = '100%'; - table.style.fontWeight = 'bold'; - table.style.paddingRight = '20px'; - var tbody = document.createElement('tbody'); - var row = document.createElement('tr'); - row.style.padding = '0px'; - var left = document.createElement('td'); - left.style.padding = '0px'; - left.style.width = '50%'; - left.setAttribute('valign', 'top'); - - var right = left.cloneNode(true); - right.style.paddingLeft = '8px'; - row.appendChild(left); - row.appendChild(right); - tbody.appendChild(row); - table.appendChild(tbody); - div.appendChild(table); - - var current = left; - var count = 0; - - var addOption = mxUtils.bind(this, function(label, key, defaultValue) - { - var opt = this.createCellOption(label, key, defaultValue); - opt.style.width = '100%'; - current.appendChild(opt); - current = (current == left) ? right : left; - count++; - }); - - var listener = mxUtils.bind(this, function(sender, evt, force) - { - ss = this.format.getSelectionState(); - - left.innerHTML = ''; - right.innerHTML = ''; - current = left; - - if (ss.rounded) - { - addOption(mxResources.get('rounded'), mxConstants.STYLE_ROUNDED, 0); - } - - if (ss.style.shape == 'swimlane') - { - addOption(mxResources.get('divider'), 'swimlaneLine', 1); - } - - if (!ss.containsImage) - { - addOption(mxResources.get('shadow'), mxConstants.STYLE_SHADOW, 0); - } - - if (ss.glass) - { - addOption(mxResources.get('glass'), mxConstants.STYLE_GLASS, 0); - } - - if (ss.comic) - { - addOption(mxResources.get('comic'), 'comic', 0); - } - - if (count == 0) - { - div.style.display = 'none'; - } - }); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - listener(); - - return div; -} - -/** - * Adds the label menu items to the given menu and parent. - */ -StyleFormatPanel.prototype.addStyleOps = function(div) -{ - div.style.paddingTop = '10px'; - div.style.paddingBottom = '10px'; - - var btn = mxUtils.button(mxResources.get('setAsDefaultStyle'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('setAsDefaultStyle').funct(); - })); - - btn.setAttribute('title', mxResources.get('setAsDefaultStyle') + ' (' + this.editorUi.actions.get('setAsDefaultStyle').shortcut + ')'); - btn.style.width = '202px'; - div.appendChild(btn); - - return div; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel = function(format, editorUi, container) -{ - BaseFormatPanel.call(this, format, editorUi, container); - this.init(); -}; - -mxUtils.extend(DiagramFormatPanel, BaseFormatPanel); - -/** - * Switch to disable page view. - */ -DiagramFormatPanel.showPageView = true; - -/** - * Specifies if the background image option should be shown. Default is true. - */ -DiagramFormatPanel.prototype.showBackgroundImageOption = true; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel.prototype.init = function() -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - this.container.appendChild(this.addView(this.createPanel())); - - if (graph.isEnabled()) - { - this.container.appendChild(this.addOptions(this.createPanel())); - this.container.appendChild(this.addPaperSize(this.createPanel())); - this.container.appendChild(this.addStyleOps(this.createPanel())); - } -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel.prototype.addView = function(div) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - div.appendChild(this.createTitle(mxResources.get('view'))); - - // Grid - this.addGridOption(div); - - if (graph.isEnabled()) - { - // Page View - if (DiagramFormatPanel.showPageView) - { - div.appendChild(this.createOption(mxResources.get('pageView'), function() - { - return graph.pageVisible; - }, function(checked) - { - ui.actions.get('pageView').funct(); - }, - { - install: function(apply) - { - this.listener = function() - { - apply(graph.pageVisible); - }; - - ui.addListener('pageViewChanged', this.listener); - }, - destroy: function() - { - ui.removeListener(this.listener); - } - })); - } - - // Background - var bg = this.createColorOption(mxResources.get('background'), function() - { - return graph.background; - }, function(color) - { - var change = new ChangePageSetup(ui, color); - change.ignoreImage = true; - - graph.model.execute(change); - }, '#ffffff', - { - install: function(apply) - { - this.listener = function() - { - apply(graph.background); - }; - - ui.addListener('backgroundColorChanged', this.listener); - }, - destroy: function() - { - ui.removeListener(this.listener); - } - }); - - if (this.showBackgroundImageOption) - { - var btn = mxUtils.button(mxResources.get('image'), function(evt) - { - ui.showBackgroundImageDialog(); - mxEvent.consume(evt); - }) - - btn.style.position = 'absolute'; - btn.className = 'geColorBtn'; - btn.style.marginTop = '-4px'; - btn.style.paddingBottom = (document.documentMode == 11 || mxClient.IS_MT) ? '0px' : '2px'; - btn.style.height = '22px'; - btn.style.right = (mxClient.IS_QUIRKS) ? '52px' : '72px'; - btn.style.width = '56px'; - - bg.appendChild(btn); - } - - div.appendChild(bg); - } - - return div; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel.prototype.addOptions = function(div) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - div.appendChild(this.createTitle(mxResources.get('options'))); - - if (graph.isEnabled()) - { - // Connection arrows - div.appendChild(this.createOption(mxResources.get('connectionArrows'), function() - { - return graph.connectionArrowsEnabled; - }, function(checked) - { - ui.actions.get('connectionArrows').funct(); - }, - { - install: function(apply) - { - this.listener = function() - { - apply(graph.connectionArrowsEnabled); - }; - - ui.addListener('connectionArrowsChanged', this.listener); - }, - destroy: function() - { - ui.removeListener(this.listener); - } - })); - - // Connection points - div.appendChild(this.createOption(mxResources.get('connectionPoints'), function() - { - return graph.connectionHandler.isEnabled(); - }, function(checked) - { - ui.actions.get('connectionPoints').funct(); - }, - { - install: function(apply) - { - this.listener = function() - { - apply(graph.connectionHandler.isEnabled()); - }; - - ui.addListener('connectionPointsChanged', this.listener); - }, - destroy: function() - { - ui.removeListener(this.listener); - } - })); - - // Guides - div.appendChild(this.createOption(mxResources.get('guides'), function() - { - return graph.graphHandler.guidesEnabled; - }, function(checked) - { - ui.actions.get('guides').funct(); - }, - { - install: function(apply) - { - this.listener = function() - { - apply(graph.graphHandler.guidesEnabled); - }; - - ui.addListener('guidesEnabledChanged', this.listener); - }, - destroy: function() - { - ui.removeListener(this.listener); - } - })); - } - - return div; -}; - -/** - * - */ -DiagramFormatPanel.prototype.addGridOption = function(container) -{ - var ui = this.editorUi; - var graph = ui.editor.graph; - - var input = document.createElement('input'); - input.style.position = 'absolute'; - input.style.textAlign = 'right'; - input.style.width = '38px'; - input.value = graph.getGridSize() + ' pt'; - - var stepper = this.createStepper(input, update); - input.style.display = (graph.isGridEnabled()) ? '' : 'none'; - stepper.style.display = input.style.display; - - mxEvent.addListener(input, 'keydown', function(e) - { - if (e.keyCode == 13) - { - graph.container.focus(); - mxEvent.consume(e); - } - else if (e.keyCode == 27) - { - input.value = graph.getGridSize(); - graph.container.focus(); - mxEvent.consume(e); - } - }); - - function update(evt) - { - var value = parseInt(input.value); - value = Math.max(1, (isNaN(value)) ? 10 : value); - - if (value != graph.getGridSize()) - { - graph.setGridSize(value) - } - - input.value = value + ' pt'; - mxEvent.consume(evt); - }; - - mxEvent.addListener(input, 'blur', update); - mxEvent.addListener(input, 'change', update); - - if (mxClient.IS_SVG) - { - input.style.marginTop = '-2px'; - input.style.right = '84px'; - stepper.style.marginTop = '-16px'; - stepper.style.right = '72px'; - - var panel = this.createColorOption(mxResources.get('grid'), function() - { - var color = graph.view.gridColor; - - return (graph.isGridEnabled()) ? color : null; - }, function(color) - { - if (color == mxConstants.NONE) - { - graph.setGridEnabled(false); - } - else - { - graph.setGridEnabled(true); - ui.setGridColor(color); - } - - input.style.display = (graph.isGridEnabled()) ? '' : 'none'; - stepper.style.display = input.style.display; - ui.fireEvent(new mxEventObject('gridEnabledChanged')); - }, '#e0e0e0', - { - install: function(apply) - { - this.listener = function() - { - apply((graph.isGridEnabled()) ? graph.view.gridColor : null); - }; - - ui.addListener('gridColorChanged', this.listener); - ui.addListener('gridEnabledChanged', this.listener); - }, - destroy: function() - { - ui.removeListener(this.listener); - } - }); - - panel.appendChild(input); - panel.appendChild(stepper); - container.appendChild(panel); - } - else - { - input.style.marginTop = '2px'; - input.style.right = '32px'; - stepper.style.marginTop = '2px'; - stepper.style.right = '20px'; - - container.appendChild(input); - container.appendChild(stepper); - - container.appendChild(this.createOption(mxResources.get('grid'), function() - { - return graph.isGridEnabled(); - }, function(checked) - { - graph.setGridEnabled(checked); - - if (graph.isGridEnabled()) - { - graph.view.gridColor = '#e0e0e0'; - } - - ui.fireEvent(new mxEventObject('gridEnabledChanged')); - }, - { - install: function(apply) - { - this.listener = function() - { - input.style.display = (graph.isGridEnabled()) ? '' : 'none'; - stepper.style.display = input.style.display; - - apply(graph.isGridEnabled()); - }; - - ui.addListener('gridEnabledChanged', this.listener); - }, - destroy: function() - { - ui.removeListener(this.listener); - } - })); - } -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel.prototype.addDocumentProperties = function(div) -{ - // Hook for subclassers - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - div.appendChild(this.createTitle(mxResources.get('options'))); - - return div; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel.prototype.addPaperSize = function(div) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - - div.appendChild(this.createTitle(mxResources.get('paperSize'))); - - var accessor = PageSetupDialog.addPageFormatPanel(div, 'formatpanel', graph.pageFormat, function(pageFormat) - { - if (graph.pageFormat == null || graph.pageFormat.width != pageFormat.width || - graph.pageFormat.height != pageFormat.height) - { - var change = new ChangePageSetup(ui, null, null, pageFormat); - change.ignoreColor = true; - change.ignoreImage = true; - - graph.model.execute(change); - } - }); - - this.addKeyHandler(accessor.widthInput, function() - { - accessor.set(graph.pageFormat); - }); - this.addKeyHandler(accessor.heightInput, function() - { - accessor.set(graph.pageFormat); - }); - - var listener = function() - { - accessor.set(graph.pageFormat); - }; - - ui.addListener('pageFormatChanged', listener); - this.listeners.push({destroy: function() { ui.removeListener(listener); }}); - - graph.getModel().addListener(mxEvent.CHANGE, listener); - this.listeners.push({destroy: function() { graph.getModel().removeListener(listener); }}); - - return div; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel.prototype.addStyleOps = function(div) -{ - var btn = mxUtils.button(mxResources.get('editData'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('editData').funct(); - })); - - btn.setAttribute('title', mxResources.get('editData') + ' (' + this.editorUi.actions.get('editData').shortcut + ')'); - btn.style.width = '202px'; - btn.style.marginBottom = '2px'; - div.appendChild(btn); - - mxUtils.br(div); - - btn = mxUtils.button(mxResources.get('clearDefaultStyle'), mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('clearDefaultStyle').funct(); - })); - - btn.setAttribute('title', mxResources.get('clearDefaultStyle') + ' (' + this.editorUi.actions.get('clearDefaultStyle').shortcut + ')'); - btn.style.width = '202px'; - div.appendChild(btn); - - return div; -}; - -/** - * Adds the label menu items to the given menu and parent. - */ -DiagramFormatPanel.prototype.destroy = function() -{ - BaseFormatPanel.prototype.destroy.apply(this, arguments); - - if (this.gridEnabledListener) - { - this.editorUi.removeListener(this.gridEnabledListener); - this.gridEnabledListener = null; - } -}; diff --git a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/ModelSelectPath.js b/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/ModelSelectPath.js deleted file mode 100644 index 202c6cc7..00000000 --- a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/ModelSelectPath.js +++ /dev/null @@ -1,430 +0,0 @@ -/** - * ============================================================================================================================== - * 初始化操作 - * ============================================================================================================================== - */ -//将菜单栏的高度设置为0(即不显示菜单栏) -EditorUi.prototype.menubarHeight = 0; -//设置 sliderbar 宽度 -EditorUi.prototype.hsplitPosition = (screen.width <= 640) ? 118 : 150; -//覆盖保存方法 -EditorUi.prototype.saveFile = function(forceDialog){ - var xml =mxUtils.getPrettyXml(this.editor.getGraphXml()); - $.post(window.mxSaveXmlUrl,{xml:xml},function(data){ - $.tips('保存成功!',2000); - }); -} - -EditorUi.prototype.afterCreated =function(){ - //防止连线未连接到节点上,即连线必须要连接两个节点 - this.editor.graph.setAllowDanglingEdges(false); - this.editor.graph.setDisconnectOnMove(false); - - //设置 cell 不可编辑 - this.editor.graph.isCellEditable = function(cell){ - return false; - } -} - -/** - * ============================================================================================================================== - * 模型列表加载器 - * ============================================================================================================================== - */ -ModelLoader =function(){ - this.list =[]; -} -ModelLoader.prototype.load =function(){ - var xhr =mxUtils.load("[(#{/tools/graph-editor/getModelList})]"); - this.list =JSON.parse(xhr.getText()); -} -ModelLoader.prototype.getList =function(){ - return this.list; -} -ModelLoader.prototype.getNameByCode =function(code){ - if(this.list && this.list.length>0){ - for(var i=0;i0){ - var type =cells[0].getAttribute('type'); - if(cells[0].isEdge() || type=='Condition' || type=='Model'){ - tabs.splice(0, 0, 'configure'); - } - } - return tabs; -} - -//重写插入边方法,加入自定义对象 -var insertEdge = mxConnectionHandler.prototype.insertEdge; -mxConnectionHandler.prototype.insertEdge = function(parent, id, value, source, target, style){ - var edge = mxUtils.createXmlDocument().createElement('Edge'); - edge.setAttribute('label', ''); - edge.setAttribute('value', ''); - edge.setAttribute('valueType', ''); - value = edge; - //验证模型节点不能连接模型节点 - var sourceNodeType = source.getAttribute("type").toLowerCase(); - var targetNodeType = target.getAttribute("type").toLowerCase(); - if(sourceNodeType == 'model' && targetNodeType == "model"){ - $.alert("模型节点之间无法连接!"); - //$.tips('模型节点之间无法连接!',2000); - return null; - } - return insertEdge.apply(this, arguments); -}; - - -/** - * ============================================================================================================================== - * 自定义配置面板 - * ============================================================================================================================== - */ -ConfigureFormatPanel = function(format, editorUi, container) -{ - BaseFormatPanel.call(this, format, editorUi, container); - this.init(); -}; - -mxUtils.extend(ConfigureFormatPanel, BaseFormatPanel); - -ConfigureFormatPanel.prototype.init = function() -{ - this.container.style.borderBottom = 'none'; - this.addUi(this.container); -}; - -ConfigureFormatPanel.prototype.addUi = function(container) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - var ss = this.format.getSelectionState(); - - var selectedCells =graph.getSelectionCells(); - if(selectedCells && selectedCells.length>0){ - var selectedCell =selectedCells[0]; - var formPanel =this.createFormPanel(); - container.appendChild(formPanel); - - if(selectedCell.isEdge()){//当前选择的是连线 - this.createConnectionUi(graph,formPanel,selectedCell); - }else if(mxUtils.isNode(selectedCell.value)){//当前选择的是节点 - var type =selectedCell.getAttribute('type'); - if(type=='Model'){//当前选择的是模型节点 - this.createModelNodeUi(graph,formPanel,selectedCell); - }else if(type=='Condition'){//当前选择的是判断节点 - this.createConditionNodeUi(graph,formPanel,selectedCell); - } - } - } - return container; -} - -ConfigureFormatPanel.prototype.createModelNodeUi = function(graph,formPanel,selectedCell){ - var selectModelLabel =this.createLabel('请选择模型'); - formPanel.appendChild(selectModelLabel); - - var selectModelCombobox =this.createCombobox(); - formPanel.appendChild(selectModelCombobox); - - this.addOption(selectModelCombobox,'',''); - for (var i = 0; i < modelLoader.list.length; i++) - { - var model =modelLoader.list[i]; - this.addOption(selectModelCombobox,model.code,model.name); - } - - //设置下拉框选择框的值 - selectModelCombobox.value =selectedCell.getAttribute('code'); - - if (!graph.isEditing()) - { - mxEvent.addListener(selectModelCombobox, 'change', mxUtils.bind(this,function(evt) - { - var code =selectModelCombobox.value; - var name =modelLoader.getNameByCode(code); - if(code){ - graph.getModel().beginUpdate(); - try - { - var elt = selectedCell.value.cloneNode(true); - elt.setAttribute('code', code); - elt.setAttribute('name', name); - elt.setAttribute('label', name); - graph.getModel().setValue(selectedCell, elt); - } - finally - { - graph.getModel().endUpdate(); - } - } - mxEvent.consume(evt); - })); - } -} - -ConfigureFormatPanel.prototype.createConditionNodeUi = function(graph,formPanel,selectedCell){ - var expressionLabel =this.createLabel('表达式'); - formPanel.appendChild(expressionLabel); - - var expressionText =this.createText(); - expressionText.value =selectedCell.getAttribute('expression') || ''; - formPanel.appendChild(expressionText); - - if (!graph.isEditing()) - { - var applyHandler = function() - { - graph.getModel().beginUpdate(); - try - { - var elt = selectedCell.value.cloneNode(true); - elt.setAttribute('expression', expressionText.value); - graph.getModel().setValue(selectedCell, elt); - } - finally - { - graph.getModel().endUpdate(); - } - }; - - mxEvent.addListener(expressionText, 'keypress', function (evt) - { - if (evt.keyCode == /*enter*/13 && !mxEvent.isShiftDown(evt)){ - conditionText.blur(); - } - }); - - if (mxClient.IS_IE){ - mxEvent.addListener(expressionText, 'focusout', applyHandler); - }else{ - mxEvent.addListener(expressionText, 'blur', applyHandler); - } - } - - var conditionLabel =this.createLabel('描述'); - formPanel.appendChild(conditionLabel); - - var conditionText =this.createText(); - conditionText.value =selectedCell.getAttribute('condition') || ''; - formPanel.appendChild(conditionText); - - if (!graph.isEditing()) - { - var applyHandler = function() - { - graph.getModel().beginUpdate(); - try - { - var elt = selectedCell.value.cloneNode(true); - elt.setAttribute('condition', conditionText.value); - elt.setAttribute('label', conditionText.value); - graph.getModel().setValue(selectedCell, elt); - } - finally - { - graph.getModel().endUpdate(); - } - }; - - mxEvent.addListener(conditionText, 'keypress', function (evt) - { - if (evt.keyCode == /*enter*/13 && !mxEvent.isShiftDown(evt)){ - conditionText.blur(); - } - }); - - if (mxClient.IS_IE){ - mxEvent.addListener(conditionText, 'focusout', applyHandler); - }else{ - mxEvent.addListener(conditionText, 'blur', applyHandler); - } - } -} - -ConfigureFormatPanel.prototype.createConnectionUi = function(graph,formPanel,selectedCell){ - - var connectionTypeLabel =this.createLabel('值类型'); - formPanel.appendChild(connectionTypeLabel); - - var valueTypeCombobox =this.createCombobox(); - this.addOption(valueTypeCombobox,'string','字符值'); - this.addOption(valueTypeCombobox,'number','数值'); - this.addOption(valueTypeCombobox,'boolean','布尔值'); - valueTypeCombobox.value=selectedCell.getValue().getAttribute("valueType") || ''; - formPanel.appendChild(valueTypeCombobox); - - var connectionLabel =this.createLabel('条件值'); - formPanel.appendChild(connectionLabel); - - var valueText =this.createText(); - valueText.value =selectedCell.getValue().getAttribute("value") || ''; - formPanel.appendChild(valueText); - - if (!graph.isEditing()) - { - var applyHandler = function() - { - graph.getModel().beginUpdate(); - try - { - var elt = selectedCell.value.cloneNode(true); - var selIndex = valueTypeCombobox.selectedIndex; - elt.setAttribute('label', '('+ valueTypeCombobox.options[selIndex].text+') '+valueText.value); - elt.setAttribute('value', valueText.value); - elt.setAttribute('valueType', valueTypeCombobox.value); - graph.getModel().setValue(selectedCell, elt); - } - finally - { - graph.getModel().endUpdate(); - } - }; - - mxEvent.addListener(valueText, 'keypress', function (evt) - { - if (evt.keyCode == /*enter*/13 && !mxEvent.isShiftDown(evt)){ - valueText.blur(); - } - }); - - if (mxClient.IS_IE){ - mxEvent.addListener(valueTypeCombobox, 'focusout', applyHandler); - mxEvent.addListener(valueText, 'focusout', applyHandler); - }else{ - mxEvent.addListener(valueTypeCombobox, 'blur', applyHandler); - mxEvent.addListener(valueText, 'focusout', applyHandler); - } - } -} - -ConfigureFormatPanel.prototype.createFormPanel = function(){ - var formPanel = this.createPanel(); - formPanel.style.paddingTop = '2px'; - formPanel.style.paddingBottom = '2px'; - formPanel.style.position = 'relative'; - formPanel.style.marginLeft = '-2px'; - formPanel.style.borderWidth = '0px'; - formPanel.className = 'geToolbarContainer'; - - if (mxClient.IS_QUIRKS){ - formPanel.style.display = 'block'; - } - return formPanel; -} - -ConfigureFormatPanel.prototype.createLabel = function(title){ - var label = this.createTitle(title); - label.style.width = '100%'; - label.style.paddingTop = '10px'; - label.style.paddingBottom = '6px'; - return label; -} - -ConfigureFormatPanel.prototype.createCombobox = function(){ - var result =document.createElement('select'); - result.style.width = '210px'; - return result; -} - -ConfigureFormatPanel.prototype.addOption = function(combobox,value,text){ - var option = document.createElement('option'); - option.setAttribute('value', value); - mxUtils.write(option, text); - combobox.appendChild(option); -} - -ConfigureFormatPanel.prototype.createText = function(){ - var result =document.createElement('input'); - result.type ='text'; - result.style.width = '210px'; - return result; -} \ No newline at end of file diff --git a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/decisionTree.js b/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/decisionTree.js deleted file mode 100644 index fbf5409c..00000000 --- a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/decisionTree.js +++ /dev/null @@ -1,102 +0,0 @@ -//初始化之后 -EditorUi.prototype.afterInitialize =function(){ - resourceLoader.load(); -} - -/** - * 添加自定义组件模板 - */ -Sidebar.prototype.addEntityPalette = function(expand) -{ - var fns = [ - this.addEntry('[(#{mxgraph.re.editor.component.start.title})]', mxUtils.bind(this, function() - { - var cell = new mxCell('[(#{mxgraph.re.editor.component.start.title})]', new mxGeometry(0, 0, 50, 50), 'shape=ellipse;whiteSpace=wrap;html=1;aspect=fixed;'); - cell.vertex = true; - this.graph.setAttributeForCell(cell, 'type', 'Start'); - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '[(#{mxgraph.re.editor.component.start.title})]'); - })), - this.addEntry('[(#{mxgraph.re.editor.component.condition.title})]', mxUtils.bind(this, function() - { - var cell = new mxCell('[(#{mxgraph.re.editor.component.condition.title})]', new mxGeometry(0, 0, 120, 60), 'shape=rhombus;whiteSpace=wrap;html=1;'); - cell.vertex = true; - this.graph.setAttributeForCell(cell, 'type', 'Condition'); - this.graph.setAttributeForCell(cell, 'condition', ''); - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '[(#{mxgraph.re.editor.component.condition.title})]'); - })), - this.addEntry('[(#{mxgraph.re.editor.component.expression.title})]', mxUtils.bind(this, function() - { - var cell = new mxCell('[(#{mxgraph.re.editor.component.expression.title})]', new mxGeometry(0, 0, 100, 30), 'shape=rectangle;rounded=1;whiteSpace=wrap;html=1;'); - cell.vertex = true; - this.graph.setAttributeForCell(cell, 'type', 'Expression'); - this.graph.setAttributeForCell(cell, 'expression', ''); - this.graph.setAttributeForCell(cell, 'commands', ''); - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '[(#{mxgraph.re.editor.component.expression.title})]'); - })), - this.addEntry('[(#{mxgraph.re.editor.component.resourceAbstract.title})]', mxUtils.bind(this, function() - { - var cell = new mxCell('[(#{mxgraph.re.editor.component.resourceAbstract.title})]', new mxGeometry(0, 0, 100, 30), 'shape=rectangle;rounded=1;whiteSpace=wrap;html=1;'); - cell.vertex = true; - this.graph.setAttributeForCell(cell, 'type', 'ResourceAbstract'); - this.graph.setAttributeForCell(cell, 'code', ''); - this.graph.setAttributeForCell(cell, 'version', ''); - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '[(#{mxgraph.re.editor.component.resourceAbstract.title})]'); - })) - ]; - - this.addPaletteFunctions('EntityPalette', '[(#{mxgraph.re.editor.Palette.title})]', (expand != null) ? expand : true, fns); -}; - -/** - * ============================================================================================================================== - * 自定义Format面板显示的标签列表 - * ============================================================================================================================== - */ -var formatGetDiagramFormaters =Format.prototype.getDiagramFormaters; -//根据当前选择的节点显示格式化面板 -Format.prototype.getDiagramFormaters =function(){ - var tabs =formatGetDiagramFormaters.apply(this, arguments); - var graph = this.editorUi.editor.graph; - var cells =graph.getSelectionCells(); - if(cells && cells.length>0){ - var type =cells[0].getAttribute('type'); - if(cells[0].isEdge() || type=='Condition' || type=='Expression' || type=='ResourceAbstract'){ - tabs.splice(0, 0, 'configure'); - } - } - return tabs; -} - -/** - * ============================================================================================================================== - * 自定义配置面板 - * ============================================================================================================================== - */ -ConfigureFormatPanel.prototype.addUi = function(container) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - var ss = this.format.getSelectionState(); - - var selectedCells =graph.getSelectionCells(); - if(selectedCells && selectedCells.length>0){ - var selectedCell =selectedCells[0]; - var formPanel =this.createFormPanel(); - container.appendChild(formPanel); - - if(selectedCell.isEdge()){ - this.createConnectionUi(graph,formPanel,selectedCell); - }else if(mxUtils.isNode(selectedCell.value)){ - var type =selectedCell.getAttribute('type'); - if(type=='Condition'){ - this.createConditionNodeUi(graph,formPanel,selectedCell); - }else if(type=='Expression'){ - this.createExpressionNodeUi(graph,formPanel,selectedCell); - }else if(type=='ResourceAbstract'){ - this.createResourceAbstractNodeUi(graph,formPanel,selectedCell); - } - } - } - return container; -} diff --git a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/executionFlow.js b/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/executionFlow.js deleted file mode 100644 index e37d025b..00000000 --- a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/executionFlow.js +++ /dev/null @@ -1,137 +0,0 @@ -//初始化之后 -EditorUi.prototype.afterInitialize =function(){ - resourceLoader.load(); - modelLoader.load(); -} - -/** - * 添加自定义组件模板 - */ -Sidebar.prototype.addEntityPalette = function(expand) -{ - var fns = [ - this.addEntry('[(#{mxgraph.re.editor.component.start.title})]', mxUtils.bind(this, function() - { - var cell = new mxCell('[(#{mxgraph.re.editor.component.start.title})]', new mxGeometry(0, 0, 50, 50), 'shape=ellipse;whiteSpace=wrap;html=1;aspect=fixed;'); - cell.vertex = true; - this.graph.setAttributeForCell(cell, 'type', 'Start'); - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '[(#{mxgraph.re.editor.component.start.title})]'); - })), - this.addEntry('[(#{mxgraph.re.editor.component.condition.title})]', mxUtils.bind(this, function() - { - var cell = new mxCell('[(#{mxgraph.re.editor.component.condition.title})]', new mxGeometry(0, 0, 120, 60), 'shape=rhombus;whiteSpace=wrap;html=1;'); - cell.vertex = true; - this.graph.setAttributeForCell(cell, 'type', 'Condition'); - this.graph.setAttributeForCell(cell, 'condition', ''); - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '[(#{mxgraph.re.editor.component.condition.title})]'); - })), - /* 以下组件支持并发器(同时执行后续多个操作),目前由于对具体的实现还未确定,暂停界面支持。但后台已经能够处理,只是在执行时,如何分离各自的结果数据方面还未确定方案 - this.addEntry('[(#{mxgraph.re.editor.component.parallel.title})]', mxUtils.bind(this, function() - { - var cell = new mxCell('[(#{mxgraph.re.editor.component.parallel.title})]', new mxGeometry(0, 0, 120, 20), 'shape=rectangle;rounded=1;whiteSpace=wrap;html=1;comic=1;fillColor=#99FF99;'); - cell.vertex = true; - this.graph.setAttributeForCell(cell, 'type', 'VParallel'); - this.graph.setAttributeForCell(cell, 'description', ''); - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '[(#{mxgraph.re.editor.component.parallel.title})]'); - })), - */ - this.addEntry('[(#{mxgraph.re.editor.component.commandSet.title})]', mxUtils.bind(this, function() - { - var cell = new mxCell('

[(#{mxgraph.re.editor.component.commandSet.title})]

', new mxGeometry(0, 0, 100, 50), 'shape=rectangle;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;rounded=1;whiteSpace=wrap;html=1;'); - cell.vertex = true; - this.graph.setAttributeForCell(cell, 'type', 'CommandSet'); - this.graph.setAttributeForCell(cell, 'commands', ''); - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '[(#{mxgraph.re.editor.component.commandSet.title})]'); - })), - this.addEntry('[(#{mxgraph.re.editor.component.resourceAbstract.title})]', mxUtils.bind(this, function() - { - var cell = new mxCell('[(#{mxgraph.re.editor.component.resourceAbstract.title})]', new mxGeometry(0, 0, 100, 30), 'shape=rectangle;rounded=1;whiteSpace=wrap;html=1;'); - cell.vertex = true; - this.graph.setAttributeForCell(cell, 'type', 'ResourceAbstract'); - this.graph.setAttributeForCell(cell, 'code', ''); - this.graph.setAttributeForCell(cell, 'version', ''); - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '[(#{mxgraph.re.editor.component.resourceAbstract.title})]'); - })), - this.addEntry('[(#{mxgraph.re.editor.component.configurableResourceAbstract.title})]', mxUtils.bind(this, function() - { - var cell = new mxCell('

[(#{mxgraph.re.editor.component.configurableResourceAbstract.entity.inputCommands})]


[(#{mxgraph.re.editor.component.configurableResourceAbstract.entity.resource})]


[(#{mxgraph.re.editor.component.configurableResourceAbstract.entity.outputCommands})]

', new mxGeometry(0, 0, 100, 80), 'shape=rectangle;verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;rounded=1;whiteSpace=wrap;html=1;'); - cell.vertex = true; - this.graph.setAttributeForCell(cell, 'type', 'ConfigurableResourceAbstract'); - this.graph.setAttributeForCell(cell, 'code', ''); - this.graph.setAttributeForCell(cell, 'version', ''); - this.graph.setAttributeForCell(cell, 'inputCommands', ''); - this.graph.setAttributeForCell(cell, 'outputCommands', ''); - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '[(#{mxgraph.re.editor.component.configurableResourceAbstract.title})]'); - })), - this.addEntry('[(#{mxgraph.re.editor.component.submodel.title})]', mxUtils.bind(this, function() - { - var cell = new mxCell('[(#{mxgraph.re.editor.component.submodel.title})]', new mxGeometry(0, 0, 100, 30), 'shape=rectangle;rounded=1;whiteSpace=wrap;html=1;'); - cell.vertex = true; - this.graph.setAttributeForCell(cell, 'type', 'SubModelAbstract'); - this.graph.setAttributeForCell(cell, 'code', ''); - return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '[(#{mxgraph.re.editor.component.submodel.title})]'); - })) - ]; - - this.addPaletteFunctions('EntityPalette', '[(#{mxgraph.re.editor.Palette.title})]', (expand != null) ? expand : true, fns); -}; - -/** - * ============================================================================================================================== - * 自定义Format面板显示的标签列表 - * ============================================================================================================================== - */ -var formatGetDiagramFormaters =Format.prototype.getDiagramFormaters; -//根据当前选择的节点显示格式化面板 -Format.prototype.getDiagramFormaters =function(){ - var tabs =formatGetDiagramFormaters.apply(this, arguments); - var graph = this.editorUi.editor.graph; - var cells =graph.getSelectionCells(); - if(cells && cells.length>0){ - var type =cells[0].getAttribute('type'); - if(cells[0].isEdge() || type=='Condition' || type=='Parallel' || type=='CommandSet' || type=='ResourceAbstract' || type=='ConfigurableResourceAbstract' || type=='SubModelAbstract'){ - tabs.splice(0, 0, 'configure'); - } - } - return tabs; -} - -/** - * ============================================================================================================================== - * 自定义配置面板 - * ============================================================================================================================== - */ -ConfigureFormatPanel.prototype.addUi = function(container) -{ - var ui = this.editorUi; - var editor = ui.editor; - var graph = editor.graph; - var ss = this.format.getSelectionState(); - - var selectedCells =graph.getSelectionCells(); - if(selectedCells && selectedCells.length>0){ - var selectedCell =selectedCells[0]; - var formPanel =this.createFormPanel(); - container.appendChild(formPanel); - - if(selectedCell.isEdge()){ - this.createConnectionUi(graph,formPanel,selectedCell); - }else if(mxUtils.isNode(selectedCell.value)){ - var type =selectedCell.getAttribute('type'); - if(type=='Condition'){ - this.createConditionNodeUi(graph,formPanel,selectedCell); - }else if(type=='Parallel'){ - this.createParallelNodeUi(graph,formPanel,selectedCell); - }else if(type=='CommandSet'){ - this.createCommandSetNodeUi(graph,formPanel,selectedCell); - }else if(type=='ResourceAbstract'){ - this.createResourceAbstractNodeUi(graph,formPanel,selectedCell); - }else if(type=='ConfigurableResourceAbstract'){ - this.createConfigurableResourceAbstractNodeUi(graph,formPanel,selectedCell); - }else if(type=='SubModelAbstract'){ - this.createSubModelAbstractNodeUi(graph,formPanel,selectedCell); - } - } - } - return container; -} \ No newline at end of file diff --git a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/init.js b/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/init.js deleted file mode 100644 index 3890bce4..00000000 --- a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/init.js +++ /dev/null @@ -1,43 +0,0 @@ -(function() -{ - mxResources.loadDefaultBundle = false; - var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, mxLanguage) || mxResources.getSpecialBundle(RESOURCE_BASE, mxLanguage); - - //初始化显示图表的 xml 获取 url - window.mxInitXmlUrl = window.mxInitXmlUrl; - - var resourceUrls =[]; - - if(mxInitXmlUrl){ - resourceUrls =[bundle, STYLE_PATH + '/default.xml',mxInitXmlUrl]; - }else{ - resourceUrls =[bundle, STYLE_PATH + '/default.xml']; - } - mxUtils.getAll(resourceUrls, function(xhr) - { - //解析国际化资源 - mxResources.parse(xhr[0].getText()); - - //设置界面主题 - var themes = new Object(); - themes[Graph.prototype.defaultThemeName] = xhr[1].getDocumentElement(); - - //显示编辑器主窗口,并将初始化图表加载到编辑器中 - var editorUi =new EditorUi(new Editor(urlParams['chrome'] == '0', themes,null,null,true)); - - if(mxInitXmlUrl){ - var node = xhr[2].getDocumentElement(); - var dec = new mxCodec(node.ownerDocument); - dec.decode(node, editorUi.editor.graph.getModel()); - } - - //执行初始化操作 - if(editorUi.afterCreated){ - editorUi.afterCreated(); - } - - }, function() - { - document.body.innerHTML = '
Error loading resource files. Please check browser console.
'; - }); -})(); \ No newline at end of file diff --git a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/mxgraph-common.js b/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/mxgraph-common.js deleted file mode 100644 index 4e99e674..00000000 --- a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/mxgraph-common.js +++ /dev/null @@ -1,812 +0,0 @@ -/** - * ============================================================================================================================== - * CodeMirror(编辑器) Hints(提示)相关类 - * ============================================================================================================================== - */ -CodeMirrorCodeHint =function(){ - this.parentParameterNames =PARENT_PARAMETER_NAMES; //由 html 页面提供 - this.parameterNames =PARAMETER_NAMES; //由 html 页面提供 - this.functionNames =[ - 'PI', - 'E', - 'join(split,s1,s2,s3...,sn)', - 'abs(value)', - 'acos(value)', - 'asin(value)', - 'atan(value)', - 'atan2(value)', - 'cbrt(value)', - 'ceil(value)', - 'cos(value)', - 'cosh(value)', - 'exp(value)', - 'expm1(value)', - 'floor(value)', - 'IEEEremainder(value1,value2)', - 'ln(value)', - 'max(v1,v2,...)', - 'min(v1,v2,...)', - 'pow(x,y)', - 'random()', - 'rint(value)', - 'round(value)', - 'sin(value)', - 'sinh(value)', - 'sqrt(value)', - 'sum(v1,v2,...)', - 'tan(value)', - 'tanh(value)', - 'transformSequencing(value,sourceMin,sourceMax,targetMin,targetMax)', - 'toDegrees(value)', - 'toRadians(value)', - 'normalDistributioin(x)', - 'inverseNormalDistributioin(x)' - ]; -}; - -CodeMirrorCodeHint.prototype.getParentParameterNames =function(){ - return this.parentParameterNames; -}, -CodeMirrorCodeHint.prototype.setParentParameterNames =function(names){ - this.parentParameterNames =names; -}, -CodeMirrorCodeHint.prototype.getParameterNames =function(){ - return this.parameterNames; -}, -CodeMirrorCodeHint.prototype.setParameterNames =function(names){ - this.parameterNames =names; -}, -CodeMirrorCodeHint.prototype.getHints =function(curWord){ - var result =[],index =0; - for(var i=0;i=0){ - result[index++] =this.parameterNames[i]; - } - }else{ - result[index++] =this.parameterNames[i]; - } - } - - if(curWord){ - - }else{ - result[index++] ='[(#{re.processor.component.code.hints.availableParentParameters})]'; - } - - for(var i=0;i=0){ - result[index++] =this.parentParameterNames[i]; - } - }else{ - result[index++] =this.parentParameterNames[i]; - } - } - - if(curWord){ - - }else{ - result[index++] ='[(#{re.processor.component.code.hints.availableFunctions})]'; - } - - for(var i=0;i=0 && indexOfCurWord0){ - for(var i=0;i0){ - for(var i=0;i0){ - for(var i=0;i0){ - for(var i=0;i'; - if(commands){ - label +='
' - + '
' - + commands - + '
'; - } - graph.getModel().beginUpdate(); - try - { - var elt = selectedCell.value.cloneNode(true); - elt.setAttribute('expression', expression); - elt.setAttribute('commands', commands); - elt.setAttribute('label', label); - graph.getModel().setValue(selectedCell, elt); - } - finally - { - graph.getModel().endUpdate(); - } - } - }; - - //expression - expressionLabel =this.createLabel('[(#{mxgraph.re.editor.component.expression.entity.expression})]',formPanel); - expressionText =this.createTextArea(100,formPanel); - expressionText.value =selectedCell.getAttribute('expression') || ''; - this.createCodemirrorButton(expressionText,eventHandler,formPanel); - - //commands - commandsLabel =this.createLabel('[(#{mxgraph.re.editor.component.expression.entity.commands})]',formPanel); - commandsText =this.createTextArea(100,formPanel); - commandsText.value =selectedCell.getAttribute('commands') || ''; - this.createCodemirrorButton(commandsText,eventHandler,formPanel); - - mxEvent.addListener(expressionText, 'change',eventHandler); - mxEvent.addListener(commandsText, 'change',eventHandler); -} - -/** - * ------------------------------------------------------------------------------------------------------------------------------ - * 自定义配置面板(并发器) - * ------------------------------------------------------------------------------------------------------------------------------ - */ -ConfigureFormatPanel.prototype.createParallelNodeUi = function(graph,formPanel,selectedCell){ - var descriptionText; - var eventHandler =function(){ - if (!graph.isEditing()){ - var description =descriptionText.value; - graph.getModel().beginUpdate(); - try - { - var elt = selectedCell.value.cloneNode(true); - elt.setAttribute('label', description); - graph.getModel().setValue(selectedCell, elt); - } - finally - { - graph.getModel().endUpdate(); - } - } - }; - descriptionText =this.createTextArea(200,formPanel); - descriptionText.value =selectedCell.getAttribute('label') || ''; - mxEvent.addListener(descriptionText, 'change',eventHandler); -} - -/** - * ------------------------------------------------------------------------------------------------------------------------------ - * 自定义配置面板(指令集) - * ------------------------------------------------------------------------------------------------------------------------------ - */ -ConfigureFormatPanel.prototype.createCommandSetNodeUi = function(graph,formPanel,selectedCell){ - var commandsLabel,commandsText; - var eventHandler =function(){ - if (!graph.isEditing()){ - var commands =commandsText.value; - var label = '

' - + commands - + '

'; - graph.getModel().beginUpdate(); - try - { - var elt = selectedCell.value.cloneNode(true); - elt.setAttribute('commands', commands); - elt.setAttribute('label', label); - graph.getModel().setValue(selectedCell, elt); - } - finally - { - graph.getModel().endUpdate(); - } - } - }; - commandsLabel =this.createLabel('[(#{mxgraph.re.editor.component.commandSet.entity.commands})]',formPanel); - commandsText =this.createTextArea(200,formPanel); - commandsText.value =selectedCell.getAttribute('commands') || ''; - this.createCodemirrorButton(commandsText,eventHandler,formPanel); - mxEvent.addListener(commandsText, 'change',eventHandler); -} - -/** - * ------------------------------------------------------------------------------------------------------------------------------ - * 自定义配置面板(资源摘要) - * ------------------------------------------------------------------------------------------------------------------------------ - */ -ConfigureFormatPanel.prototype.createResourceAbstractNodeUi = function(graph,formPanel,selectedCell){ - var resourceLabel,resourceCombobox; - - var eventHandler =function(){ - if (!graph.isEditing()){ - var resource =resourceLoader.findById(resourceCombobox.value); - var version =''; - if(resource.version!=null){ - version ='V' + resource.version; - } - graph.getModel().beginUpdate(); - try - { - var elt = selectedCell.value.cloneNode(true); - elt.setAttribute('code', resource.code); - elt.setAttribute('version', (resource.version||'')); - elt.setAttribute('label', resource.name + ' ' + version); - graph.getModel().setValue(selectedCell, elt); - } - finally - { - graph.getModel().endUpdate(); - } - } - }; - - resourceLabel =this.createLabel('[(#{mxgraph.re.editor.component.resourceAbstract.entity.resource})]',formPanel); - resourceCombobox =this.createCombobox(formPanel); - this.addOption(resourceCombobox,'',''); - for (var i = 0; i < resourceLoader.list.length; i++) - { - var resource =resourceLoader.list[i]; - var version =''; - if(resource.version!=null){ - version ='V' + resource.version; - } - this.addOption(resourceCombobox,resource.id,resource.name + ' ' + version); - } - - var resource =resourceLoader.findByCodeAndVersion(selectedCell.getAttribute('code'),selectedCell.getAttribute('version')); - if(resource){ - resourceCombobox.value =resource.id; - } - mxEvent.addListener(resourceCombobox, 'change',eventHandler); -} - -/** - * ------------------------------------------------------------------------------------------------------------------------------ - * 自定义配置面板(可配置输入和输出指令的资源摘要) - * ------------------------------------------------------------------------------------------------------------------------------ - */ -ConfigureFormatPanel.prototype.createConfigurableResourceAbstractNodeUi = function(graph,formPanel,selectedCell){ - var resourceLabel,resourceCombobox,inputCommandsLabel,inputCommandsText,outputCommandsLabel,outputCommandsText; - - var eventHandler =function(){ - if (!graph.isEditing()){ - var resource =resourceLoader.findById(resourceCombobox.value); - var version =''; - if(resource.version!=null){ - version ='V' + resource.version; - } - - var inputCommands =inputCommandsText.value; - var outputCommands =outputCommandsText.value; - var label ='

' + inputCommands + '


' + resource.name + ' ' + version + '


' + outputCommands + '

'; - graph.getModel().beginUpdate(); - try - { - var elt = selectedCell.value.cloneNode(true); - elt.setAttribute('code', resource.code); - elt.setAttribute('version', (resource.version||'')); - elt.setAttribute('inputCommands', inputCommands); - elt.setAttribute('outputCommands', outputCommands); - elt.setAttribute('label', label); - graph.getModel().setValue(selectedCell, elt); - } - finally - { - graph.getModel().endUpdate(); - } - } - }; - - resourceLabel =this.createLabel('[(#{mxgraph.re.editor.component.resourceAbstract.entity.resource})]',formPanel); - resourceCombobox =this.createCombobox(formPanel); - this.addOption(resourceCombobox,'',''); - for (var i = 0; i < resourceLoader.list.length; i++) - { - var resource =resourceLoader.list[i]; - var version =''; - if(resource.version!=null){ - version ='V' + resource.version; - } - this.addOption(resourceCombobox,resource.id,resource.name + ' ' + version); - } - - var resource =resourceLoader.findByCodeAndVersion(selectedCell.getAttribute('code'),selectedCell.getAttribute('version')); - if(resource){ - resourceCombobox.value =resource.id; - } - mxEvent.addListener(resourceCombobox, 'change',eventHandler); - - inputCommandsLabel =this.createLabel('[(#{mxgraph.re.editor.component.configurableResourceAbstract.entity.inputCommands})]',formPanel); - inputCommandsText =this.createTextArea(170,formPanel); - inputCommandsText.value =selectedCell.getAttribute('inputCommands') || ''; - this.createCodemirrorButton(inputCommandsText,eventHandler,formPanel); - mxEvent.addListener(inputCommandsText, 'change',eventHandler); - - outputCommandsLabel =this.createLabel('[(#{mxgraph.re.editor.component.configurableResourceAbstract.entity.outputCommands})]',formPanel); - outputCommandsText =this.createTextArea(170,formPanel); - outputCommandsText.value =selectedCell.getAttribute('outputCommands') || ''; - this.createCodemirrorButton(outputCommandsText,eventHandler,formPanel); - mxEvent.addListener(outputCommandsText, 'change',eventHandler); -} - -/** - * ------------------------------------------------------------------------------------------------------------------------------ - * 自定义配置面板(模型摘要) - * ------------------------------------------------------------------------------------------------------------------------------ - */ -ConfigureFormatPanel.prototype.createSubModelAbstractNodeUi = function(graph,formPanel,selectedCell){ - var modelLabel,modelCombobox; - var eventHandler =function(){ - if (!graph.isEditing()){ - var model =modelLoader.findById(modelCombobox.value); - graph.getModel().beginUpdate(); - try - { - var elt = selectedCell.value.cloneNode(true); - elt.setAttribute('code', model.code); - elt.setAttribute('label', model.name); - graph.getModel().setValue(selectedCell, elt); - } - finally - { - graph.getModel().endUpdate(); - } - } - }; - - modelLabel =this.createLabel('[(#{mxgraph.re.editor.component.submodel.entity.model})]',formPanel); - modelCombobox =this.createCombobox(formPanel); - this.addOption(modelCombobox,'',''); - for (var i = 0; i < modelLoader.list.length; i++) - { - var model =modelLoader.list[i]; - this.addOption(modelCombobox,model.id,model.name); - } - - var model =modelLoader.findByCode(selectedCell.getAttribute('code')); - if(model){ - modelCombobox.value =model.id; - } - mxEvent.addListener(modelCombobox, 'change',eventHandler); -} - -/** - * ------------------------------------------------------------------------------------------------------------------------------ - * 自定义配置面板(连线) - * ------------------------------------------------------------------------------------------------------------------------------ - */ -ConfigureFormatPanel.prototype.createConnectionUi = function(graph,formPanel,selectedCell){ - var valueTypeLabel,valueTypeCombobox,valueLabel,valueText,commandsLabel,commandsText; - var eventHandler =function(){ - if (!graph.isEditing()){ - graph.getModel().beginUpdate(); - try - { - var elt = selectedCell.value.cloneNode(true); - var selIndex = valueTypeCombobox.selectedIndex; - elt.setAttribute('label', valueText.value); - elt.setAttribute('value', valueText.value); - elt.setAttribute('valueType', valueTypeCombobox.value); - elt.setAttribute('commands', commandsText.value); - graph.getModel().setValue(selectedCell, elt); - console.log(graph); - } - finally - { - graph.getModel().endUpdate(); - } - } - }; - - valueTypeLabel =this.createLabel('[(#{mxgraph.re.editor.component.condition.edge.type})]',formPanel); - valueTypeCombobox =this.createCombobox(formPanel); - this.addOption(valueTypeCombobox,'',''); - this.addOption(valueTypeCombobox,'java.lang.String','[(#{mxgraph.re.editor.component.condition.edge.type.string})]'); - this.addOption(valueTypeCombobox,'java.math.BigDecimal','[(#{mxgraph.re.editor.component.condition.edge.type.number})]'); - this.addOption(valueTypeCombobox,'java.lang.Boolean','[(#{mxgraph.re.editor.component.condition.edge.type.boolean})]'); - valueTypeCombobox.value=selectedCell.getValue().getAttribute("valueType") || ''; - mxEvent.addListener(valueTypeCombobox, 'change',eventHandler); - - valueLabel =this.createLabel('[(#{mxgraph.re.editor.component.condition.edge.conditionValue})]',formPanel); - valueText =this.createText(formPanel); - valueText.value =selectedCell.getValue().getAttribute("value") || ''; - mxEvent.addListener(valueText, 'change',eventHandler); - - commandsLabel =this.createLabel('[(#{mxgraph.re.editor.component.commandSet.entity.commands})]',formPanel); - commandsText =this.createTextArea(200,formPanel); - commandsText.value =selectedCell.getAttribute('commands') || ''; - this.createCodemirrorButton(commandsText,eventHandler,formPanel); - mxEvent.addListener(commandsText, 'change',eventHandler); -} - -/** - * 创建表单面板 - */ -ConfigureFormatPanel.prototype.createFormPanel = function(){ - var formPanel =this.createPanel(); - formPanel.style.borderWidth = '0px'; - if (mxClient.IS_QUIRKS){ - formPanel.style.display = 'block'; - } - return formPanel; -} - -/** - * 创建表单 - */ -ConfigureFormatPanel.prototype.createForm =function(parent){ - var form =document.createElement('form'); - if(parent){ - parent.appendChild(form); - } - return form; -} - -/** - * 创建 DIV - */ -ConfigureFormatPanel.prototype.createDiv = function(){ - var div =document.createElement('div'); - div.style.width = '100%'; - return div; -} - -/** - * 创建 Label - */ -ConfigureFormatPanel.prototype.createLabel = function(title,parent){ - var label = this.createTitle(title); - label.style.width = '100%'; - if(parent){ - parent.appendChild(label); - } - return label; -} - -/** - * 创建 Combobox - */ -ConfigureFormatPanel.prototype.createCombobox = function(parent){ - var combobox =document.createElement('select'); - combobox.style.width = '210px'; - if(parent){ - parent.appendChild(combobox); - } - return combobox; -} - -/** - * 给 Combobox 添加选项 - */ -ConfigureFormatPanel.prototype.addOption = function(combobox,value,text){ - var option = document.createElement('option'); - option.setAttribute('value', value); - mxUtils.write(option, text); - combobox.appendChild(option); -} - -/** - * 创建 Text - */ -ConfigureFormatPanel.prototype.createText = function(parent){ - var text =document.createElement('input'); - text.type ='text'; - text.style.width = '210px'; - if(parent){ - parent.appendChild(text); - } - return text; -} - -/** - * 创建 TextArea - */ -ConfigureFormatPanel.prototype.createTextArea = function(height,parent){ - var textarea =document.createElement('textarea'); - textarea.setAttribute('wrap', 'off'); - textarea.setAttribute('spellcheck', 'false'); - textarea.setAttribute('autocorrect', 'off'); - textarea.setAttribute('autocomplete', 'off'); - textarea.setAttribute('autocapitalize', 'off'); - textarea.style.overflow = 'auto'; - textarea.style.resize = 'none'; - textarea.style.width = '210px'; - if(height){ - textarea.style.height =height + 'px'; - } - textarea.style.borderColor = '#CCCCCC'; - //textarea.readOnly =true; - if(parent){ - parent.appendChild(textarea); - } - return textarea; -} - -/** - * 创建 Codemirror - */ -ConfigureFormatPanel.prototype.createCodemirrorButton =function(targetTextareaWidget,okCallback,parent){ - var div =this.createDiv(); - div.style ='text-align:right;margin-right:6px;'; - - var commandsBtn = mxUtils.button('[(#{edit})]', mxUtils.bind(this, function(evt) - { - this.editorUi.actions.get('codemirror').funct(targetTextareaWidget,okCallback); - })); - commandsBtn.style.width = '80px'; - div.appendChild(commandsBtn); - - if(parent){ - parent.appendChild(div); - } - return commandsBtn; -} \ No newline at end of file diff --git a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/urlParameter.js b/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/urlParameter.js deleted file mode 100644 index c73fb9e4..00000000 --- a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/editor/urlParameter.js +++ /dev/null @@ -1,35 +0,0 @@ -// Parses URL parameters. Supported parameters are: -// - lang=xy: Specifies the language of the user interface. -// - touch=1: Enables a touch-style user interface. -// - storage=local: Enables HTML5 local storage. -// - chrome=0: Chromeless mode. -var urlParams = (function(url) -{ - var result = new Object(); - 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); - -// 设置基本变量 -window.mxBasePath = '[(@{/webjars/mxgraph/3.9.12/})]'; -window.STYLE_PATH = '[(@{/tools/graph-editor/styles})]'; -window.RESOURCES_PATH ='[(@{/tools/graph-editor})]'; -window.RESOURCE_BASE = window.RESOURCES_PATH + '/resources/grapheditor'; - -mxLoadResources = false; -mxLanguage = '[(${#locale.language})]'; diff --git a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/view/decisionTree.html b/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/view/decisionTree.html deleted file mode 100644 index 9210ddcf..00000000 --- a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/view/decisionTree.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/view/executionFlow.html b/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/view/executionFlow.html deleted file mode 100644 index bfbed1c3..00000000 --- a/io.sc.engine.rule.server/src/main/resources/templates/io/sc/engine/rule/server/view/executionFlow.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/io.sc.engine.st.frontend/package.json b/io.sc.engine.st.frontend/package.json index 9413a930..90f54c9b 100644 --- a/io.sc.engine.st.frontend/package.json +++ b/io.sc.engine.st.frontend/package.json @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.2.2", - "platform-core": "8.1.324", + "platform-core": "8.1.332", "quasar": "2.16.11", "tailwindcss": "3.4.10", "vue": "3.5.4", diff --git a/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json b/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json index e64c3c9e..cc881858 100644 --- a/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json +++ b/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json @@ -264,7 +264,7 @@ "math.toolbar.functions.formater.comma": "千分位, 保留 x 小数点后 y 位", "math.toolbar.functions.formater.percent": "百分数, 保留 x 小数点后 y 位", - "math.toolbar.userDefinedFunction":"自定义函数", + "math.toolbar.userDefinedFunction": "自定义函数", "math.contextMenu.miTomn": "变量 -> 常量", "math.contextMenu.mnTomi": "常量 -> 变量", @@ -275,17 +275,9 @@ "graph.toolbar.actions.zoomOut": "缩小", "graph.toolbar.actions.undo": "撤销", "graph.toolbar.actions.redo": "重做", - "graph.toolbar.actions.top": "置于顶层", - "graph.toolbar.actions.bottom": "置于底层", - "graph.toolbar.actions.fillColor": "填充颜色", - "graph.toolbar.actions.lineColor": "线条颜色", - "graph.toolbar.actions.shadow": "阴影", - "graph.toolbar.actions.connection": "连接", - "graph.toolbar.actions.path": "路径", "graph.setting.panel.properties.title": "属性", "graph.setting.panel.style.title": "样式", "graph.setting.panel.text.title": "文本", "graph.setting.panel.arrange.title": "排列" - } diff --git a/io.sc.platform.developer.frontend/package.json b/io.sc.platform.developer.frontend/package.json index 72dcd702..f94682d9 100644 --- a/io.sc.platform.developer.frontend/package.json +++ b/io.sc.platform.developer.frontend/package.json @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.2.2", - "platform-core": "8.1.324", + "platform-core": "8.1.332", "quasar": "2.16.11", "svg-path-commander": "2.0.10", "tailwindcss": "3.4.10", diff --git a/io.sc.platform.lcdp.frontend/package.json b/io.sc.platform.lcdp.frontend/package.json index ed1c6fd9..257aaf9c 100644 --- a/io.sc.platform.lcdp.frontend/package.json +++ b/io.sc.platform.lcdp.frontend/package.json @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.2.2", - "platform-core": "8.1.324", + "platform-core": "8.1.332", "quasar": "2.16.11", "tailwindcss": "3.4.10", "vue": "3.5.4", diff --git a/io.sc.platform.mvc.frontend/package.json b/io.sc.platform.mvc.frontend/package.json index b3235ad8..4815fc81 100644 --- a/io.sc.platform.mvc.frontend/package.json +++ b/io.sc.platform.mvc.frontend/package.json @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.2.2", - "platform-core": "8.1.324", + "platform-core": "8.1.332", "quasar": "2.16.11", "tailwindcss": "3.4.10", "vue": "3.5.4", diff --git a/io.sc.platform.scheduler.manager.frontend/package.json b/io.sc.platform.scheduler.manager.frontend/package.json index 4eee5942..2d17d843 100644 --- a/io.sc.platform.scheduler.manager.frontend/package.json +++ b/io.sc.platform.scheduler.manager.frontend/package.json @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.2.2", - "platform-core": "8.1.324", + "platform-core": "8.1.332", "quasar": "2.16.11", "tailwindcss": "3.4.10", "vue": "3.5.4", diff --git a/io.sc.platform.system.frontend/package.json b/io.sc.platform.system.frontend/package.json index ebac60fe..0b1542ab 100644 --- a/io.sc.platform.system.frontend/package.json +++ b/io.sc.platform.system.frontend/package.json @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.2.2", - "platform-core": "8.1.324", + "platform-core": "8.1.332", "quasar": "2.16.11", "tailwindcss": "3.4.10", "vue": "3.5.4", diff --git a/io.sc.standard.frontend/package.json b/io.sc.standard.frontend/package.json index fea635aa..4d46f795 100644 --- a/io.sc.standard.frontend/package.json +++ b/io.sc.standard.frontend/package.json @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.2.2", - "platform-core": "8.1.324", + "platform-core": "8.1.332", "quasar": "2.16.11", "tailwindcss": "3.4.10", "vue": "3.5.4",