Quellcode durchsuchen

Merge remote-tracking branch 'origin/master'

zhouhao vor 7 Jahren
Ursprung
Commit
bed3fd684a
100 geänderte Dateien mit 46996 neuen und 4 gelöschten Zeilen
  1. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/bg.png
  2. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/breadcrumbs.png
  3. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/checker-bg.png
  4. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/blue/message_catch.png
  5. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/business_rule.png
  6. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/error_catch.png
  7. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/error_throw.png
  8. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/manual.png
  9. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/message_catch.png
  10. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/message_throw.png
  11. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/receive.png
  12. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/script.png
  13. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/send.png
  14. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/service.png
  15. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/signal_catch.png
  16. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/signal_throw.png
  17. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/timer.png
  18. BIN
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/user.png
  19. 130 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/index.html
  20. 74 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/ActivitiRest.js
  21. 1 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/ActivityImpl.js
  22. 603 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/Color.js
  23. 270 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/LineBreakMeasurer.js
  24. 2172 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/ProcessDiagramCanvas.js
  25. 1087 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/ProcessDiagramGenerator.js
  26. 125 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/jquery/jquery.asyncqueue.js
  27. 9266 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/jquery/jquery.js
  28. 131 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/jquery/jquery.progressbar.js
  29. 23 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/jstools.js
  30. 10 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/raphael.2.1.1.js
  31. 10 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/raphael.js
  32. 441 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/textlayout.js
  33. 1 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/style.css
  34. 25 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/app-cfg.js
  35. 435 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/app.js
  36. 150 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-assignment-controller.js
  37. 58 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-condition-expression-controller.js
  38. 18 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-custom-controllers.js
  39. 266 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-event-listeners-controller.js
  40. 326 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-execution-listeners-controller.js
  41. 192 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-fields-controller.js
  42. 192 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-form-properties-controller.js
  43. 158 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-in-parameters-controller.js
  44. 48 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-message-scope-controller.js
  45. 34 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-multiinstance-controller.js
  46. 158 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-out-parameters-controller.js
  47. 47 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-signal-scope-controller.js
  48. 325 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-task-listeners-controller.js
  49. 4 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/assignment-display-template.html
  50. 44 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/assignment-popup.html
  51. 2 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/condition-expression-display-template.html
  52. 4 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/condition-expression-write-template.html
  53. 115 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/event-listeners-popup.html
  54. 4 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/execution-listeners-write-template.html
  55. 61 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/fields-popup.html
  56. 93 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/form-properties-popup.html
  57. 1 1
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/modeler/editor/editor-app/configuration/properties/event-listeners-write-template.html
  58. 3 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/in-parameters-display-template.html
  59. 53 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/in-parameters-popup.html
  60. 2 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/message-definitions-display-template.html
  61. 50 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/message-definitions-popup.html
  62. 3 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/message-definitions-write-template.html
  63. 4 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/message-property-write-template.html
  64. 8 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/multiinstance-property-write-template.html
  65. 3 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/out-parameters-display-template.html
  66. 53 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/out-parameters-popup.html
  67. 1 1
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/modeler/editor/editor-app/configuration/properties/duedate-write-template.html
  68. 3 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/sequenceflow-order-display-template.html
  69. 47 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/sequenceflow-order-popup.html
  70. 4 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/sequenceflow-order-write-template.html
  71. 3 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/signal-definitions-display-template.html
  72. 58 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/signal-definitions-popup.html
  73. 4 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/signal-definitions-write-template.html
  74. 4 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/signal-property-write-template.html
  75. 8 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/string-property-write-mode-template.html
  76. 43 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/subprocess-reference-popup.html
  77. 3 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/task-listeners-display-template.html
  78. 102 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/task-listeners-popup.html
  79. 1 1
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/modeler/editor/editor-app/configuration/properties/fields-write-template.html
  80. 17 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/text-popup.html
  81. 1 1
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/modeler/editor/editor-app/configuration/properties/assignment-write-template.html
  82. 18 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/toolbar-custom-actions.js
  83. 429 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/toolbar-default-actions.js
  84. 175 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/toolbar.js
  85. 34 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/url-config.js
  86. 1518 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/css/style-common.css
  87. 639 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/css/style-editor.css
  88. 471 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/css/style.css
  89. 32 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor-config.js
  90. 65 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor-controller.js
  91. 135 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor-utils.js
  92. 136 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor.html
  93. 202 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor/css/editor.css
  94. 383 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor/i18n/translation_de.js
  95. 423 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor/i18n/translation_en_us.js
  96. 106 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor/i18n/translation_signavio_de.js
  97. 108 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor/i18n/translation_signavio_en_us.js
  98. 24510 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor/oryx.debug.js
  99. 30 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor/oryx.js
  100. 0 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/eventbus.js

BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/bg.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/breadcrumbs.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/checker-bg.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/blue/message_catch.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/business_rule.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/error_catch.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/error_throw.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/manual.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/message_catch.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/message_throw.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/receive.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/script.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/send.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/service.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/signal_catch.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/signal_throw.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/timer.png


BIN
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/images/deployer/user.png


+ 130 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/index.html

@@ -0,0 +1,130 @@
+<html>
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  
+  <link rel="stylesheet" href="style.css" type="text/css" media="screen">
+  <script src="js/jstools.js" type="text/javascript" charset="utf-8"></script>
+  <script src="js/raphael.js" type="text/javascript" charset="utf-8"></script>
+  
+  <script src="js/jquery/jquery.js" type="text/javascript" charset="utf-8"></script>
+  <script src="js/jquery/jquery.progressbar.js" type="text/javascript" charset="utf-8"></script>
+  <script src="js/jquery/jquery.asyncqueue.js" type="text/javascript" charset="utf-8"></script>
+  
+  <script src="js/Color.js" type="text/javascript" charset="utf-8"></script>
+  <script src="js/Polyline.js" type="text/javascript" charset="utf-8"></script>
+  <script src="js/ActivityImpl.js" type="text/javascript" charset="utf-8"></script>
+  <script src="js/ActivitiRest.js" type="text/javascript" charset="utf-8"></script>
+  <script src="js/LineBreakMeasurer.js" type="text/javascript" charset="utf-8"></script>
+  <script src="js/ProcessDiagramGenerator.js" type="text/javascript" charset="utf-8"></script>
+  <script src="js/ProcessDiagramCanvas.js" type="text/javascript" charset="utf-8"></script>
+  
+  <style type="text/css" media="screen">
+    
+  </style>
+</head>
+<body>
+<div class="wrapper">
+  <div id="pb1"></div>
+  <div id="overlayBox" >
+    <div id="diagramBreadCrumbs" class="diagramBreadCrumbs" onmousedown="return false" onselectstart="return false"></div>
+    <div id="diagramHolder" class="diagramHolder"></div>
+    <div class="diagram-info" id="diagramInfo"></div>
+  </div>
+</div>
+<script language='javascript'>
+var DiagramGenerator = {};
+var pb1;
+$(document).ready(function(){
+  var query_string = {};
+  var query = window.location.search.substring(1);
+  var vars = query.split("&");
+  for (var i=0;i<vars.length;i++) {
+    var pair = vars[i].split("=");
+    query_string[pair[0]] = pair[1];
+  } 
+  
+  var processDefinitionId = query_string["processDefinitionId"];
+  var processInstanceId = query_string["processInstanceId"];
+  
+  console.log("Initialize progress bar");
+  
+  pb1 = new $.ProgressBar({
+    boundingBox: '#pb1',
+    label: 'Progressbar!',
+    on: {
+      complete: function() {
+        console.log("Progress Bar COMPLETE");
+        this.set('label', 'complete!');
+        if (processInstanceId) {
+          ProcessDiagramGenerator.drawHighLights(processInstanceId);
+        }
+      },
+      valueChange: function(e) {
+        this.set('label', e.newVal + '%');
+      }
+    },
+    value: 0
+  });
+  console.log("Progress bar inited");
+  
+  ProcessDiagramGenerator.options = {
+    diagramBreadCrumbsId: "diagramBreadCrumbs",
+    diagramHolderId: "diagramHolder",
+    diagramInfoId: "diagramInfo",
+    on: {
+      click: function(canvas, element, contextObject){
+        var mouseEvent = this;
+        console.log("[CLICK] mouseEvent: %o, canvas: %o, clicked element: %o, contextObject: %o", mouseEvent, canvas, element, contextObject);
+
+        if (contextObject.getProperty("type") == "callActivity") {
+          var processDefinitonKey = contextObject.getProperty("processDefinitonKey");
+          var processDefinitons = contextObject.getProperty("processDefinitons");
+          var processDefiniton = processDefinitons[0];
+          console.log("Load callActivity '" + processDefiniton.processDefinitionKey + "', contextObject: ", contextObject);
+
+          // Load processDefinition
+        ProcessDiagramGenerator.drawDiagram(processDefiniton.processDefinitionId);
+        }
+      },
+      rightClick: function(canvas, element, contextObject){
+        var mouseEvent = this;
+        console.log("[RIGHTCLICK] mouseEvent: %o, canvas: %o, clicked element: %o, contextObject: %o", mouseEvent, canvas, element, contextObject);
+      },
+      over: function(canvas, element, contextObject){
+        var mouseEvent = this;
+        //console.log("[OVER] mouseEvent: %o, canvas: %o, clicked element: %o, contextObject: %o", mouseEvent, canvas, element, contextObject);
+
+        // TODO: show tooltip-window with contextObject info
+        ProcessDiagramGenerator.showActivityInfo(contextObject);
+      },
+      out: function(canvas, element, contextObject){
+        var mouseEvent = this;
+        //console.log("[OUT] mouseEvent: %o, canvas: %o, clicked element: %o, contextObject: %o", mouseEvent, canvas, element, contextObject);
+
+        ProcessDiagramGenerator.hideInfo();
+      }
+    }
+  };
+  
+  var baseUrl = window.document.location.protocol + "//" + window.document.location.host + "/";
+  var shortenedUrl = window.document.location.href.replace(baseUrl, "");
+  baseUrl = baseUrl + shortenedUrl.substring(0, shortenedUrl.indexOf("/"));
+  
+  ActivitiRest.options = {
+    processInstanceHighLightsUrl: baseUrl + "/service/process-instance/{processInstanceId}/highlights?callback=?",
+    processDefinitionUrl: baseUrl + "/service/process-definition/{processDefinitionId}/diagram-layout?callback=?",
+    processDefinitionByKeyUrl: baseUrl + "/service/process-definition/{processDefinitionKey}/diagram-layout?callback=?"
+  };
+  
+  if (processDefinitionId) {
+    ProcessDiagramGenerator.drawDiagram(processDefinitionId);
+    
+  } else {
+    alert("processDefinitionId parameter is required");
+  }
+});
+
+
+</script>
+</body>
+</html>

+ 74 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/ActivitiRest.js

@@ -0,0 +1,74 @@
+var ActivitiRest = {
+	options: {},
+	getProcessDefinitionByKey: function(processDefinitionKey, callback) {
+		var url = Lang.sub(this.options.processDefinitionByKeyUrl, {processDefinitionKey: processDefinitionKey});
+		
+		$.ajax({
+			url: url,
+			dataType: 'jsonp',
+			cache: false,
+			async: true,
+			success: function(data, textStatus) {
+				var processDefinition = data;
+				if (!processDefinition) {
+					console.error("Process definition '" + processDefinitionKey + "' not found");
+				} else {
+				  callback.apply({processDefinitionId: processDefinition.id});
+				}
+			}
+		}).done(function(data, textStatus) {
+			console.log("ajax done");
+		}).fail(function(jqXHR, textStatus, error){
+			console.error('Get diagram layout['+processDefinitionKey+'] failure: ', textStatus, 'error: ', error, jqXHR);
+		});
+	},
+	
+	getProcessDefinition: function(processDefinitionId, callback) {
+		var url = Lang.sub(this.options.processDefinitionUrl, {processDefinitionId: processDefinitionId});
+		
+		$.ajax({
+			url: url,
+			dataType: 'jsonp',
+			cache: false,
+			async: true,
+			success: function(data, textStatus) {
+				var processDefinitionDiagramLayout = data;
+				if (!processDefinitionDiagramLayout) {
+					console.error("Process definition diagram layout '" + processDefinitionId + "' not found");
+					return;
+				} else {
+					callback.apply({processDefinitionDiagramLayout: processDefinitionDiagramLayout});
+				}
+			}
+		}).done(function(data, textStatus) {
+			console.log("ajax done");
+		}).fail(function(jqXHR, textStatus, error){
+			console.log('Get diagram layout['+processDefinitionId+'] failure: ', textStatus, jqXHR);
+		});
+	},
+	
+	getHighLights: function(processInstanceId, callback) {
+		var url = Lang.sub(this.options.processInstanceHighLightsUrl, {processInstanceId: processInstanceId});
+		
+		$.ajax({
+			url: url,
+			dataType: 'jsonp',
+			cache: false,
+			async: true,
+			success: function(data, textStatus) {
+				console.log("ajax returned data");
+				var highLights = data;
+				if (!highLights) {
+					console.log("highLights not found");
+					return;
+				} else {
+					callback.apply({highLights: highLights});
+				}
+			}
+		}).done(function(data, textStatus) {
+			console.log("ajax done");
+		}).fail(function(jqXHR, textStatus, error){
+		  console.log('Get HighLights['+processInstanceId+'] failure: ', textStatus, jqXHR);
+		});
+	}
+};

Datei-Diff unterdrückt, da er zu groß ist
+ 1 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/ActivityImpl.js


+ 603 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/Color.js

@@ -0,0 +1,603 @@
+/**
+ * Web color table
+ * 
+ * @author Dmitry Farafonov
+ */
+
+var Color = {
+   /**
+   * The color white.  In the default sRGB space.
+   */
+  white     : Raphael.getRGB("rgb(255,255,255)"),
+  
+  /**
+   * The color white.  In the default sRGB space.
+   */
+  WHITE : this.white,
+  
+  /**
+   * The color light gray.  In the default sRGB space.
+   */
+  lightGray : Raphael.getRGB("rgb(192, 192, 192)"),
+  
+  /**
+   * The color light gray.  In the default sRGB space.
+   */
+  LIGHT_GRAY : this.lightGray,
+  
+  /**
+   * The color gray.  In the default sRGB space.
+   */
+  gray : Raphael.getRGB("rgb(128, 128, 128)"),
+  
+  /**
+   * The color gray.  In the default sRGB space.
+   */
+  GRAY : this.gray,
+  
+  /**
+   * The color dark gray.  In the default sRGB space.
+   */
+  darkGray : Raphael.getRGB("rgb(64, 64, 64)"),
+  
+  /**
+   * The color dark gray.  In the default sRGB space.
+   */
+  DARK_GRAY : this.darkGray,
+  
+  /**
+   * The color black.  In the default sRGB space.
+   */
+  black : Raphael.getRGB("rgb(0, 0, 0)"),
+  
+  /**
+   * The color black.  In the default sRGB space.
+   */
+  BLACK : this.black,
+  
+  /**
+   * The color red.  In the default sRGB space.
+   */
+  red : Raphael.getRGB("rgb(255, 0, 0)"),
+  
+  /**
+   * The color red.  In the default sRGB space.
+   */
+  RED : this.red,
+  
+  /**
+   * The color pink.  In the default sRGB space.
+   */
+  pink : Raphael.getRGB("rgb(255, 175, 175)"),
+  
+  /**
+   * The color pink.  In the default sRGB space.
+   */
+  PINK : this.pink,
+  
+  /**
+   * The color orange.  In the default sRGB space.
+   */
+  orange : Raphael.getRGB("rgb(255, 200, 0)"),
+  
+  /**
+   * The color orange.  In the default sRGB space.
+   */
+  ORANGE : this.orange,
+  
+  /**
+   * The color yellow.  In the default sRGB space.
+   */
+  yellow : Raphael.getRGB("rgb(255, 255, 0)"),
+  
+  /**
+   * The color yellow.  In the default sRGB space.
+   */
+  YELLOW : this.yellow,
+  
+  /**
+   * The color green.  In the default sRGB space.
+   */
+  green : Raphael.getRGB("rgb(0, 255, 0)"),
+  
+  /**
+   * The color green.  In the default sRGB space.
+   */
+  GREEN : this.green,
+  
+  /**
+   * The color magenta.  In the default sRGB space.
+   */
+  magenta : Raphael.getRGB("rgb(255, 0, 255)"),
+  
+  /**
+   * The color magenta.  In the default sRGB space.
+   */
+  MAGENTA : this.magenta,
+  
+  /**
+   * The color cyan.  In the default sRGB space.
+   */
+  cyan : Raphael.getRGB("rgb(0, 255, 255)"),
+  
+  /**
+   * The color cyan.  In the default sRGB space.
+   */
+  CYAN : this.cyan,
+  
+  /**
+   * The color blue.  In the default sRGB space.
+   */
+  blue : Raphael.getRGB("rgb(0, 0, 255)"),
+  
+  /**
+   * The color blue.  In the default sRGB space.
+   */
+  BLUE : this.blue,
+  
+  /************************************************************************/
+
+  // http://www.stm.dp.ua/web-design/color-html.php
+  
+	Snow			:   Raphael.getRGB("#FFFAFA	"),  // 	255 250 250
+	GhostWhite		:   Raphael.getRGB("#F8F8FF	"),  // 	248 248 255
+	WhiteSmoke		:   Raphael.getRGB("#F5F5F5	"),  // 	245 245 245
+	Gainsboro		:   Raphael.getRGB("#DCDCDC	"),  // 	220 220 220
+	FloralWhite		:   Raphael.getRGB("#FFFAF0	"),  // 	255 250 240
+	OldLace			:   Raphael.getRGB("#FDF5E6	"),  // 	253 245 230
+	Linen			:   Raphael.getRGB("#FAF0E6	"),  // 	250 240 230
+	AntiqueWhite	:   Raphael.getRGB("#FAEBD7	"),  // 	250 235 215
+	PapayaWhip		:   Raphael.getRGB("#FFEFD5	"),  // 	255 239 213
+	BlanchedAlmond	:   Raphael.getRGB("#FFEBCD	"),  // 	255 235 205
+	Bisque			:   Raphael.getRGB("#FFE4C4	"),  // 	255 228 196
+	PeachPuff		:   Raphael.getRGB("#FFDAB9	"),  // 	255 218 185
+	NavajoWhite		:   Raphael.getRGB("#FFDEAD	"),  // 	255 222 173
+	Moccasin		:   Raphael.getRGB("#FFE4B5	"),  // 	255 228 181
+	Cornsilk		:   Raphael.getRGB("#FFF8DC	"),  // 	255 248 220
+	Ivory			:   Raphael.getRGB("#FFFFF0	"),  // 	255 255 240
+	LemonChiffon	:   Raphael.getRGB("#FFFACD	"),  // 	255 250 205
+	Seashell		:   Raphael.getRGB("#FFF5EE	"),  // 	255 245 238
+	Honeydew		:   Raphael.getRGB("#F0FFF0	"),  // 	240 255 240
+	MintCream		:   Raphael.getRGB("#F5FFFA	"),  // 	245 255 250
+	Azure			:   Raphael.getRGB("#F0FFFF	"),  // 	240 255 255
+	AliceBlue		:   Raphael.getRGB("#F0F8FF	"),  // 	240 248 255
+	lavender		:   Raphael.getRGB("#E6E6FA	"),  // 	230 230 250
+	LavenderBlush	:   Raphael.getRGB("#FFF0F5	"),  // 	255 240 245
+	MistyRose		:   Raphael.getRGB("#FFE4E1	"),  // 	255 228 225
+	White			:   Raphael.getRGB("#FFFFFF	"),  // 	255 255 255
+	Black			:   Raphael.getRGB("#000000	"),  // 	0 0 0
+	DarkSlateGray	:   Raphael.getRGB("#2F4F4F	"),  // 	47 79 79
+	DimGrey			:   Raphael.getRGB("#696969	"),  // 	105 105 105
+	SlateGrey		:   Raphael.getRGB("#708090	"),  // 	112 128 144
+	LightSlateGray	:   Raphael.getRGB("#778899	"),  // 	119 136 153
+	Grey			:   Raphael.getRGB("#BEBEBE	"),  // 	190 190 190
+	LightGray		:   Raphael.getRGB("#D3D3D3	"),  // 	211 211 211
+	MidnightBlue	:   Raphael.getRGB("#191970	"),  // 	25 25 112
+	NavyBlue		:   Raphael.getRGB("#000080	"),  // 	0 0 128
+	CornflowerBlue	:   Raphael.getRGB("#6495ED	"),  // 	100 149 237
+	DarkSlateBlue	:   Raphael.getRGB("#483D8B	"),  // 	72 61 139
+	SlateBlue		:   Raphael.getRGB("#6A5ACD	"),  // 	106 90 205
+	MediumSlateBlue	:   Raphael.getRGB("#7B68EE	"),  // 	123 104 238
+	LightSlateBlue	:   Raphael.getRGB("#8470FF	"),  // 	132 112 255
+	MediumBlue		:   Raphael.getRGB("#0000CD	"),  // 	0 0 205
+	RoyalBlue		:   Raphael.getRGB("#4169E1	"),  // 	65 105 225
+	Blue			:   Raphael.getRGB("#0000FF	"),  // 	0 0 255
+	DodgerBlue		:   Raphael.getRGB("#1E90FF	"),  // 	30 144 255
+	DeepSkyBlue		:   Raphael.getRGB("#00BFFF	"),  // 	0 191 255
+	SkyBlue			:   Raphael.getRGB("#87CEEB	"),  // 	135 206 235
+	LightSkyBlue	:   Raphael.getRGB("#87CEFA	"),  // 	135 206 250
+	SteelBlue		:   Raphael.getRGB("#4682B4	"),  // 	70 130 180
+	LightSteelBlue	:   Raphael.getRGB("#B0C4DE	"),  // 	176 196 222
+	LightBlue		:   Raphael.getRGB("#ADD8E6	"),  // 	173 216 230
+	PowderBlue		:   Raphael.getRGB("#B0E0E6	"),  // 	176 224 230
+	PaleTurquoise	:   Raphael.getRGB("#AFEEEE	"),  // 	175 238 238
+	DarkTurquoise	:   Raphael.getRGB("#00CED1	"),  // 	0 206 209
+	MediumTurquoise	:   Raphael.getRGB("#48D1CC	"),  // 	72 209 204
+	Turquoise		:   Raphael.getRGB("#40E0D0	"),  // 	64 224 208
+	Cyan			:   Raphael.getRGB("#00FFFF	"),  // 	0 255 255
+	LightCyan		:   Raphael.getRGB("#E0FFFF	"),  // 	224 255 255
+	CadetBlue		:   Raphael.getRGB("#5F9EA0	"),  // 	95 158 160
+	MediumAquamarine:   Raphael.getRGB("#66CDAA	"),  // 	102 205 170
+	Aquamarine		:   Raphael.getRGB("#7FFFD4	"),  // 	127 255 212
+	DarkGreen		:   Raphael.getRGB("#006400	"),  // 	0 100 0
+	DarkOliveGreen	:   Raphael.getRGB("#556B2F	"),  // 	85 107 47
+	DarkSeaGreen	:   Raphael.getRGB("#8FBC8F	"),  // 	143 188 143
+	SeaGreen		:   Raphael.getRGB("#2E8B57	"),  // 	46 139 87
+	MediumSeaGreen	:   Raphael.getRGB("#3CB371	"),  // 	60 179 113
+	LightSeaGreen	:   Raphael.getRGB("#20B2AA	"),  // 	32 178 170
+	PaleGreen		:   Raphael.getRGB("#98FB98	"),  // 	152 251 152
+	SpringGreen		:   Raphael.getRGB("#00FF7F	"),  // 	0 255 127
+	LawnGreen		:   Raphael.getRGB("#7CFC00	"),  // 	124 252 0
+	Green			:   Raphael.getRGB("#00FF00	"),  // 	0 255 0
+	Chartreuse		:   Raphael.getRGB("#7FFF00	"),  // 	127 255 0
+	MedSpringGreen	:   Raphael.getRGB("#00FA9A	"),  // 	0 250 154
+	GreenYellow		:   Raphael.getRGB("#ADFF2F	"),  // 	173 255 47
+	LimeGreen		:   Raphael.getRGB("#32CD32	"),  // 	50 205 50
+	YellowGreen		:   Raphael.getRGB("#9ACD32	"),  // 	154 205 50
+	ForestGreen		:   Raphael.getRGB("#228B22	"),  // 	34 139 34
+	OliveDrab		:   Raphael.getRGB("#6B8E23	"),  // 	107 142 35
+	DarkKhaki		:   Raphael.getRGB("#BDB76B	"),  // 	189 183 107
+	PaleGoldenrod	:   Raphael.getRGB("#EEE8AA	"),  // 	238 232 170
+	LtGoldenrodYello:   Raphael.getRGB("#FAFAD2	"),  // 	250 250 210
+	LightYellow		:   Raphael.getRGB("#FFFFE0	"),  // 	255 255 224
+	Yellow			:   Raphael.getRGB("#FFFF00	"),  // 	255 255 0
+	Gold			:   Raphael.getRGB("#FFD700	"),  // 	255 215 0
+	LightGoldenrod	:   Raphael.getRGB("#EEDD82	"),  // 	238 221 130
+	goldenrod		:   Raphael.getRGB("#DAA520	"),  // 	218 165 32
+	DarkGoldenrod	:   Raphael.getRGB("#B8860B	"),  // 	184 134 11
+	RosyBrown		:   Raphael.getRGB("#BC8F8F	"),  // 	188 143 143
+	IndianRed		:   Raphael.getRGB("#CD5C5C	"),  // 	205 92 92
+	SaddleBrown		:   Raphael.getRGB("#8B4513	"),  // 	139 69 19
+	Sienna			:   Raphael.getRGB("#A0522D	"),  // 	160 82 45
+	Peru			:   Raphael.getRGB("#CD853F	"),  // 	205 133 63
+	Burlywood		:   Raphael.getRGB("#DEB887	"),  // 	222 184 135
+	Beige			:   Raphael.getRGB("#F5F5DC	"),  // 	245 245 220
+	Wheat			:   Raphael.getRGB("#F5DEB3	"),  // 	245 222 179
+	SandyBrown		:   Raphael.getRGB("#F4A460	"),  // 	244 164 96
+	Tan				:   Raphael.getRGB("#D2B48C	"),  // 	210 180 140
+	Chocolate		:   Raphael.getRGB("#D2691E	"),  // 	210 105 30
+	Firebrick		:   Raphael.getRGB("#B22222	"),  // 	178 34 34
+	Brown			:   Raphael.getRGB("#A52A2A	"),  // 	165 42 42
+	DarkSalmon		:   Raphael.getRGB("#E9967A	"),  // 	233 150 122
+	Salmon			:   Raphael.getRGB("#FA8072	"),  // 	250 128 114
+	LightSalmon		:   Raphael.getRGB("#FFA07A	"),  // 	255 160 122
+	Orange			:   Raphael.getRGB("#FFA500	"),  // 	255 165 0
+	DarkOrange		:   Raphael.getRGB("#FF8C00	"),  // 	255 140 0
+	Coral			:   Raphael.getRGB("#FF7F50	"),  // 	255 127 80
+	LightCoral		:   Raphael.getRGB("#F08080	"),  // 	240 128 128
+	Tomato			:   Raphael.getRGB("#FF6347	"),  // 	255 99 71
+	OrangeRed		:   Raphael.getRGB("#FF4500	"),  // 	255 69 0
+	Red				:   Raphael.getRGB("#FF0000	"),  // 	255 0 0
+	HotPink			:   Raphael.getRGB("#FF69B4	"),  // 	255 105 180
+	DeepPink		:   Raphael.getRGB("#FF1493	"),  // 	255 20 147
+	Pink			:   Raphael.getRGB("#FFC0CB	"),  // 	255 192 203
+	LightPink		:   Raphael.getRGB("#FFB6C1	"),  // 	255 182 193
+	PaleVioletRed	:   Raphael.getRGB("#DB7093	"),  // 	219 112 147
+	Maroon			:   Raphael.getRGB("#B03060	"),  // 	176 48 96
+	MediumVioletRed	:   Raphael.getRGB("#C71585	"),  // 	199 21 133
+	VioletRed		:   Raphael.getRGB("#D02090	"),  // 	208 32 144
+	Magenta			:   Raphael.getRGB("#FF00FF	"),  // 	255 0 255
+	Violet			:   Raphael.getRGB("#EE82EE	"),  // 	238 130 238
+	Plum			:   Raphael.getRGB("#DDA0DD	"),  // 	221 160 221
+	Orchid			:   Raphael.getRGB("#DA70D6	"),  // 	218 112 214
+	MediumOrchid	:   Raphael.getRGB("#BA55D3	"),  // 	186 85 211
+	DarkOrchid		:   Raphael.getRGB("#9932CC	"),  // 	153 50 204
+	DarkViolet		:   Raphael.getRGB("#9400D3	"),  // 	148 0 211
+	BlueViolet		:   Raphael.getRGB("#8A2BE2	"),  // 	138 43 226
+	Purple			:   Raphael.getRGB("#A020F0	"),  // 	160 32 240
+	MediumPurple	:   Raphael.getRGB("#9370DB	"),  // 	147 112 219
+	Thistle			:   Raphael.getRGB("#D8BFD8	"),  // 	216 191 216
+	Snow1			:   Raphael.getRGB("#FFFAFA	"),  // 	255 250 250
+	Snow2			:   Raphael.getRGB("#EEE9E9	"),  // 	238 233 233
+	Snow3			:   Raphael.getRGB("#CDC9C9	"),  // 	205 201 201
+	Snow4			:   Raphael.getRGB("#8B8989	"),  // 	139 137 137
+	Seashell1		:   Raphael.getRGB("#FFF5EE	"),  // 	255 245 238
+	Seashell2		:   Raphael.getRGB("#EEE5DE	"),  // 	238 229 222
+	Seashell3		:   Raphael.getRGB("#CDC5BF	"),  // 	205 197 191
+	Seashell4		:   Raphael.getRGB("#8B8682	"),  // 	139 134 130
+	AntiqueWhite1	:   Raphael.getRGB("#FFEFDB	"),  // 	255 239 219
+	AntiqueWhite2	:   Raphael.getRGB("#EEDFCC	"),  // 	238 223 204
+	AntiqueWhite3	:   Raphael.getRGB("#CDC0B0	"),  // 	205 192 176
+	AntiqueWhite4	:   Raphael.getRGB("#8B8378	"),  // 	139 131 120
+	Bisque1			:   Raphael.getRGB("#FFE4C4	"),  // 	255 228 196
+	Bisque2			:   Raphael.getRGB("#EED5B7	"),  // 	238 213 183
+	Bisque3			:   Raphael.getRGB("#CDB79E	"),  // 	205 183 158
+	Bisque4			:   Raphael.getRGB("#8B7D6B	"),  // 	139 125 107
+	PeachPuff1		:   Raphael.getRGB("#FFDAB9	"),  // 	255 218 185
+	PeachPuff2		:   Raphael.getRGB("#EECBAD	"),  // 	238 203 173
+	PeachPuff3		:   Raphael.getRGB("#CDAF95	"),  // 	205 175 149
+	PeachPuff4		:   Raphael.getRGB("#8B7765	"),  // 	139 119 101
+	NavajoWhite1	:   Raphael.getRGB("#FFDEAD	"),  // 	255 222 173
+	NavajoWhite2	:   Raphael.getRGB("#EECFA1	"),  // 	238 207 161
+	NavajoWhite3	:   Raphael.getRGB("#CDB38B	"),  // 	205 179 139
+	NavajoWhite4	:   Raphael.getRGB("#8B795E	"),  // 	139 121 94
+	LemonChiffon1	:   Raphael.getRGB("#FFFACD	"),  // 	255 250 205
+	LemonChiffon2	:   Raphael.getRGB("#EEE9BF	"),  // 	238 233 191
+	LemonChiffon3	:   Raphael.getRGB("#CDC9A5	"),  // 	205 201 165
+	LemonChiffon4	:   Raphael.getRGB("#8B8970	"),  // 	139 137 112
+	Cornsilk1		:   Raphael.getRGB("#FFF8DC	"),  // 	255 248 220
+	Cornsilk2		:   Raphael.getRGB("#EEE8CD	"),  // 	238 232 205
+	Cornsilk3		:   Raphael.getRGB("#CDC8B1	"),  // 	205 200 177
+	Cornsilk4		:   Raphael.getRGB("#8B8878	"),  // 	139 136 120
+	Ivory1			:   Raphael.getRGB("#FFFFF0	"),  // 	255 255 240
+	Ivory2			:   Raphael.getRGB("#EEEEE0	"),  // 	238 238 224
+	Ivory3			:   Raphael.getRGB("#CDCDC1	"),  // 	205 205 193
+	Ivory4			:   Raphael.getRGB("#8B8B83	"),  // 	139 139 131
+	Honeydew1		:   Raphael.getRGB("#F0FFF0	"),  // 	240 255 240
+	Honeydew2		:   Raphael.getRGB("#E0EEE0	"),  // 	224 238 224
+	Honeydew3		:   Raphael.getRGB("#C1CDC1	"),  // 	193 205 193
+	Honeydew4		:   Raphael.getRGB("#838B83	"),  // 	131 139 131
+	LavenderBlush1	:   Raphael.getRGB("#FFF0F5	"),  // 	255 240 245
+	LavenderBlush2	:   Raphael.getRGB("#EEE0E5	"),  // 	238 224 229
+	LavenderBlush3	:   Raphael.getRGB("#CDC1C5	"),  // 	205 193 197
+	LavenderBlush4	:   Raphael.getRGB("#8B8386	"),  // 	139 131 134
+	MistyRose1		:   Raphael.getRGB("#FFE4E1	"),  // 	255 228 225
+	MistyRose2		:   Raphael.getRGB("#EED5D2	"),  // 	238 213 210
+	MistyRose3		:   Raphael.getRGB("#CDB7B5	"),  // 	205 183 181
+	MistyRose4		:   Raphael.getRGB("#8B7D7B	"),  // 	139 125 123
+	Azure1			:   Raphael.getRGB("#F0FFFF	"),  // 	240 255 255
+	Azure2			:   Raphael.getRGB("#E0EEEE	"),  // 	224 238 238
+	Azure3			:   Raphael.getRGB("#C1CDCD	"),  // 	193 205 205
+	Azure4			:   Raphael.getRGB("#838B8B	"),  // 	131 139 139
+	SlateBlue1		:   Raphael.getRGB("#836FFF	"),  // 	131 111 255
+	SlateBlue2		:   Raphael.getRGB("#7A67EE	"),  // 	122 103 238
+	SlateBlue3		:   Raphael.getRGB("#6959CD	"),  // 	105 89 205
+	SlateBlue4		:   Raphael.getRGB("#473C8B	"),  // 	71 60 139
+	RoyalBlue1		:   Raphael.getRGB("#4876FF	"),  // 	72 118 255
+	RoyalBlue2		:   Raphael.getRGB("#436EEE	"),  // 	67 110 238
+	RoyalBlue3		:   Raphael.getRGB("#3A5FCD	"),  // 	58 95 205
+	RoyalBlue4		:   Raphael.getRGB("#27408B	"),  // 	39 64 139
+	Blue1			:   Raphael.getRGB("#0000FF	"),  // 	0 0 255
+	Blue2			:   Raphael.getRGB("#0000EE	"),  // 	0 0 238
+	Blue3			:   Raphael.getRGB("#0000CD	"),  // 	0 0 205
+	Blue4			:   Raphael.getRGB("#00008B	"),  // 	0 0 139
+	DodgerBlue1		:   Raphael.getRGB("#1E90FF	"),  // 	30 144 255
+	DodgerBlue2		:   Raphael.getRGB("#1C86EE	"),  // 	28 134 238
+	DodgerBlue3		:   Raphael.getRGB("#1874CD	"),  // 	24 116 205
+	DodgerBlue4		:   Raphael.getRGB("#104E8B	"),  // 	16 78 139
+	SteelBlue1		:   Raphael.getRGB("#63B8FF	"),  // 	99 184 255
+	SteelBlue2		:   Raphael.getRGB("#5CACEE	"),  // 	92 172 238
+	SteelBlue3		:   Raphael.getRGB("#4F94CD	"),  // 	79 148 205
+	SteelBlue4		:   Raphael.getRGB("#36648B	"),  // 	54 100 139
+	DeepSkyBlue1	:   Raphael.getRGB("#00BFFF	"),  // 	0 191 255
+	DeepSkyBlue2	:   Raphael.getRGB("#00B2EE	"),  // 	0 178 238
+	DeepSkyBlue3	:   Raphael.getRGB("#009ACD	"),  // 	0 154 205
+	DeepSkyBlue4	:   Raphael.getRGB("#00688B	"),  // 	0 104 139
+	SkyBlue1		:   Raphael.getRGB("#87CEFF	"),  // 	135 206 255
+	SkyBlue2		:   Raphael.getRGB("#7EC0EE	"),  // 	126 192 238
+	SkyBlue3		:   Raphael.getRGB("#6CA6CD	"),  // 	108 166 205
+	SkyBlue4		:   Raphael.getRGB("#4A708B	"),  // 	74 112 139
+	LightSkyBlue1	:   Raphael.getRGB("#B0E2FF	"),  // 	176 226 255
+	LightSkyBlue2	:   Raphael.getRGB("#A4D3EE	"),  // 	164 211 238
+	LightSkyBlue3	:   Raphael.getRGB("#8DB6CD	"),  // 	141 182 205
+	LightSkyBlue4	:   Raphael.getRGB("#607B8B	"),  // 	96 123 139
+	SlateGray1		:   Raphael.getRGB("#C6E2FF	"),  // 	198 226 255
+	SlateGray2		:   Raphael.getRGB("#B9D3EE	"),  // 	185 211 238
+	SlateGray3		:   Raphael.getRGB("#9FB6CD	"),  // 	159 182 205
+	SlateGray4		:   Raphael.getRGB("#6C7B8B	"),  // 	108 123 139
+	LightSteelBlue1	:   Raphael.getRGB("#CAE1FF	"),  // 	202 225 255
+	LightSteelBlue2	:   Raphael.getRGB("#BCD2EE	"),  // 	188 210 238
+	LightSteelBlue3	:   Raphael.getRGB("#A2B5CD	"),  // 	162 181 205
+	LightSteelBlue4	:   Raphael.getRGB("#6E7B8B	"),  // 	110 123 139
+	LightBlue1		:   Raphael.getRGB("#BFEFFF	"),  // 	191 239 255
+	LightBlue2		:   Raphael.getRGB("#B2DFEE	"),  // 	178 223 238
+	LightBlue3		:   Raphael.getRGB("#9AC0CD	"),  // 	154 192 205
+	LightBlue4		:   Raphael.getRGB("#68838B	"),  // 	104 131 139
+	LightCyan1		:   Raphael.getRGB("#E0FFFF	"),  // 	224 255 255
+	LightCyan2		:   Raphael.getRGB("#D1EEEE	"),  // 	209 238 238
+	LightCyan3		:   Raphael.getRGB("#B4CDCD	"),  // 	180 205 205
+	LightCyan4		:   Raphael.getRGB("#7A8B8B	"),  // 	122 139 139
+	PaleTurquoise1	:   Raphael.getRGB("#BBFFFF	"),  // 	187 255 255
+	PaleTurquoise2	:   Raphael.getRGB("#AEEEEE	"),  // 	174 238 238
+	PaleTurquoise3	:   Raphael.getRGB("#96CDCD	"),  // 	150 205 205
+	PaleTurquoise4	:   Raphael.getRGB("#668B8B	"),  // 	102 139 139
+	CadetBlue1		:   Raphael.getRGB("#98F5FF	"),  // 	152 245 255
+	CadetBlue2		:   Raphael.getRGB("#8EE5EE	"),  // 	142 229 238
+	CadetBlue3		:   Raphael.getRGB("#7AC5CD	"),  // 	122 197 205
+	CadetBlue4		:   Raphael.getRGB("#53868B	"),  // 	83 134 139
+	Turquoise1		:   Raphael.getRGB("#00F5FF	"),  // 	0 245 255
+	Turquoise2		:   Raphael.getRGB("#00E5EE	"),  // 	0 229 238
+	Turquoise3		:   Raphael.getRGB("#00C5CD	"),  // 	0 197 205
+	Turquoise4		:   Raphael.getRGB("#00868B	"),  // 	0 134 139
+	Cyan1			:   Raphael.getRGB("#00FFFF	"),  // 	0 255 255
+	Cyan2			:   Raphael.getRGB("#00EEEE	"),  // 	0 238 238
+	Cyan3			:   Raphael.getRGB("#00CDCD	"),  // 	0 205 205
+	Cyan4			:   Raphael.getRGB("#008B8B	"),  // 	0 139 139
+	DarkSlateGray1	:   Raphael.getRGB("#97FFFF	"),  // 	151 255 255
+	DarkSlateGray2	:   Raphael.getRGB("#8DEEEE	"),  // 	141 238 238
+	DarkSlateGray3	:   Raphael.getRGB("#79CDCD	"),  // 	121 205 205
+	DarkSlateGray4	:   Raphael.getRGB("#528B8B	"),  // 	82 139 139
+	Aquamarine1		:   Raphael.getRGB("#7FFFD4	"),  // 	127 255 212
+	Aquamarine2		:   Raphael.getRGB("#76EEC6	"),  // 	118 238 198
+	Aquamarine3		:   Raphael.getRGB("#66CDAA	"),  // 	102 205 170
+	Aquamarine4		:   Raphael.getRGB("#458B74	"),  // 	69 139 116
+	DarkSeaGreen1	:   Raphael.getRGB("#C1FFC1	"),  // 	193 255 193
+	DarkSeaGreen2	:   Raphael.getRGB("#B4EEB4	"),  // 	180 238 180
+	DarkSeaGreen3	:   Raphael.getRGB("#9BCD9B	"),  // 	155 205 155
+	DarkSeaGreen4	:   Raphael.getRGB("#698B69	"),  // 	105 139 105
+	SeaGreen1		:   Raphael.getRGB("#54FF9F	"),  // 	84 255 159
+	SeaGreen2		:   Raphael.getRGB("#4EEE94	"),  // 	78 238 148
+	SeaGreen3		:   Raphael.getRGB("#43CD80	"),  // 	67 205 128
+	SeaGreen4		:   Raphael.getRGB("#2E8B57	"),  // 	46 139 87
+	PaleGreen1		:   Raphael.getRGB("#9AFF9A	"),  // 	154 255 154
+	PaleGreen2		:   Raphael.getRGB("#90EE90	"),  // 	144 238 144
+	PaleGreen3		:   Raphael.getRGB("#7CCD7C	"),  // 	124 205 124
+	PaleGreen4		:   Raphael.getRGB("#548B54	"),  // 	84 139 84
+	SpringGreen1	:   Raphael.getRGB("#00FF7F	"),  // 	0 255 127
+	SpringGreen2	:   Raphael.getRGB("#00EE76	"),  // 	0 238 118
+	SpringGreen3	:   Raphael.getRGB("#00CD66	"),  // 	0 205 102
+	SpringGreen4	:   Raphael.getRGB("#008B45	"),  // 	0 139 69
+	Green1			:   Raphael.getRGB("#00FF00	"),  // 	0 255 0
+	Green2			:   Raphael.getRGB("#00EE00	"),  // 	0 238 0
+	Green3			:   Raphael.getRGB("#00CD00	"),  // 	0 205 0
+	Green4			:   Raphael.getRGB("#008B00	"),  // 	0 139 0
+	Chartreuse1		:   Raphael.getRGB("#7FFF00	"),  // 	127 255 0
+	Chartreuse2		:   Raphael.getRGB("#76EE00	"),  // 	118 238 0
+	Chartreuse3		:   Raphael.getRGB("#66CD00	"),  // 	102 205 0
+	Chartreuse4		:   Raphael.getRGB("#458B00	"),  // 	69 139 0
+	OliveDrab1		:   Raphael.getRGB("#C0FF3E	"),  // 	192 255 62
+	OliveDrab2		:   Raphael.getRGB("#B3EE3A	"),  // 	179 238 58
+	OliveDrab3		:   Raphael.getRGB("#9ACD32	"),  // 	154 205 50
+	OliveDrab4		:   Raphael.getRGB("#698B22	"),  // 	105 139 34
+	DarkOliveGreen1	:   Raphael.getRGB("#CAFF70	"),  // 	202 255 112
+	DarkOliveGreen2	:   Raphael.getRGB("#BCEE68	"),  // 	188 238 104
+	DarkOliveGreen3	:   Raphael.getRGB("#A2CD5A	"),  // 	162 205 90
+	DarkOliveGreen4	:   Raphael.getRGB("#6E8B3D	"),  // 	110 139 61
+	Khaki1			:   Raphael.getRGB("#FFF68F	"),  // 	255 246 143
+	Khaki2			:   Raphael.getRGB("#EEE685	"),  // 	238 230 133
+	Khaki3			:   Raphael.getRGB("#CDC673	"),  // 	205 198 115
+	Khaki4			:   Raphael.getRGB("#8B864E	"),  // 	139 134 78
+	LightGoldenrod1	:   Raphael.getRGB("#FFEC8B	"),  // 	255 236 139
+	LightGoldenrod2	:   Raphael.getRGB("#EEDC82	"),  // 	238 220 130
+	LightGoldenrod3	:   Raphael.getRGB("#CDBE70	"),  // 	205 190 112
+	LightGoldenrod4	:   Raphael.getRGB("#8B814C	"),  // 	139 129 76
+	LightYellow1	:   Raphael.getRGB("#FFFFE0	"),  // 	255 255 224
+	LightYellow2	:   Raphael.getRGB("#EEEED1	"),  // 	238 238 209
+	LightYellow3	:   Raphael.getRGB("#CDCDB4	"),  // 	205 205 180
+	LightYellow4	:   Raphael.getRGB("#8B8B7A	"),  // 	139 139 122
+	Yellow1			:   Raphael.getRGB("#FFFF00	"),  // 	255 255 0
+	Yellow2			:   Raphael.getRGB("#EEEE00	"),  // 	238 238 0
+	Yellow3			:   Raphael.getRGB("#CDCD00	"),  // 	205 205 0
+	Yellow4			:   Raphael.getRGB("#8B8B00	"),  // 	139 139 0
+	Gold1			:   Raphael.getRGB("#FFD700	"),  // 	255 215 0
+	Gold2			:   Raphael.getRGB("#EEC900	"),  // 	238 201 0
+	Gold3			:   Raphael.getRGB("#CDAD00	"),  // 	205 173 0
+	Gold4			:   Raphael.getRGB("#8B7500	"),  // 	139 117 0
+	Goldenrod1		:   Raphael.getRGB("#FFC125	"),  // 	255 193 37
+	Goldenrod2		:   Raphael.getRGB("#EEB422	"),  // 	238 180 34
+	Goldenrod3		:   Raphael.getRGB("#CD9B1D	"),  // 	205 155 29
+	Goldenrod4		:   Raphael.getRGB("#8B6914	"),  // 	139 105 20
+	DarkGoldenrod1	:   Raphael.getRGB("#FFB90F	"),  // 	255 185 15
+	DarkGoldenrod2	:   Raphael.getRGB("#EEAD0E	"),  // 	238 173 14
+	DarkGoldenrod3	:   Raphael.getRGB("#CD950C	"),  // 	205 149 12
+	DarkGoldenrod4	:   Raphael.getRGB("#8B658B	"),  // 	139 101 8
+	RosyBrown1		:   Raphael.getRGB("#FFC1C1	"),  // 	255 193 193
+	RosyBrown2		:   Raphael.getRGB("#EEB4B4	"),  // 	238 180 180
+	RosyBrown3		:   Raphael.getRGB("#CD9B9B	"),  // 	205 155 155
+	RosyBrown4		:   Raphael.getRGB("#8B6969	"),  // 	139 105 105
+	IndianRed1		:   Raphael.getRGB("#FF6A6A	"),  // 	255 106 106
+	IndianRed2		:   Raphael.getRGB("#EE6363	"),  // 	238 99 99
+	IndianRed3		:   Raphael.getRGB("#CD5555	"),  // 	205 85 85
+	IndianRed4		:   Raphael.getRGB("#8B3A3A	"),  // 	139 58 58
+	Sienna1			:   Raphael.getRGB("#FF8247	"),  // 	255 130 71
+	Sienna2			:   Raphael.getRGB("#EE7942	"),  // 	238 121 66
+	Sienna3			:   Raphael.getRGB("#CD6839	"),  // 	205 104 57
+	Sienna4			:   Raphael.getRGB("#8B4726	"),  // 	139 71 38
+	Burlywood1		:   Raphael.getRGB("#FFD39B	"),  // 	255 211 155
+	Burlywood2		:   Raphael.getRGB("#EEC591	"),  // 	238 197 145
+	Burlywood3		:   Raphael.getRGB("#CDAA7D	"),  // 	205 170 125
+	Burlywood4		:   Raphael.getRGB("#8B7355	"),  // 	139 115 85
+	Wheat1			:   Raphael.getRGB("#FFE7BA	"),  // 	255 231 186
+	Wheat2			:   Raphael.getRGB("#EED8AE	"),  // 	238 216 174
+	Wheat3			:   Raphael.getRGB("#CDBA96	"),  // 	205 186 150
+	Wheat4			:   Raphael.getRGB("#8B7E66	"),  // 	139 126 102
+	Tan1			:   Raphael.getRGB("#FFA54F	"),  // 	255 165 79
+	Tan2			:   Raphael.getRGB("#EE9A49	"),  // 	238 154 73
+	Tan3			:   Raphael.getRGB("#CD853F	"),  // 	205 133 63
+	Tan4			:   Raphael.getRGB("#8B5A2B	"),  // 	139 90 43
+	Chocolate1		:   Raphael.getRGB("#FF7F24	"),  // 	255 127 36
+	Chocolate2		:   Raphael.getRGB("#EE7621	"),  // 	238 118 33
+	Chocolate3		:   Raphael.getRGB("#CD661D	"),  // 	205 102 29
+	Chocolate4		:   Raphael.getRGB("#8B4513	"),  // 	139 69 19
+	Firebrick1		:   Raphael.getRGB("#FF3030	"),  // 	255 48 48
+	Firebrick2		:   Raphael.getRGB("#EE2C2C	"),  // 	238 44 44
+	Firebrick3		:   Raphael.getRGB("#CD2626	"),  // 	205 38 38
+	Firebrick4		:   Raphael.getRGB("#8B1A1A	"),  // 	139 26 26
+	Brown1			:   Raphael.getRGB("#FF4040	"),  // 	255 64 64
+	Brown2			:   Raphael.getRGB("#EE3B3B	"),  // 	238 59 59
+	Brown3			:   Raphael.getRGB("#CD3333	"),  // 	205 51 51
+	Brown4			:   Raphael.getRGB("#8B2323	"),  // 	139 35 35
+	Salmon1			:   Raphael.getRGB("#FF8C69	"),  // 	255 140 105
+	Salmon2			:   Raphael.getRGB("#EE8262	"),  // 	238 130 98
+	Salmon3			:   Raphael.getRGB("#CD7054	"),  // 	205 112 84
+	Salmon4			:   Raphael.getRGB("#8B4C39	"),  // 	139 76 57
+	LightSalmon1	:   Raphael.getRGB("#FFA07A	"),  // 	255 160 122
+	LightSalmon2	:   Raphael.getRGB("#EE9572	"),  // 	238 149 114
+	LightSalmon3	:   Raphael.getRGB("#CD8162	"),  // 	205 129 98
+	LightSalmon4	:   Raphael.getRGB("#8B5742	"),  // 	139 87 66
+	Orange1			:   Raphael.getRGB("#FFA500	"),  // 	255 165 0
+	Orange2			:   Raphael.getRGB("#EE9A00	"),  // 	238 154 0
+	Orange3			:   Raphael.getRGB("#CD8500	"),  // 	205 133 0
+	Orange4			:   Raphael.getRGB("#8B5A00	"),  // 	139 90 0
+	DarkOrange1		:   Raphael.getRGB("#FF7F00	"),  // 	255 127 0
+	DarkOrange2		:   Raphael.getRGB("#EE7600	"),  // 	238 118 0
+	DarkOrange3		:   Raphael.getRGB("#CD6600	"),  // 	205 102 0
+	DarkOrange4		:   Raphael.getRGB("#8B4500	"),  // 	139 69 0
+	Coral1			:   Raphael.getRGB("#FF7256	"),  // 	255 114 86
+	Coral2			:   Raphael.getRGB("#EE6A50	"),  // 	238 106 80
+	Coral3			:   Raphael.getRGB("#CD5B45	"),  // 	205 91 69
+	Coral4			:   Raphael.getRGB("#8B3E2F	"),  // 	139 62 47
+	Tomato1			:   Raphael.getRGB("#FF6347	"),  // 	255 99 71
+	Tomato2			:   Raphael.getRGB("#EE5C42	"),  // 	238 92 66
+	Tomato3			:   Raphael.getRGB("#CD4F39	"),  // 	205 79 57
+	Tomato4			:   Raphael.getRGB("#8B3626	"),  // 	139 54 38
+	OrangeRed1		:   Raphael.getRGB("#FF4500	"),  // 	255 69 0
+	OrangeRed2		:   Raphael.getRGB("#EE4000	"),  // 	238 64 0
+	OrangeRed3		:   Raphael.getRGB("#CD3700	"),  // 	205 55 0
+	OrangeRed4		:   Raphael.getRGB("#8B2500	"),  // 	139 37 0
+	Red1			:   Raphael.getRGB("#FF0000	"),  // 	255 0 0
+	Red2			:   Raphael.getRGB("#EE0000	"),  // 	238 0 0
+	Red3			:   Raphael.getRGB("#CD0000	"),  // 	205 0 0
+	Red4			:   Raphael.getRGB("#8B0000	"),  // 	139 0 0
+	DeepPink1		:   Raphael.getRGB("#FF1493	"),  // 	255 20 147
+	DeepPink2		:   Raphael.getRGB("#EE1289	"),  // 	238 18 137
+	DeepPink3		:   Raphael.getRGB("#CD1076	"),  // 	205 16 118
+	DeepPink4		:   Raphael.getRGB("#8B0A50	"),  // 	139 10 80
+	HotPink1		:   Raphael.getRGB("#FF6EB4	"),  // 	255 110 180
+	HotPink2		:   Raphael.getRGB("#EE6AA7	"),  // 	238 106 167
+	HotPink3		:   Raphael.getRGB("#CD6090	"),  // 	205 96 144
+	HotPink4		:   Raphael.getRGB("#8B3A62	"),  // 	139 58 98
+	Pink1			:   Raphael.getRGB("#FFB5C5	"),  // 	255 181 197
+	Pink2			:   Raphael.getRGB("#EEA9B8	"),  // 	238 169 184
+	Pink3			:   Raphael.getRGB("#CD919E	"),  // 	205 145 158
+	Pink4			:   Raphael.getRGB("#8B636C	"),  // 	139 99 108
+	LightPink1		:   Raphael.getRGB("#FFAEB9	"),  // 	255 174 185
+	LightPink2		:   Raphael.getRGB("#EEA2AD	"),  // 	238 162 173
+	LightPink3		:   Raphael.getRGB("#CD8C95	"),  // 	205 140 149
+	LightPink4		:   Raphael.getRGB("#8B5F65	"),  // 	139 95 101
+	PaleVioletRed1	:   Raphael.getRGB("#FF82AB	"),  // 	255 130 171
+	PaleVioletRed2	:   Raphael.getRGB("#EE799F	"),  // 	238 121 159
+	PaleVioletRed3	:   Raphael.getRGB("#CD6889	"),  // 	205 104 137
+	PaleVioletRed4	:   Raphael.getRGB("#8B475D	"),  // 	139 71 93
+	Maroon1			:   Raphael.getRGB("#FF34B3	"),  // 	255 52 179
+	Maroon2			:   Raphael.getRGB("#EE30A7	"),  // 	238 48 167
+	Maroon3			:   Raphael.getRGB("#CD2990	"),  // 	205 41 144
+	Maroon4			:   Raphael.getRGB("#8B1C62	"),  // 	139 28 98
+	VioletRed1		:   Raphael.getRGB("#FF3E96	"),  // 	255 62 150
+	VioletRed2		:   Raphael.getRGB("#EE3A8C	"),  // 	238 58 140
+	VioletRed3		:   Raphael.getRGB("#CD3278	"),  // 	205 50 120
+	VioletRed4		:   Raphael.getRGB("#8B2252	"),  // 	139 34 82
+	Magenta1		:   Raphael.getRGB("#FF00FF	"),  // 	255 0 255
+	Magenta2		:   Raphael.getRGB("#EE00EE	"),  // 	238 0 238
+	Magenta3		:   Raphael.getRGB("#CD00CD	"),  // 	205 0 205
+	Magenta4		:   Raphael.getRGB("#8B008B	"),  // 	139 0 139
+	Orchid1			:   Raphael.getRGB("#FF83FA	"),  // 	255 131 250
+	Orchid2			:   Raphael.getRGB("#EE7AE9	"),  // 	238 122 233
+	Orchid3			:   Raphael.getRGB("#CD69C9	"),  // 	205 105 201
+	Orchid4			:   Raphael.getRGB("#8B4789	"),  // 	139 71 137
+	Plum1			:   Raphael.getRGB("#FFBBFF	"),  // 	255 187 255
+	Plum2			:   Raphael.getRGB("#EEAEEE	"),  // 	238 174 238
+	Plum3			:   Raphael.getRGB("#CD96CD	"),  // 	205 150 205
+	Plum4			:   Raphael.getRGB("#8B668B	"),  // 	139 102 139
+	MediumOrchid1	:   Raphael.getRGB("#E066FF	"),  // 	224 102 255
+	MediumOrchid2	:   Raphael.getRGB("#D15FEE	"),  // 	209 95 238
+	MediumOrchid3	:   Raphael.getRGB("#B452CD	"),  // 	180 82 205
+	MediumOrchid4	:   Raphael.getRGB("#7A378B	"),  // 	122 55 139
+	DarkOrchid1		:   Raphael.getRGB("#BF3EFF	"),  // 	191 62 255
+	DarkOrchid2		:   Raphael.getRGB("#B23AEE	"),  // 	178 58 238
+	DarkOrchid3		:   Raphael.getRGB("#9A32CD	"),  // 	154 50 205
+	DarkOrchid4		:   Raphael.getRGB("#68228B	"),  // 	104 34 139
+	Purple1			:   Raphael.getRGB("#9B30FF	"),  // 	155 48 255
+	Purple2			:   Raphael.getRGB("#912CEE	"),  // 	145 44 238
+	Purple3			:   Raphael.getRGB("#7D26CD	"),  // 	125 38 205
+	Purple4			:   Raphael.getRGB("#551A8B	"),  // 	85 26 139
+	MediumPurple1	:   Raphael.getRGB("#AB82FF	"),  // 	171 130 255
+	MediumPurple2	:   Raphael.getRGB("#9F79EE	"),  // 	159 121 238
+	MediumPurple3	:   Raphael.getRGB("#8968CD	"),  // 	137 104 205
+	MediumPurple4	:   Raphael.getRGB("#5D478B	"),  // 	93 71 139
+	Thistle1		:   Raphael.getRGB("#FFE1FF	"),  // 	255 225 255
+	Thistle2		:   Raphael.getRGB("#EED2EE	"),  // 	238 210 238
+	Thistle3		:   Raphael.getRGB("#CDB5CD	"),  // 	205 181 205
+	Thistle4		:   Raphael.getRGB("#8B7B8B	"),  // 	139 123 139
+	grey11			:   Raphael.getRGB("#1C1C1C	"),  // 	28 28 28
+	grey21			:   Raphael.getRGB("#363636	"),  // 	54 54 54
+	grey31			:   Raphael.getRGB("#4F4F4F	"),  // 	79 79 79
+	grey41			:   Raphael.getRGB("#696969	"),  // 	105 105 105
+	grey51			:   Raphael.getRGB("#828282	"),  // 	130 130 130
+	grey61			:   Raphael.getRGB("#9C9C9C	"),  // 	156 156 156
+	grey71			:   Raphael.getRGB("#B5B5B5	"),  // 	181 181 181
+	gray81			:   Raphael.getRGB("#CFCFCF	"),  // 	207 207 207
+	gray91			:   Raphael.getRGB("#E8E8E8	"),  // 	232 232 232
+	DarkGrey		:   Raphael.getRGB("#A9A9A9	"),  // 	169 169 169
+	DarkBlue		:   Raphael.getRGB("#00008B	"),  // 	0 0 139
+	DarkCyan		:   Raphael.getRGB("#008B8B	"),  // 	0 139 139
+	DarkMagenta		:   Raphael.getRGB("#8B008B	"),  // 	139 0 139
+	DarkRed			:   Raphael.getRGB("#8B0000	"),  // 	139 0 0
+	LightGreen		:   Raphael.getRGB("#90EE90	"),  // 	144 238 144
+
+  
+  
+  get: function(R, G, B){
+	return Raphael.getRGB("rgb(" + R + ", " + G + ", " + B + ")");
+  }
+};

+ 270 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/LineBreakMeasurer.js

@@ -0,0 +1,270 @@
+/**
+ * Word wrapping
+ * 
+ * @author (Javascript) Dmitry Farafonov
+ */
+
+		var AttributedStringIterator = function(text){
+				//this.text = this.rtrim(this.ltrim(text));
+				text = text.replace(/(\s)+/, " ");
+				this.text = this.rtrim(text);
+				/*
+				if (beginIndex < 0 || beginIndex > endIndex || endIndex > length()) {
+					throw new IllegalArgumentException("Invalid substring range");
+				}
+				*/
+				this.beginIndex = 0;
+				this.endIndex = this.text.length;
+				this.currentIndex = this.beginIndex;
+				
+				//console.group("[AttributedStringIterator]");
+				var i = 0;
+				var string = this.text;
+				var fullPos = 0;
+				
+				//console.log("string: \"" + string + "\", length: " + string.length);
+				this.startWordOffsets = [];
+				this.startWordOffsets.push(fullPos);
+				
+				// TODO: remove i 1000
+				while (i<1000) {
+					var pos = string.search(/[ \t\n\f-\.\,]/);
+					if (pos == -1)
+						break;
+					
+					// whitespace start
+					fullPos += pos;
+					string = string.substr(pos);
+					////console.log("fullPos: " + fullPos + ", pos: " + pos +  ", string: ", string);
+					
+					// remove whitespaces
+					var pos = string.search(/[^ \t\n\f-\.\,]/);
+					if (pos == -1)
+						break;
+						
+					// whitespace end
+					fullPos += pos;
+					string = string.substr(pos);
+					
+					////console.log("fullPos: " + fullPos);
+					this.startWordOffsets.push(fullPos);
+					
+					i++;
+				}
+				//console.log("startWordOffsets: ", this.startWordOffsets);
+				//console.groupEnd();
+			};
+			AttributedStringIterator.prototype = {
+				getEndIndex: function(pos){
+					if (typeof(pos) == "undefined")
+						return this.endIndex;
+						
+					var string = this.text.substr(pos, this.endIndex - pos);
+					
+					var posEndOfLine = string.search(/[\n]/);
+					if (posEndOfLine == -1)
+						return this.endIndex;
+					else
+						return pos + posEndOfLine;
+				},
+				getBeginIndex: function(){
+					return this.beginIndex;
+				},
+				isWhitespace: function(pos){
+					var str = this.text[pos];
+					var whitespaceChars = " \t\n\f";
+					
+					return (whitespaceChars.indexOf(str) != -1);
+				},
+				isNewLine: function(pos){
+					var str = this.text[pos];
+					var whitespaceChars = "\n";
+					
+					return (whitespaceChars.indexOf(str) != -1);
+				},
+				preceding: function(pos){
+					//console.group("[AttributedStringIterator.preceding]");
+					for(var i in this.startWordOffsets) {
+						var startWordOffset = this.startWordOffsets[i];
+						if (pos < startWordOffset && i>0) {
+							//console.log("startWordOffset: " + this.startWordOffsets[i-1]);
+							//console.groupEnd();
+							return this.startWordOffsets[i-1];
+						}
+					}
+					//console.log("pos: " + pos);
+					//console.groupEnd();
+					return this.startWordOffsets[i];
+				},
+				following: function(pos){
+					//console.group("[AttributedStringIterator.following]");
+					for(var i in this.startWordOffsets) {
+						var startWordOffset = this.startWordOffsets[i];
+						if (pos < startWordOffset && i>0) {
+							//console.log("startWordOffset: " + this.startWordOffsets[i]);
+							//console.groupEnd();
+							return this.startWordOffsets[i];
+						}
+					}
+					//console.log("pos: " + pos);
+					//console.groupEnd();
+					return this.startWordOffsets[i];
+				},
+				ltrim: function(str){
+					var patt2=/^\s+/g;
+					return str.replace(patt2, "");
+				}, 
+				rtrim: function(str){
+					var patt2=/\s+$/g;
+					return str.replace(patt2, "");
+				},
+				getLayout: function(start, limit){
+					return this.text.substr(start, limit - start);
+				},
+				getCharAtPos: function(pos) {
+					return this.text[pos];
+				}
+			};
+
+		var LineBreakMeasurer = function(paper, x, y, text, fontAttrs){
+				this.paper = paper;
+				this.text = new AttributedStringIterator(text);
+				this.fontAttrs = fontAttrs;
+				
+				if (this.text.getEndIndex() - this.text.getBeginIndex() < 1) {
+					throw {message: "Text must contain at least one character.", code: "IllegalArgumentException"};
+				}
+				
+				//this.measurer = new TextMeasurer(paper, this.text, this.fontAttrs);
+				this.limit = this.text.getEndIndex();
+				this.pos = this.start = this.text.getBeginIndex();
+				
+				this.rafaelTextObject = this.paper.text(x, y, this.text.text).attr(fontAttrs).attr("text-anchor", "start");
+				this.svgTextObject = this.rafaelTextObject[0];
+			};
+			LineBreakMeasurer.prototype = {
+				nextOffset: function(wrappingWidth, offsetLimit, requireNextWord) {
+					//console.group("[nextOffset]");
+					var nextOffset = this.pos;
+					if (this.pos < this.limit) {
+						if (offsetLimit <= this.pos) {
+							throw {message: "offsetLimit must be after current position", code: "IllegalArgumentException"};
+						}
+						
+						var charAtMaxAdvance = this.getLineBreakIndex(this.pos, wrappingWidth);
+						//charAtMaxAdvance --;
+						//console.log("charAtMaxAdvance:", charAtMaxAdvance, ", [" + this.text.getCharAtPos(charAtMaxAdvance) + "]");
+						
+						if (charAtMaxAdvance == this.limit) {
+							nextOffset = this.limit;
+							//console.log("charAtMaxAdvance == this.limit");
+						} else if (this.text.isNewLine(charAtMaxAdvance)) {
+							//console.log("isNewLine");
+							nextOffset = charAtMaxAdvance+1;
+						} else if (this.text.isWhitespace(charAtMaxAdvance)) {
+							// TODO: find next noSpaceChar
+							//return nextOffset;
+							nextOffset = this.text.following(charAtMaxAdvance);
+						} else {
+							// Break is in a word;  back up to previous break.
+							/*
+							var testPos = charAtMaxAdvance + 1;
+							if (testPos == this.limit) {
+								console.error("hbz...");
+							} else {
+								nextOffset = this.text.preceding(charAtMaxAdvance);
+							}
+							*/
+							nextOffset = this.text.preceding(charAtMaxAdvance);
+							
+							if (nextOffset <= this.pos) {
+								nextOffset = Math.max(this.pos+1, charAtMaxAdvance);
+							}
+						}
+					}
+					if (nextOffset > offsetLimit) {
+						nextOffset = offsetLimit;
+					}
+					//console.log("nextOffset: " + nextOffset);
+					//console.groupEnd();
+					return nextOffset;
+				},
+				nextLayout: function(wrappingWidth) {
+					//console.groupCollapsed("[nextLayout]");
+					if (this.pos < this.limit) {
+						var requireNextWord = false;
+						var layoutLimit = this.nextOffset(wrappingWidth, this.limit, requireNextWord);
+						//console.log("layoutLimit:", layoutLimit);
+						if (layoutLimit == this.pos) {
+							//console.groupEnd();
+							return null;
+						}
+						var result = this.text.getLayout(this.pos, layoutLimit);
+						//console.log("layout: \"" + result + "\"");
+						
+						// remove end of line
+						
+						//var posEndOfLine = this.text.getEndIndex(this.pos);
+						//if (posEndOfLine < result.length)
+						//	result = result.substr(0, posEndOfLine);
+						
+						this.pos = layoutLimit;
+						
+						//console.groupEnd();
+						return result;
+					} else {
+						//console.groupEnd();
+						return null;
+					}
+				},
+				getLineBreakIndex: function(pos, wrappingWidth) {
+					//console.group("[getLineBreakIndex]");
+					//console.log("pos:"+pos + ", text: \""+ this.text.text.replace(/\n/g, "_").substr(pos, 1) + "\"");
+					
+					var bb = this.rafaelTextObject.getBBox();
+					
+					var charNum = -1;
+					try {
+						var svgPoint = this.svgTextObject.getStartPositionOfChar(pos);
+						//var dot = this.paper.ellipse(svgPoint.x, svgPoint.y, 1, 1).attr({"stroke-width": 0, fill: Color.blue});
+						svgPoint.x = svgPoint.x + wrappingWidth;
+						//svgPoint.y = bb.y;
+						//console.log("svgPoint:", svgPoint);
+					
+						//var dot = this.paper.ellipse(svgPoint.x, svgPoint.y, 1, 1).attr({"stroke-width": 0, fill: Color.red});
+					
+						charNum = this.svgTextObject.getCharNumAtPosition(svgPoint);
+					} catch (e){
+						console.warn("getStartPositionOfChar error, pos:" + pos);
+						/*
+						var testPos = pos + 1;
+						if (testPos < this.limit) {
+							return testPos
+						}
+						*/
+					}
+					//console.log("charNum:", charNum);
+					if (charNum == -1) {
+						//console.groupEnd();
+						return this.text.getEndIndex(pos);
+					} else {
+						// When case there is new line between pos and charnum then use this new line
+						var newLineIndex = this.text.getEndIndex(pos);
+						if (newLineIndex < charNum ) {
+							console.log("newLineIndex <= charNum, newLineIndex:"+newLineIndex+", charNum:"+charNum, "\"" + this.text.text.substr(newLineIndex+1).replace(/\n/g, "?") + "\"");
+							//console.groupEnd();
+							
+							return newLineIndex;
+						}
+							
+						//var charAtMaxAdvance  = this.text.text.substring(charNum, charNum + 1);
+						var charAtMaxAdvance  = this.text.getCharAtPos(charNum);
+						//console.log("!!charAtMaxAdvance: " + charAtMaxAdvance);
+						//console.groupEnd();
+						return charNum;
+					}
+				}, 
+				getPosition: function() {
+					return this.pos;
+				}
+			};

Datei-Diff unterdrückt, da er zu groß ist
+ 2172 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/ProcessDiagramCanvas.js


Datei-Diff unterdrückt, da er zu groß ist
+ 1087 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/ProcessDiagramGenerator.js


+ 125 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/jquery/jquery.asyncqueue.js

@@ -0,0 +1,125 @@
+/*
+* This file is part of the jquery plugin "asyncQueue".
+*
+* (c) Sebastien Roch <roch.sebastien@gmail.com>
+* @author (parallel) Dmitry Farafonov
+*
+* For the full copyright and license information, please view the LICENSE
+* file that was distributed with this source code.
+*/
+(function($){
+    $.AsyncQueue = function() {
+        var that = this,
+            queue = [],
+			completeFunc,
+            failureFunc,
+            paused = false,
+            lastCallbackData,
+            _run,
+			_complete,
+			inQueue = 0,
+			defaultTimeOut = 10;
+
+        _run = function() {
+            var f = queue.shift();
+
+            if (f) {
+				inQueue++;
+				setTimeout(function(){
+					f.fn.apply(that, [that]);
+				
+					if (!f.isParallel)
+						if (paused === false) {
+							_run();
+						}
+					inQueue --;
+					if (inQueue == 0 && queue.length == 0)
+						_complete();
+				}, f.timeOut);                
+				
+				if (f.isParallel)
+					if (paused === false) {
+						_run();
+					}
+            }
+        };
+		
+		_complete = function(){
+			if (completeFunc)
+					completeFunc.apply(that, [that]);
+		};
+
+		this.onComplete = function(func) {
+            completeFunc = func;
+        };
+		
+		this.onFailure = function(func) {
+            failureFunc = func;
+        };
+
+        this.add = function(func) {
+			// TODO: add callback for queue[i] complete
+			
+			var obj = arguments[0];
+			if (obj && Object.prototype.toString.call(obj) === "[object Array]") {
+				var fn = arguments[1];
+				var timeOut = (typeof(arguments[2]) != "undefined")? arguments[2] : defaultTimeOut;
+				if (typeof(fn) == "function") {
+					for(var i = 0; i < obj.length; i++) {
+						var f = function(objx){
+							queue.push({isParallel: true, fn: function(){fn.apply(that, [that, objx]);}, timeOut: timeOut});
+						}(obj[i])
+					}
+				}
+			} else {
+				var fn = arguments[0];
+				var timeOut = (typeof(arguments[1]) != "undefined")? arguments[2] : defaultTimeOut;
+				queue.push({isParallel: false, fn: func, timeOut: timeOut});
+			}
+            return this;
+        };
+		
+		this.addParallel = function(func, timeOut) {
+			// TODO: add callback for queue[i] complete
+			
+            queue.push({isParallel: true, fn: func, timeOut: timeOut});
+            return this;
+        };
+
+        this.storeData = function(dataObject) {
+            lastCallbackData = dataObject;
+            return this;
+        };
+
+        this.lastCallbackData = function () {
+            return lastCallbackData;
+        };
+
+        this.run = function() {
+            paused = false;
+            _run();
+        };
+
+        this.pause = function () {
+            paused = true;
+            return this;
+        };
+
+        this.failure = function() {
+            paused = true;
+            if (failureFunc) {
+                var args = [that];
+                for(i = 0; i < arguments.length; i++) {
+                    args.push(arguments[i]);
+                }
+                failureFunc.apply(that, args);
+            }
+        };
+		
+		this.size = function(){
+			return queue.length;
+		};
+
+        return this;
+    }
+})(jQuery);

Datei-Diff unterdrückt, da er zu groß ist
+ 9266 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/jquery/jquery.js


+ 131 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/jquery/jquery.progressbar.js

@@ -0,0 +1,131 @@
+/*
+ * @ Dmitry Farafonov
+ */
+
+(function($){
+$.ProgressBar = function(options) {
+	this.element = $(options.boundingBox);
+	if (options.on && options.on.complete){
+		this.onComplete = options.on.complete;
+	}
+	if (options.on && options.on.valueChange){
+		this.onValueChange = options.on.valueChange;
+	}
+	
+	this._create();
+	
+	if (options.label)
+		this.set("label", options.label);
+	if (options.value)
+		this.value(options.value);
+	if (options.max)
+		this.set("max", options.max);
+};
+$.ProgressBar.prototype = {
+	options: {
+		value: 0,
+		max: 100
+	},
+
+	min: 0,
+
+	_create: function() {
+		this.element
+			.addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+			.attr({
+				role: "progressbar",
+				"aria-valuemin": this.min,
+				"aria-valuemax": this.options.max,
+				"aria-valuenow": this._value()
+			});
+
+		this.valueDiv = $( "<div class='ui-progressbar-label'></div>" )
+			.appendTo( this.element );
+			
+		this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
+			.appendTo( this.element );
+
+		this.oldValue = this._value();
+		this._refreshValue();
+	},
+
+	_destroy: function() {
+		this.element
+			.removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-valuemin" )
+			.removeAttr( "aria-valuemax" )
+			.removeAttr( "aria-valuenow" );
+
+		this.valueDiv.remove();
+	},
+
+	value: function( newValue ) {
+		if ( newValue === undefined ) {
+			return this._value();
+		}
+
+		this._setOption( "value", newValue );
+		return this;
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "value" ) {
+			//var oldVal = this.options.value;
+			this.options.value = value;
+			this._refreshValue();
+			
+			if (this.onValueChange)
+				this.onValueChange.apply(this, [{oldVal: this.oldValue, newVal: value}]);
+			
+			if ( this._value() === this.options.max ) {
+				//this._trigger( "complete" );
+				if (this.onComplete)
+					this.onComplete.apply(this);
+			}
+		} else if (key === "label") {
+			$(this.element).find(".ui-progressbar-label").html(value);
+		} else if (key === "max") {
+			this.options.max = value;
+		}
+
+		//this._super( key, value );
+	},
+
+	_value: function() {
+		var val = this.options.value;
+		// normalize invalid value
+		if ( typeof val !== "number" ) {
+			val = 0;
+		}
+		return Math.min( this.options.max, Math.max( this.min, val ) );
+	},
+
+	_percentage: function() {
+		return 100 * this._value() / this.options.max;
+	},
+
+	_refreshValue: function() {
+		var value = this.value(),
+			percentage = this._percentage();
+
+		if ( this.oldValue !== value ) {
+			this.oldValue = value;
+			//this._trigger( "change" );
+		}
+
+		this.valueDiv
+			.toggle( value > this.min )
+			.toggleClass( "ui-corner-right", value === this.options.max )
+			.width( percentage.toFixed(0) + "%" );
+		this.element.attr( "aria-valuenow", value );
+		
+		//$(this.element).find(".ui-progressbar-label").html(value + "%");
+	},
+	
+	set: function(key, value){
+		this._setOption(key, value);
+	}
+};
+
+})( jQuery );

+ 23 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/jstools.js

@@ -0,0 +1,23 @@
+if (typeof(console) == "undefined") {
+  var console = {
+    info: function(){},
+    warn: function(){},
+    error: function(){},
+    log: function(){},
+    time: function(){},
+    timeEnd: function(){}
+  };
+}
+
+if(!Array.isArray) {
+  Array.isArray = function (vArg) {
+    return Object.prototype.toString.call(vArg) === "[object Array]";
+  };
+}
+
+if (!Object.isSVGElement) {
+  Object.isSVGElement = function(vArg) {
+  var str = Object.prototype.toString.call(vArg);
+  return (str.indexOf("[object SVG") == 0);
+  };
+}

Datei-Diff unterdrückt, da er zu groß ist
+ 10 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/raphael.2.1.1.js


Datei-Diff unterdrückt, da er zu groß ist
+ 10 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/raphael.js


+ 441 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/js/textlayout.js

@@ -0,0 +1,441 @@
+	window.onload = function () {
+			var paper = Raphael("holder");
+
+			//var curve = paper.ellipse(100, 100, 1, 1).attr({"stroke-width": 0, fill: Color.red});
+			
+			var text = "Betty Botter bought some butter but, she said, the butter's bitter. If I put it in my batter, it will make my batter bitter. But a bit of better butter will make my batter better. So, she bought a bit of butter, better than her bitter butter, and she put it in her batter, and the batter was not bitter. It was better Betty Botter bought a bit better butter.";
+			var font = {font: "11px Arial", "font-style":"italic", opacity: 1, "fill": LABEL_COLOR, stroke: LABEL_COLOR, "stroke-width":.3};
+			var font = {font: "11px Arial", opacity: 1, "fill": LABEL_COLOR};
+			var boxWidth = 100
+			
+			var AttributedStringIterator = function(text){
+				//this.text = this.rtrim(this.ltrim(text));
+				text = text.replace(/(\s)+/, " ");
+				this.text = this.rtrim(text);
+				/*
+				if (beginIndex < 0 || beginIndex > endIndex || endIndex > length()) {
+					throw new IllegalArgumentException("Invalid substring range");
+				}
+				*/
+				this.beginIndex = 0;
+				this.endIndex = this.text.length;
+				this.currentIndex = this.beginIndex;
+				
+				//console.group("[AttributedStringIterator]");
+				var i = 0;
+				var string = this.text;
+				var fullPos = 0;
+				
+				//console.log("string: \"" + string + "\", length: " + string.length);
+				this.startWordOffsets = [];
+				this.startWordOffsets.push(fullPos);
+				
+				// TODO: remove i 1000
+				while (i<1000) {
+					var pos = string.search(/[ \t\n\f-\.\,]/);
+					if (pos == -1)
+						break;
+					
+					// whitespace start
+					fullPos += pos;
+					string = string.substr(pos);
+					////console.log("fullPos: " + fullPos + ", pos: " + pos +  ", string: ", string);
+					
+					// remove whitespaces
+					var pos = string.search(/[^ \t\n\f-\.\,]/);
+					if (pos == -1)
+						break;
+						
+					// whitespace end
+					fullPos += pos;
+					string = string.substr(pos);
+					
+					////console.log("fullPos: " + fullPos);
+					this.startWordOffsets.push(fullPos);
+					
+					i++;
+				}
+				//console.log("startWordOffsets: ", this.startWordOffsets);
+				//console.groupEnd();
+			};
+			AttributedStringIterator.prototype = {
+				getEndIndex: function(pos){
+					if (typeof(pos) == "undefined")
+						return this.endIndex;
+						
+					var string = this.text.substr(pos, this.endIndex - pos);
+					
+					var posEndOfLine = string.search(/[\n]/);
+					if (posEndOfLine == -1)
+						return this.endIndex;
+					else
+						return pos + posEndOfLine;
+				},
+				getBeginIndex: function(){
+					return this.beginIndex;
+				},
+				isWhitespace: function(pos){
+					var str = this.text[pos];
+					var whitespaceChars = " \t\n\f";
+					
+					return (whitespaceChars.indexOf(str) != -1);
+				},
+				isNewLine: function(pos){
+					var str = this.text[pos];
+					var whitespaceChars = "\n";
+					
+					return (whitespaceChars.indexOf(str) != -1);
+				},
+				preceding: function(pos){
+					//console.group("[AttributedStringIterator.preceding]");
+					for(var i in this.startWordOffsets) {
+						var startWordOffset = this.startWordOffsets[i];
+						if (pos < startWordOffset && i>0) {
+							//console.log("startWordOffset: " + this.startWordOffsets[i-1]);
+							//console.groupEnd();
+							return this.startWordOffsets[i-1];
+						}
+					}
+					//console.log("pos: " + pos);
+					//console.groupEnd();
+					return this.startWordOffsets[i];
+				},
+				following: function(pos){
+					//console.group("[AttributedStringIterator.following]");
+					for(var i in this.startWordOffsets) {
+						var startWordOffset = this.startWordOffsets[i];
+						if (pos < startWordOffset && i>0) {
+							//console.log("startWordOffset: " + this.startWordOffsets[i]);
+							//console.groupEnd();
+							return this.startWordOffsets[i];
+						}
+					}
+					//console.log("pos: " + pos);
+					//console.groupEnd();
+					return this.startWordOffsets[i];
+				},
+				ltrim: function(str){
+					var patt2=/^\s+/g;
+					return str.replace(patt2, "");
+				}, 
+				rtrim: function(str){
+					var patt2=/\s+$/g;
+					return str.replace(patt2, "");
+				},
+				getLayout: function(start, limit){
+					return this.text.substr(start, limit - start);
+				},
+				getCharAtPos: function(pos) {
+					return this.text[pos];
+				}
+			};
+			
+			/*
+			var TextMeasurer = function(paper, text, fontAttrs){
+				this.text = text;
+				this.paper = paper;
+				this.fontAttrs = fontAttrs;
+				
+				this.fStart = this.text.getBeginIndex();
+
+			};
+			TextMeasurer.prototype = {
+				getLineBreakIndex: function(start, maxAdvance){
+					var localStart = start - this.fStart;
+				},
+				getLayout: function(){
+				}
+			}
+			*/
+			
+			
+			var LineBreakMeasurer = function(paper, text, fontAttrs){
+				this.paper = paper;
+				this.text = new AttributedStringIterator(text);
+				this.fontAttrs = fontAttrs;
+				
+				if (this.text.getEndIndex() - this.text.getBeginIndex() < 1) {
+					throw {message: "Text must contain at least one character.", code: "IllegalArgumentException"};
+				}
+				
+				//this.measurer = new TextMeasurer(paper, this.text, this.fontAttrs);
+				this.limit = this.text.getEndIndex();
+				this.pos = this.start = this.text.getBeginIndex();
+				
+				this.rafaelTextObject = this.paper.text(100, 100, this.text.text).attr(fontAttrs).attr("text-anchor", "start");
+				this.svgTextObject = this.rafaelTextObject[0];
+			};
+			LineBreakMeasurer.prototype = {
+				nextOffset: function(wrappingWidth, offsetLimit, requireNextWord) {
+					//console.group("[nextOffset]");
+					var nextOffset = this.pos;
+					if (this.pos < this.limit) {
+						if (offsetLimit <= this.pos) {
+							throw {message: "offsetLimit must be after current position", code: "IllegalArgumentException"};
+						}
+						
+						var charAtMaxAdvance = this.getLineBreakIndex(this.pos, wrappingWidth);
+						//charAtMaxAdvance --;
+						//console.log("charAtMaxAdvance:", charAtMaxAdvance, ", [" + this.text.getCharAtPos(charAtMaxAdvance) + "]");
+						
+						if (charAtMaxAdvance == this.limit) {
+							nextOffset = this.limit;
+							//console.log("charAtMaxAdvance == this.limit");
+						} else if (this.text.isNewLine(charAtMaxAdvance)) {
+							console.log("isNewLine");
+							nextOffset = charAtMaxAdvance+1;
+						} else if (this.text.isWhitespace(charAtMaxAdvance)) {
+							// TODO: find next noSpaceChar
+							//return nextOffset;
+							nextOffset = this.text.following(charAtMaxAdvance);
+						} else {
+							// Break is in a word;  back up to previous break.
+							/*
+							var testPos = charAtMaxAdvance + 1;
+							if (testPos == this.limit) {
+								console.error("hbz...");
+							} else {
+								nextOffset = this.text.preceding(charAtMaxAdvance);
+							}
+							*/
+							nextOffset = this.text.preceding(charAtMaxAdvance);
+							
+							if (nextOffset <= this.pos) {
+								nextOffset = Math.max(this.pos+1, charAtMaxAdvance);
+							}
+						}
+					}
+					if (nextOffset > offsetLimit) {
+						nextOffset = offsetLimit;
+					}
+					//console.log("nextOffset: " + nextOffset);
+					//console.groupEnd();
+					return nextOffset;
+				},
+				nextLayout: function(wrappingWidth) {
+					//console.groupCollapsed("[nextLayout]");
+					if (this.pos < this.limit) {
+						var requireNextWord = false;
+						var layoutLimit = this.nextOffset(wrappingWidth, this.limit, requireNextWord);
+						//console.log("layoutLimit:", layoutLimit);
+						if (layoutLimit == this.pos) {
+							//console.groupEnd();
+							return null;
+						}
+						var result = this.text.getLayout(this.pos, layoutLimit);
+						//console.log("layout: \"" + result + "\"");
+						
+						// remove end of line
+						
+						//var posEndOfLine = this.text.getEndIndex(this.pos);
+						//if (posEndOfLine < result.length)
+						//	result = result.substr(0, posEndOfLine);
+						
+						this.pos = layoutLimit;
+						
+						//console.groupEnd();
+						return result;
+					} else {
+						//console.groupEnd();
+						return null;
+					}
+				},
+				getLineBreakIndex: function(pos, wrappingWidth) {
+					//console.group("[getLineBreakIndex]");
+					//console.log("pos:"+pos + ", text: \""+ this.text.text.replace(/\n/g, "_").substr(pos, 1) + "\"");
+					
+					var bb = this.rafaelTextObject.getBBox();
+					
+					var charNum = -1;
+					try {
+						var svgPoint = this.svgTextObject.getStartPositionOfChar(pos);
+						//var dot = this.paper.ellipse(svgPoint.x, svgPoint.y, 1, 1).attr({"stroke-width": 0, fill: Color.blue});
+						svgPoint.x = svgPoint.x + wrappingWidth;
+						//svgPoint.y = bb.y;
+						//console.log("svgPoint:", svgPoint);
+					
+						//var dot = this.paper.ellipse(svgPoint.x, svgPoint.y, 1, 1).attr({"stroke-width": 0, fill: Color.red});
+					
+						charNum = this.svgTextObject.getCharNumAtPosition(svgPoint);
+					} catch (e){
+						console.warn("getStartPositionOfChar error, pos:" + pos);
+						/*
+						var testPos = pos + 1;
+						if (testPos < this.limit) {
+							return testPos
+						}
+						*/
+					}
+					//console.log("charNum:", charNum);
+					if (charNum == -1) {
+						//console.groupEnd();
+						return this.text.getEndIndex(pos);
+					} else {
+						// When case there is new line between pos and charnum then use this new line
+						var newLineIndex = this.text.getEndIndex(pos);
+						if (newLineIndex < charNum ) {
+							console.log("newLineIndex <= charNum, newLineIndex:"+newLineIndex+", charNum:"+charNum, "\"" + this.text.text.substr(newLineIndex+1).replace(/\n/g, "↵") + "\"");
+							//console.groupEnd();
+							
+							return newLineIndex;
+						}
+							
+						//var charAtMaxAdvance  = this.text.text.substring(charNum, charNum + 1);
+						var charAtMaxAdvance  = this.text.getCharAtPos(charNum);
+						//console.log("!!charAtMaxAdvance: " + charAtMaxAdvance);
+						//console.groupEnd();
+						return charNum;
+					}
+				}, 
+				getPosition: function() {
+					return this.pos;
+				}
+			};
+			
+			
+			
+			// ******
+			function drawMultilineText(text, x, y, boxWidth, boxHeight, options) {
+				var TEXT_PADDING = 3;
+				var width = boxWidth - (2 * TEXT_PADDING);
+				if (boxHeight)
+					var height = boxHeight - (2 * TEXT_PADDING);
+			
+				var layouts = [];
+				
+				var measurer = new LineBreakMeasurer(paper, text, font);
+				var lineHeight = measurer.rafaelTextObject.getBBox().height;
+				console.log("text: ", text.replace(/\n/g, "↵"));
+				
+				if (height) {
+					var availableLinesCount = parseInt(height/lineHeight);
+					console.log("availableLinesCount: " + availableLinesCount);
+				}
+				
+				var i = 1;
+				while (measurer.getPosition() < measurer.text.getEndIndex()) {
+					var layout = measurer.nextLayout(width);
+					//console.log("LAYOUT: " + layout + ", getPosition: " + measurer.getPosition());
+					
+					if (layout != null) {
+						if (!availableLinesCount || i < availableLinesCount) {
+							layouts.push(layout);
+						} else {
+							layouts.push(fitTextToWidth(layout + "...", boxWidth));
+							break;
+						}
+					}
+					i++;
+				};
+				console.log(layouts);
+				
+				measurer.rafaelTextObject.attr({"text": layouts.join("\n")});
+				//measurer.rafaelTextObject.attr({"text-anchor": "end"});
+				//measurer.rafaelTextObject.attr({"text-anchor": "middle"});
+				if (options)
+					measurer.rafaelTextObject.attr({"text-anchor": options["text-anchor"]});
+					
+				var bb = measurer.rafaelTextObject.getBBox();
+				//measurer.rafaelTextObject.attr({"x": x + boxWidth/2});
+				if (options["vertical-align"] == "top")
+					measurer.rafaelTextObject.attr({"y": y + bb.height/2 + TEXT_PADDING});
+				else
+					measurer.rafaelTextObject.attr({"y": y + height/2});
+				//var bb = measurer.rafaelTextObject.getBBox();
+				
+				if (measurer.rafaelTextObject.attr("text-anchor") == "middle" )
+					measurer.rafaelTextObject.attr("x",  x + boxWidth/2 + TEXT_PADDING/2);
+				else if (measurer.rafaelTextObject.attr("text-anchor") == "end" )
+					measurer.rafaelTextObject.attr("x",  x + boxWidth + TEXT_PADDING/2);
+				else 
+					measurer.rafaelTextObject.attr("x", x + boxWidth/2 - bb.width/2 + TEXT_PADDING/2);
+				
+				var boxStyle = {stroke: Color.LightSteelBlue2, "stroke-width": 1.0, "stroke-dasharray": "- "};
+				/*
+				var box = paper.rect(x+.0 + boxWidth/2 - bb.width/2+ TEXT_PADDING/2, y + .5 + boxHeight/2 - bb.height/2, width, height).attr(boxStyle);
+				box.attr("height", bb.height);
+				*/
+				//var box = paper.rect(bb.x - .5 + bb.width/2 + TEXT_PADDING, bb.y + bb.height/2, bb.width, bb.height).attr(boxStyle);
+				
+				var textAreaCX = x + boxWidth/2;
+				var textAreaCY = y + height/2;
+				var dotLeftTop = paper.ellipse(x, y, 3, 3).attr({"stroke-width": 0, fill: Color.LightSteelBlue, stroke: "none"});
+				var dotCenter = paper.ellipse(textAreaCX, textAreaCY, 3, 3).attr({fill: Color.LightSteelBlue2, stroke: "none"});
+
+				/*
+				// real bbox
+				var bb = measurer.rafaelTextObject.getBBox();
+				var rect = paper.rect(bb.x+.5, bb.y + .5, bb.width, bb.height).attr({"stroke-width": 1});
+				*/
+				var boxStyle = {stroke: Color.LightSteelBlue2, "stroke-width": 1.0, "stroke-dasharray": "- "};
+				var rect = paper.rect(x+.5, y + .5, boxWidth, boxHeight).attr(boxStyle);
+			}
+			
+			
+			
+			
+			/*
+			for (var i=0; i<1; i++) {
+				var t = text;
+				//var t = "Высококвалифицирова";
+				
+				var text = paper.text(300, 100, t).attr(font).attr("text-anchor", "start");
+				var bbText = text.getBBox();
+				paper.rect(300+.5, 100 + .5, bbText.width, bbText.height).attr({"stroke-width": 1});
+				console.log("t: ", t.replace(/\n/g, "↵"));
+				
+				while (measurer.getPosition() < measurer.text.getEndIndex()) {
+					var layout = measurer.nextLayout(width);
+					//console.log("LAYOUT: " + layout + ", getPosition: " + measurer.getPosition());
+					if (layout != null)
+						layouts.push(layout);
+				};
+				
+				measurer.rafaelTextObject.attr("text", layouts.join("\n"));
+				var bb = measurer.rafaelTextObject.getBBox();
+				var rect = paper.rect(bb.x+.5, bb.y + .5, bb.width, bb.height).attr({"stroke-width": 1});
+				
+				lay.push(layouts);
+				console.log(layouts);
+			}
+			*/
+			
+			
+			var fitTextToWidth = function(original, width) {
+				var text = original;
+
+				// TODO: move attr on parameters
+				var attr = {font: "11px Arial", opacity: 0};
+				
+				// remove length for "..."
+				var dots = paper.text(0, 0, "...").attr(attr).hide();
+				var dotsBB = dots.getBBox();
+				
+				var maxWidth = width - dotsBB.width;
+				
+				var textElement = paper.text(0, 0, text).attr(attr).hide();
+				var bb = textElement.getBBox();
+				
+				// it's a little bit incorrect with "..."
+				while (bb.width > maxWidth && text.length > 0) {
+					text = text.substring(0, text.length - 1);
+					textElement.attr({"text": text});
+					bb = textElement.getBBox();
+				}
+
+				// remove element from paper
+				textElement.remove();
+				
+				if (text != original) {
+					text = text + "...";
+				}
+
+				return text;
+			}
+			
+			
+			var x=100, y=90, height=20;
+			var options = {"text-anchor": "middle", "boxHeight": 150, "vertical-align": "top"};
+			var options = {"boxHeight": 150, "vertical-align": "top"};
+			drawMultilineText(text, x, y, 150, 100, options);
+	};

Datei-Diff unterdrückt, da er zu groß ist
+ 1 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/diagram-viewer/style.css


+ 25 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/app-cfg.js

@@ -0,0 +1,25 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+'use strict';
+
+var ACTIVITI = ACTIVITI || {};
+
+ACTIVITI.CONFIG = {
+	'contextRoot' : '/workflow',
+};

+ 435 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/app.js

@@ -0,0 +1,435 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+'use strict';
+
+var activitiModeler = angular.module('activitiModeler', [
+  'ngCookies',
+  'ngResource',
+  'ngSanitize',
+  'ngRoute',
+  'ngDragDrop',
+  'mgcrea.ngStrap', 
+  'ngGrid',
+  'ngAnimate',
+  'pascalprecht.translate',
+  'duScroll'
+]);
+
+var activitiModule = activitiModeler;
+
+activitiModeler
+  // Initialize routes
+  .config(['$selectProvider', '$translateProvider', function ($selectProvider, $translateProvider) {
+
+      // Override caret for bs-select directive
+      angular.extend($selectProvider.defaults, {
+          caretHtml: '&nbsp;<i class="icon icon-caret-down"></i>'
+      });
+        
+        // Initialize angular-translate
+        $translateProvider.useStaticFilesLoader({
+            prefix: './editor-app/i18n/',
+            suffix: '.json'
+        });
+        var language = navigator.language;
+        if("zh-CN" == language){
+            $translateProvider.preferredLanguage('zh-CN');
+        }else{
+            $translateProvider.preferredLanguage('en');
+        }
+        // remember language
+        $translateProvider.useCookieStorage();
+        
+  }])
+  .run(['$rootScope', '$timeout', '$modal', '$translate', '$location', '$window', '$http', '$q',
+        function($rootScope, $timeout, $modal, $translate, $location, $window, $http, $q) {
+	  
+			  $rootScope.config = ACTIVITI.CONFIG;
+			  
+			  $rootScope.editorInitialized = false;
+		      
+		      $rootScope.editorFactory = $q.defer();
+		
+		      $rootScope.forceSelectionRefresh = false;
+		
+		      $rootScope.ignoreChanges = false; // by default never ignore changes
+		      
+		      $rootScope.validationErrors = [];
+		      
+		      $rootScope.staticIncludeVersion = Date.now();
+
+			  /**
+		       * A 'safer' apply that avoids concurrent updates (which $apply allows).
+		       */
+		      $rootScope.safeApply = function(fn) {
+		          var phase = this.$root.$$phase;
+		          if(phase == '$apply' || phase == '$digest') {
+		              if(fn && (typeof(fn) === 'function')) {
+		                  fn();
+		              }
+		          } else {
+		              this.$apply(fn);
+		          }
+		      };
+	  
+	  
+            /**
+             * Initialize the event bus: couple all Oryx events with a dispatch of the
+             * event of the event bus. This way, it gets much easier to attach custom logic
+             * to any event.
+             */
+
+            /* Helper method to fetch model from server (always needed) */
+            function fetchModel(modelId) {
+
+                var modelUrl = KISBPM.URL.getModel(modelId);
+
+                $http({method: 'GET', url: modelUrl}).
+                    success(function (data, status, headers, config) {
+                        $rootScope.editor = new ORYX.Editor(data);
+                        $rootScope.modelData = angular.fromJson(data);
+                        $rootScope.editorFactory.resolve();
+                    }).
+                    error(function (data, status, headers, config) {
+                      console.log('Error loading model with id ' + modelId + ' ' + data);
+                    });
+            }
+
+
+            function initScrollHandling() {
+                var canvasSection = jQuery('#canvasSection');
+                canvasSection.scroll(function() {
+
+                    // Hides the resizer and quick menu items during scrolling
+
+                    var selectedElements = $rootScope.editor.selection;
+                    var subSelectionElements = $rootScope.editor._subSelection;
+
+                    $rootScope.selectedElements = selectedElements;
+                    $rootScope.subSelectionElements = subSelectionElements;
+                    if (selectedElements && selectedElements.length > 0) {
+                    	$rootScope.selectedElementBeforeScrolling = selectedElements[0];
+                    }
+
+                    jQuery('.Oryx_button').each(function(i, obj) {
+                    	$rootScope.orginalOryxButtonStyle = obj.style.display;
+                    	obj.style.display = 'none';
+                    });
+                    
+                    jQuery('.resizer_southeast').each(function(i, obj) {
+                    	$rootScope.orginalResizerSEStyle = obj.style.display;
+                        obj.style.display = 'none';
+                    });
+                    jQuery('.resizer_northwest').each(function(i, obj) {
+                    	$rootScope.orginalResizerNWStyle = obj.style.display;
+                        obj.style.display = 'none';
+                    });
+                    $rootScope.editor.handleEvents({type:ORYX.CONFIG.EVENT_CANVAS_SCROLL});
+                });
+
+                canvasSection.scrollStopped(function(){
+
+                    // Puts the quick menu items and resizer back when scroll is stopped.
+
+                    $rootScope.editor.setSelection([]); // needed cause it checks for element changes and does nothing if the elements are the same
+                    $rootScope.editor.setSelection($rootScope.selectedElements, $rootScope.subSelectionElements);
+                    $rootScope.selectedElements = undefined;
+                    $rootScope.subSelectionElements = undefined;
+
+                    function handleDisplayProperty(obj) {
+                        if (jQuery(obj).position().top > 0) {
+                            obj.style.display = 'block';
+                        } else {
+                            obj.style.display = 'none';
+                        }
+                    }
+
+                    jQuery('.Oryx_button').each(function(i, obj) {
+                        handleDisplayProperty(obj);
+                    });
+                    
+                    jQuery('.resizer_southeast').each(function(i, obj) {
+                        handleDisplayProperty(obj);
+                    });
+                    jQuery('.resizer_northwest').each(function(i, obj) {
+                        handleDisplayProperty(obj);
+                    });
+
+                });
+            }
+
+            /**
+             * Initialize the Oryx Editor when the content has been loaded
+             */
+            $rootScope.$on('$includeContentLoaded', function (event) {
+	            if (!$rootScope.editorInitialized) {
+
+	            	ORYX._loadPlugins();
+	
+	                var modelId = EDITOR.UTIL.getParameterByName('modelId');
+	                fetchModel(modelId);
+	
+	                $rootScope.window = {};
+	                var updateWindowSize = function() {
+	                    $rootScope.window.width = $window.innerWidth;
+	                    $rootScope.window.height  = $window.innerHeight;
+	                };
+	
+	                // Window resize hook
+	                angular.element($window).bind('resize', function() {
+	                    $rootScope.safeApply(updateWindowSize());
+	                });
+	
+	                $rootScope.$watch('window.forceRefresh', function(newValue) {
+	                    if(newValue) {
+	                        $timeout(function() {
+	                            updateWindowSize();
+	                            $rootScope.window.forceRefresh = false;
+	                        });
+	                    }
+	                });
+	
+	                updateWindowSize();
+
+	                // Hook in resizing of main panels when window resizes
+	                // TODO: perhaps move to a separate JS-file?
+	                jQuery(window).resize(function () {
+
+	                    // Calculate the offset based on the bottom of the module header
+	                    var offset = jQuery("#editor-header").offset();
+	                    var propSectionHeight = jQuery('#propertySection').height();
+	                    var canvas = jQuery('#canvasSection');
+	                    var mainHeader = jQuery('#main-header');
+
+	                    if (offset == undefined || offset === null
+	                        || propSectionHeight === undefined || propSectionHeight === null
+	                        || canvas === undefined || canvas === null || mainHeader === null) {
+	                        return;
+	                    }
+	                    
+	                    if ($rootScope.editor)
+	                	{
+	        	        	var selectedElements = $rootScope.editor.selection;
+	        	            var subSelectionElements = $rootScope.editor._subSelection;
+	        	
+	        	            $rootScope.selectedElements = selectedElements;
+	        	            $rootScope.subSelectionElements = subSelectionElements;
+	        	            if (selectedElements && selectedElements.length > 0)
+	        	            {
+	        	            	$rootScope.selectedElementBeforeScrolling = selectedElements[0];
+	        	            	
+	        	            	$rootScope.editor.setSelection([]); // needed cause it checks for element changes and does nothing if the elements are the same
+	        	                $rootScope.editor.setSelection($rootScope.selectedElements, $rootScope.subSelectionElements);
+	        	                $rootScope.selectedElements = undefined;
+	        	                $rootScope.subSelectionElements = undefined;
+	        	            }
+	                	}
+
+	                    var totalAvailable = jQuery(window).height() - offset.top - mainHeader.height() - 21;
+	                    canvas.height(totalAvailable - propSectionHeight);
+	                    jQuery('#paletteSection').height(totalAvailable);
+
+	                    // Update positions of the resize-markers, according to the canvas
+
+	                    var actualCanvas = null;
+	                    if (canvas && canvas[0].children[1]) {
+	                        actualCanvas = canvas[0].children[1];
+	                    }
+
+	                    var canvasTop = canvas.position().top;
+	                    var canvasLeft = canvas.position().left;
+	                    var canvasHeight = canvas[0].clientHeight;
+	                    var canvasWidth = canvas[0].clientWidth;
+	                    var iconCenterOffset = 8;
+	                    var widthDiff = 0;
+
+	                    var actualWidth = 0;
+	                    if(actualCanvas) {
+	                        // In some browsers, the SVG-element clientwidth isn't available, so we revert to the parent
+	                        actualWidth = actualCanvas.clientWidth || actualCanvas.parentNode.clientWidth;
+	                    }
+
+
+	                    if(actualWidth < canvas[0].clientWidth) {
+	                        widthDiff = actualWidth - canvas[0].clientWidth;
+	                        // In case the canvas is smaller than the actual viewport, the resizers should be moved
+	                        canvasLeft -= widthDiff / 2;
+	                        canvasWidth += widthDiff;
+	                    }
+
+	                    var iconWidth = 17;
+	                    var iconOffset = 20;
+
+	                    var north = jQuery('#canvas-grow-N');
+	                    north.css('top', canvasTop + iconOffset + 'px');
+	                    north.css('left', canvasLeft - 10 + (canvasWidth - iconWidth) / 2 + 'px');
+
+	                    var south = jQuery('#canvas-grow-S');
+	                    south.css('top', (canvasTop + canvasHeight - iconOffset - iconCenterOffset) +  'px');
+	                    south.css('left', canvasLeft - 10 + (canvasWidth - iconWidth) / 2 + 'px');
+
+	                    var east = jQuery('#canvas-grow-E');
+	                    east.css('top', canvasTop - 10 + (canvasHeight - iconWidth) / 2 + 'px');
+	                    east.css('left', (canvasLeft + canvasWidth - iconOffset - iconCenterOffset) + 'px');
+
+	                    var west = jQuery('#canvas-grow-W');
+	                    west.css('top', canvasTop -10 + (canvasHeight - iconWidth) / 2 + 'px');
+	                    west.css('left', canvasLeft + iconOffset + 'px');
+
+	                    north = jQuery('#canvas-shrink-N');
+	                    north.css('top', canvasTop + iconOffset + 'px');
+	                    north.css('left', canvasLeft + 10 + (canvasWidth - iconWidth) / 2 + 'px');
+
+	                    south = jQuery('#canvas-shrink-S');
+	                    south.css('top', (canvasTop + canvasHeight - iconOffset - iconCenterOffset) +  'px');
+	                    south.css('left', canvasLeft +10 + (canvasWidth - iconWidth) / 2 + 'px');
+
+	                    east = jQuery('#canvas-shrink-E');
+	                    east.css('top', canvasTop + 10 + (canvasHeight - iconWidth) / 2 +  'px');
+	                    east.css('left', (canvasLeft + canvasWidth - iconOffset - iconCenterOffset) + 'px');
+
+	                    west = jQuery('#canvas-shrink-W');
+	                    west.css('top', canvasTop + 10 + (canvasHeight - iconWidth) / 2 + 'px');
+	                    west.css('left', canvasLeft + iconOffset + 'px');
+	                });
+
+	                jQuery(window).trigger('resize');
+
+	                jQuery.fn.scrollStopped = function(callback) {
+	                    jQuery(this).scroll(function(){
+	                        var self = this, $this = jQuery(self);
+	                        if ($this.data('scrollTimeout')) {
+	                            clearTimeout($this.data('scrollTimeout'));
+	                        }
+	                        $this.data('scrollTimeout', setTimeout(callback,50,self));
+	                    });
+	                };
+	                
+	                // Always needed, cause the DOM element on which the scroll event listeners are attached are changed for every new model
+	                initScrollHandling();
+	                
+	                $rootScope.editorInitialized = true;
+	            }
+            });
+
+            /**
+             * Initialize the event bus: couple all Oryx events with a dispatch of the
+             * event of the event bus. This way, it gets much easier to attach custom logic
+             * to any event.
+             */
+
+            $rootScope.editorFactory.promise.then(function() {
+
+                KISBPM.eventBus.editor = $rootScope.editor;
+
+                var eventMappings = [
+                    { oryxType : ORYX.CONFIG.EVENT_SELECTION_CHANGED, kisBpmType : KISBPM.eventBus.EVENT_TYPE_SELECTION_CHANGE },
+                    { oryxType : ORYX.CONFIG.EVENT_DBLCLICK, kisBpmType : KISBPM.eventBus.EVENT_TYPE_DOUBLE_CLICK },
+                    { oryxType : ORYX.CONFIG.EVENT_MOUSEOUT, kisBpmType : KISBPM.eventBus.EVENT_TYPE_MOUSE_OUT },
+                    { oryxType : ORYX.CONFIG.EVENT_MOUSEOVER, kisBpmType : KISBPM.eventBus.EVENT_TYPE_MOUSE_OVER }
+
+                ];
+
+                eventMappings.forEach(function(eventMapping) {
+                    $rootScope.editor.registerOnEvent(eventMapping.oryxType, function(event) {
+                        KISBPM.eventBus.dispatch(eventMapping.kisBpmType, event);
+                    });
+                });
+                
+                $rootScope.editor.registerOnEvent(ORYX.CONFIG.EVENT_SHAPEREMOVED, function (event) {
+    	    		var validateButton = document.getElementById(event.shape.resourceId + "-validate-button");
+    	    		if (validateButton)
+    	    		{
+    	    			validateButton.style.display = 'none';
+    	    		}
+                });
+
+                // The Oryx canvas is ready (we know since we're in this promise callback) and the
+                // event bus is ready. The editor is now ready for use
+                KISBPM.eventBus.dispatch(KISBPM.eventBus.EVENT_TYPE_EDITOR_READY, {type : KISBPM.eventBus.EVENT_TYPE_EDITOR_READY});
+
+            });
+            
+            // Alerts
+            $rootScope.alerts = {
+                queue: []
+            };
+          
+            $rootScope.showAlert = function(alert) {
+                if(alert.queue.length > 0) {
+                    alert.current = alert.queue.shift();
+                    // Start timout for message-pruning
+                    alert.timeout = $timeout(function() {
+                        if (alert.queue.length == 0) {
+                            alert.current = undefined;
+                            alert.timeout = undefined;
+                        } else {
+                            $rootScope.showAlert(alert);
+                        }
+                    }, (alert.current.type == 'error' ? 5000 : 1000));
+                } else {
+                    $rootScope.alerts.current = undefined;
+                }
+            };
+          
+            $rootScope.addAlert = function(message, type) {
+                var newAlert = {message: message, type: type};
+                if (!$rootScope.alerts.timeout) {
+                    // Timeout for message queue is not running, start one
+                    $rootScope.alerts.queue.push(newAlert);
+                    $rootScope.showAlert($rootScope.alerts);
+                } else {
+                    $rootScope.alerts.queue.push(newAlert);
+                }
+            };
+          
+            $rootScope.dismissAlert = function() {
+                if (!$rootScope.alerts.timeout) {
+                    $rootScope.alerts.current = undefined;
+                } else {
+                    $timeout.cancel($rootScope.alerts.timeout);
+                    $rootScope.alerts.timeout = undefined;
+                    $rootScope.showAlert($rootScope.alerts);
+                }
+            };
+          
+            $rootScope.addAlertPromise = function(promise, type) {
+                if (promise) {
+                    promise.then(function(data) {
+                        $rootScope.addAlert(data, type);
+                    });
+                }
+            };
+          
+        }
+  ])
+
+    // Moment-JS date-formatting filter
+    .filter('dateformat', function() {
+        return function(date, format) {
+            if (date) {
+                if (format) {
+                    return moment(date).format(format);
+                } else {
+                    return moment(date).calendar();
+                }
+            }
+            return '';
+        };
+    });

+ 150 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-assignment-controller.js

@@ -0,0 +1,150 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/*
+ * Assignment
+ */
+var KisBpmAssignmentCtrl = [ '$scope', '$modal', function($scope, $modal) {
+
+    // Config for the modal window
+    var opts = {
+        template:  'editor-app/configuration/properties/assignment-popup.html?version=' + Date.now(),
+        scope: $scope
+    };
+
+    // Open the dialog
+    $modal(opts);
+}];
+
+var KisBpmAssignmentPopupCtrl = [ '$scope', function($scope) {
+    	
+    // Put json representing assignment on scope
+    if ($scope.property.value !== undefined && $scope.property.value !== null
+        && $scope.property.value.assignment !== undefined
+        && $scope.property.value.assignment !== null) 
+    {
+        $scope.assignment = $scope.property.value.assignment;
+    } else {
+        $scope.assignment = {};
+    }
+
+    if ($scope.assignment.candidateUsers == undefined || $scope.assignment.candidateUsers.length == 0)
+    {
+    	$scope.assignment.candidateUsers = [{value: ''}];
+    }
+    
+    // Click handler for + button after enum value
+    var userValueIndex = 1;
+    $scope.addCandidateUserValue = function(index) {
+        $scope.assignment.candidateUsers.splice(index + 1, 0, {value: 'value ' + userValueIndex++});
+    };
+
+    // Click handler for - button after enum value
+    $scope.removeCandidateUserValue = function(index) {
+        $scope.assignment.candidateUsers.splice(index, 1);
+    };
+    
+    if ($scope.assignment.candidateGroups == undefined || $scope.assignment.candidateGroups.length == 0)
+    {
+    	$scope.assignment.candidateGroups = [{value: ''}];
+    }
+    
+    var groupValueIndex = 1;
+    $scope.addCandidateGroupValue = function(index) {
+        $scope.assignment.candidateGroups.splice(index + 1, 0, {value: 'value ' + groupValueIndex++});
+    };
+
+    // Click handler for - button after enum value
+    $scope.removeCandidateGroupValue = function(index) {
+        $scope.assignment.candidateGroups.splice(index, 1);
+    };
+
+    $scope.save = function() {
+
+        $scope.property.value = {};
+        handleAssignmentInput($scope);
+        $scope.property.value.assignment = $scope.assignment;
+        
+        $scope.updatePropertyInModel($scope.property);
+        $scope.close();
+    };
+
+    // Close button handler
+    $scope.close = function() {
+    	handleAssignmentInput($scope);
+    	$scope.property.mode = 'read';
+    	$scope.$hide();
+    };
+    
+    var handleAssignmentInput = function($scope) {
+    	if ($scope.assignment.candidateUsers)
+    	{
+	    	var emptyUsers = true;
+	    	var toRemoveIndexes = [];
+	        for (var i = 0; i < $scope.assignment.candidateUsers.length; i++)
+	        {
+	        	if ($scope.assignment.candidateUsers[i].value != '')
+	        	{
+	        		emptyUsers = false;
+	        	}
+	        	else
+	        	{
+	        		toRemoveIndexes[toRemoveIndexes.length] = i;
+	        	}
+	        }
+	        
+	        for (var i = 0; i < toRemoveIndexes.length; i++)
+	        {
+	        	$scope.assignment.candidateUsers.splice(toRemoveIndexes[i], 1);
+	        }
+	        
+	        if (emptyUsers)
+	        {
+	        	$scope.assignment.candidateUsers = undefined;
+	        }
+    	}
+        
+    	if ($scope.assignment.candidateGroups)
+    	{
+	        var emptyGroups = true;
+	        var toRemoveIndexes = [];
+	        for (var i = 0; i < $scope.assignment.candidateGroups.length; i++)
+	        {
+	        	if ($scope.assignment.candidateGroups[i].value != '')
+	        	{
+	        		emptyGroups = false;
+	        	}
+	        	else
+	        	{
+	        		toRemoveIndexes[toRemoveIndexes.length] = i;
+	        	}
+	        }
+	        
+	        for (var i = 0; i < toRemoveIndexes.length; i++)
+	        {
+	        	$scope.assignment.candidateGroups.splice(toRemoveIndexes[i], 1);
+	        }
+	        
+	        if (emptyGroups)
+	        {
+	        	$scope.assignment.candidateGroups = undefined;
+	        }
+    	}
+    };
+}];

+ 58 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-condition-expression-controller.js

@@ -0,0 +1,58 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/*
+ * Condition expression
+ */
+
+var KisBpmConditionExpressionCtrl = [ '$scope', '$modal', function($scope, $modal) {
+
+    // Config for the modal window
+    var opts = {
+        template:  'editor-app/configuration/properties/condition-expression-popup.html?version=' + Date.now(),
+        scope: $scope
+    };
+
+    // Open the dialog
+    $modal(opts);
+}];
+
+var KisBpmConditionExpressionPopupCtrl = [ '$scope', '$translate', '$http', function($scope, $translate, $http) {
+
+	// Put json representing condition on scope
+    if ($scope.property.value !== undefined && $scope.property.value !== null) {
+
+        $scope.conditionExpression = {value: $scope.property.value};
+        
+    } else {
+        $scope.conditionExpression = {value: ''};
+    }
+	
+    $scope.save = function() {
+        $scope.property.value = $scope.conditionExpression.value;
+        $scope.updatePropertyInModel($scope.property);
+        $scope.close();
+    };
+
+    // Close button handler
+    $scope.close = function() {
+    	$scope.property.mode = 'read';
+    	$scope.$hide();
+    };
+}];

+ 18 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-custom-controllers.js

@@ -0,0 +1,18 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */

+ 266 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-event-listeners-controller.js

@@ -0,0 +1,266 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/*
+ * Execution listeners
+ */
+
+var KisBpmEventListenersCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
+
+    // Config for the modal window
+    var opts = {
+        template:  'editor-app/configuration/properties/event-listeners-popup.html?version=' + Date.now(),
+        scope: $scope
+    };
+
+    // Open the dialog
+    $modal(opts);
+}];
+
+//Need a separate controller for the modal window due to https://github.com/angular-ui/bootstrap/issues/259
+// Will be fixed in a newer version of Angular UI
+var KisBpmEventListenersPopupCtrl = [ '$scope', '$q', '$translate', function($scope, $q, $translate) {
+
+    // Put json representing form properties on scope
+    if ($scope.property.value !== undefined && $scope.property.value !== null
+        && $scope.property.value.eventListeners !== undefined
+        && $scope.property.value.eventListeners !== null) {
+    	
+    	if ($scope.property.value.eventListeners.constructor == String)
+    	{
+    		$scope.eventListeners = JSON.parse($scope.property.value.eventListeners);
+    	}
+    	else
+    	{
+    		// Note that we clone the json object rather then setting it directly,
+            // this to cope with the fact that the user can click the cancel button and no changes should have happened
+    		$scope.eventListeners = angular.copy($scope.property.value.eventListeners);
+    	}
+    	
+    } else {
+        $scope.eventListeners = [];
+    }
+
+    // Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
+    $scope.selectedListeners = [];
+    $scope.translationsRetrieved = false;
+    
+    $scope.labels = {};
+    
+    var eventPromise = $translate('PROPERTY.EXECUTIONLISTENERS.EVENT');
+    var implementationPromise = $translate('PROPERTY.EXECUTIONLISTENERS.FIELDS.IMPLEMENTATION');
+    var namePromise = $translate('PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME');
+    
+    $q.all([eventPromise, implementationPromise, namePromise]).then(function(results) { 
+        $scope.labels.eventLabel = results[0];
+        $scope.labels.implementationLabel = results[1];
+        $scope.labels.nameLabel = results[2];
+        $scope.translationsRetrieved = true;
+        
+        // Config for grid
+        $scope.gridOptions = {
+            data: 'eventListeners',
+            enableRowReordering: true,
+            headerRowHeight: 28,
+            multiSelect: false,
+            keepLastSelected : false,
+            selectedItems: $scope.selectedListeners,
+            afterSelectionChange: function (rowItem, event) {
+            	
+            	if ($scope.selectedListeners.length > 0)
+            	{
+	            	var fields = $scope.selectedListeners[0].fields;
+	            	if (fields !== undefined && fields !== null)
+	            	{
+	            		for (var i = 0; i < fields.length; i++)
+	            		{
+	            			var field = fields[i];
+	            			if (field.stringValue !== undefined && field.stringValue !== '')
+	                    	{
+	            				field.implementation = field.stringValue;
+	                    	}
+	                    	else if (field.expression !== undefined && field.expression !== '')
+	                    	{
+	                    		field.implementation = field.expression;
+	                    	}
+	                    	else if (field.string !== undefined && field.string !== '')
+	                    	{
+	                    		field.implementation = field.string;
+	                    	}
+	            		}
+	            	}
+	            	
+	            	if (!$scope.selectedListeners[0].events || $scope.selectedListeners[0].events.length == 0)
+	                {
+	                	$scope.selectedListeners[0].events = [{event: ''}];
+	                }
+            	}
+            },
+            columnDefs: [{ field: 'event', displayName: $scope.labels.eventLabel },
+                { field: 'implementation', displayName: $scope.labels.implementationLabel }]
+        };
+    });
+    
+    // Click handler for + button after enum value
+    $scope.addEventValue = function(index) {
+        $scope.selectedListeners[0].events.splice(index + 1, 0, {event: ''});
+    };
+
+    // Click handler for - button after enum value
+    $scope.removeEventValue = function(index) {
+        $scope.selectedListeners[0].events.splice(index, 1);
+        $scope.listenerDetailsChanged();
+    };
+    
+    $scope.listenerDetailsChanged = function() {
+    	var listener = $scope.selectedListeners[0];
+    	if (listener.events)
+    	{
+    		var eventText = '';
+    		for (var i = 0; i < listener.events.length; i++)
+    		{
+    			if (i > 0)
+    			{
+    				eventText += ", ";
+    			}
+    			eventText += listener.events[i].event;
+    		}
+    		$scope.selectedListeners[0].event = eventText;
+    	}
+    	
+    	if (listener.rethrowEvent)
+    	{
+    		var implementationText = '';
+    		if (listener.rethrowType && listener.rethrowType.length > 0)
+    		{
+    			if (listener.rethrowType === 'error' && listener.errorcode !== '')
+	        	{
+	        		implementationText = "Rethrow as error " + listener.errorcode;
+	        	}
+    			else if (listener.rethrowType === 'message' && listener.messagename !== '')
+	        	{
+	        		implementationText = "Rethrow as message " + listener.messagename;
+	        	}
+    			else if ((listener.rethrowType === 'signal' || listener.rethrowType === 'globalSignal') && listener.signalname !== '')
+	        	{
+	        		implementationText = "Rethrow as signal " + listener.signalname;
+	        	}
+    		}
+    		$scope.selectedListeners[0].implementation = implementationText;
+    	}
+    	else
+    	{
+        	if ($scope.selectedListeners[0].className !== '')
+        	{
+        		$scope.selectedListeners[0].implementation = $scope.selectedListeners[0].className;
+        	}
+        	else if ($scope.selectedListeners[0].delegateExpression !== '')
+        	{
+        		$scope.selectedListeners[0].implementation = $scope.selectedListeners[0].delegateExpression;
+        	}
+        	else
+        	{
+        		$scope.selectedListeners[0].implementation = '';
+        	}
+    	}
+    };
+
+    // Click handler for add button
+    $scope.addNewListener = function() {
+        $scope.eventListeners.push({ event : '',
+            implementation : '',
+            className : '',
+            delegateExpression: '',
+            retrowEvent: false});
+    };
+
+    // Click handler for remove button
+    $scope.removeListener = function() {
+        if ($scope.selectedListeners.length > 0) {
+            var index = $scope.eventListeners.indexOf($scope.selectedListeners[0]);
+            $scope.gridOptions.selectItem(index, false);
+            $scope.eventListeners.splice(index, 1);
+
+            $scope.selectedListeners.length = 0;
+            if (index < $scope.eventListeners.length) {
+                $scope.gridOptions.selectItem(index + 1, true);
+            } else if ($scope.eventListeners.length > 0) {
+                $scope.gridOptions.selectItem(index - 1, true);
+            }
+        }
+    };
+
+    // Click handler for up button
+    $scope.moveListenerUp = function() {
+        if ($scope.selectedListeners.length > 0) {
+            var index = $scope.eventListeners.indexOf($scope.selectedListeners[0]);
+            if (index != 0) { // If it's the first, no moving up of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.eventListeners[index];
+                $scope.eventListeners.splice(index, 1);
+                $timeout(function(){
+                    $scope.eventListeners.splice(index + -1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for down button
+    $scope.moveListenerDown = function() {
+        if ($scope.selectedListeners.length > 0) {
+            var index = $scope.eventListeners.indexOf($scope.selectedListeners[0]);
+            if (index != $scope.eventListeners.length - 1) { // If it's the last element, no moving down of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.eventListeners[index];
+                $scope.eventListeners.splice(index, 1);
+                $timeout(function(){
+                    $scope.eventListeners.splice(index + 1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for save button
+    $scope.save = function() {
+
+        if ($scope.eventListeners.length > 0) {
+            $scope.property.value = {};
+            $scope.property.value.eventListeners = $scope.eventListeners;
+        } else {
+            $scope.property.value = null;
+        }
+
+        $scope.updatePropertyInModel($scope.property);
+        $scope.close();
+    };
+
+    $scope.cancel = function() {
+    	$scope.property.mode = 'read';
+    	$scope.$hide();
+    };
+
+    // Close button handler
+    $scope.close = function() {
+    	$scope.property.mode = 'read';
+    	$scope.$hide();
+    };
+
+}];

+ 326 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-execution-listeners-controller.js

@@ -0,0 +1,326 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/*
+ * Execution listeners
+ */
+
+var KisBpmExecutionListenersCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
+
+    // Config for the modal window
+    var opts = {
+        template:  'editor-app/configuration/properties/execution-listeners-popup.html?version=' + Date.now(),
+        scope: $scope
+    };
+
+    // Open the dialog
+    $modal(opts);
+}];
+
+var KisBpmExecutionListenersPopupCtrl = [ '$scope', '$q', '$translate', function($scope, $q, $translate) {
+
+    // Put json representing form properties on scope
+    if ($scope.property.value !== undefined && $scope.property.value !== null
+        && $scope.property.value.executionListeners !== undefined
+        && $scope.property.value.executionListeners !== null) {
+        
+        if ($scope.property.value.executionListeners.constructor == String)
+        {
+            $scope.executionListeners = JSON.parse($scope.property.value.executionListeners);
+        }
+        else
+        {
+            // Note that we clone the json object rather then setting it directly,
+            // this to cope with the fact that the user can click the cancel button and no changes should have happened
+            $scope.executionListeners = angular.copy($scope.property.value.executionListeners);
+        }
+        
+        for (var i = 0; i < $scope.executionListeners.length; i++)
+        {
+            var executionListener = $scope.executionListeners[i];
+            if (executionListener.className !== undefined && executionListener.className !== '')
+            {
+                executionListener.implementation = executionListener.className;
+            }
+            else if (executionListener.expression !== undefined && executionListener.expression !== '')
+            {
+                executionListener.implementation = executionListener.expression;
+            }
+            else if (executionListener.delegateExpression !== undefined && executionListener.delegateExpression !== '')
+            {
+                executionListener.implementation = executionListener.delegateExpression;
+            }
+        }
+    } else {
+        $scope.executionListeners = [];
+    }
+
+    // Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
+    $scope.selectedListeners = [];
+    $scope.selectedFields = [];
+    $scope.translationsRetrieved = false;
+    
+    $scope.labels = {};
+    
+    var eventPromise = $translate('PROPERTY.EXECUTIONLISTENERS.EVENT');
+    var implementationPromise = $translate('PROPERTY.EXECUTIONLISTENERS.FIELDS.IMPLEMENTATION');
+    var namePromise = $translate('PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME');
+    
+    $q.all([eventPromise, implementationPromise, namePromise]).then(function(results) { 
+        $scope.labels.eventLabel = results[0];
+        $scope.labels.implementationLabel = results[1];
+        $scope.labels.nameLabel = results[2];
+        $scope.translationsRetrieved = true;
+        
+        // Config for grid
+        $scope.gridOptions = {
+            data: 'executionListeners',
+            enableRowReordering: true,
+            headerRowHeight: 28,
+            multiSelect: false,
+            keepLastSelected : false,
+            selectedItems: $scope.selectedListeners,
+            afterSelectionChange: function (rowItem, event) {
+                $scope.selectedFields.length = 0;
+                if ($scope.selectedListeners.length > 0)
+                {
+                    var fields = $scope.selectedListeners[0].fields;
+                    if (fields !== undefined && fields !== null)
+                    {
+                        for (var i = 0; i < fields.length; i++)
+                        {
+                            var field = fields[i];
+                            if (field.stringValue !== undefined && field.stringValue !== '')
+                            {
+                                field.implementation = field.stringValue;
+                            }
+                            else if (field.expression !== undefined && field.expression !== '')
+                            {
+                                field.implementation = field.expression;
+                            }
+                            else if (field.string !== undefined && field.string !== '')
+                            {
+                                field.implementation = field.string;
+                            }
+                        }
+                    }
+                }
+            },
+            columnDefs: [{ field: 'event', displayName: $scope.labels.eventLabel },
+                { field: 'implementation', displayName: $scope.labels.implementationLabel }]
+        };
+        
+        // Config for field grid
+        $scope.gridFieldOptions = {
+            data: 'selectedListeners[0].fields',
+            enableRowReordering: true,
+            headerRowHeight: 28,
+            multiSelect: false,
+            keepLastSelected : false,
+            selectedItems: $scope.selectedFields,
+            columnDefs: [{ field: 'name', displayName: $scope.labels.nameLabel },
+                { field: 'implementation', displayName: $scope.labels.implementationLabel}]
+        };
+    });
+    
+    $scope.listenerDetailsChanged = function() {
+        if ($scope.selectedListeners[0].className !== '')
+        {
+            $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].className;
+        }
+        else if ($scope.selectedListeners[0].expression !== '')
+        {
+            $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].expression;
+        }
+        else if ($scope.selectedListeners[0].delegateExpression !== '')
+        {
+            $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].delegateExpression;
+        }
+        else
+        {
+            $scope.selectedListeners[0].implementation = '';
+        }
+    };
+
+    // Click handler for add button
+    $scope.addNewListener = function() {
+        $scope.executionListeners.push({ event : 'start',
+            implementation : '',
+            className : '',
+            expression: '',
+            delegateExpression: ''});
+    };
+
+    // Click handler for remove button
+    $scope.removeListener = function() {
+        if ($scope.selectedListeners.length > 0) {
+            var index = $scope.executionListeners.indexOf($scope.selectedListeners[0]);
+            $scope.gridOptions.selectItem(index, false);
+            $scope.executionListeners.splice(index, 1);
+
+            $scope.selectedListeners.length = 0;
+            if (index < $scope.executionListeners.length) {
+                $scope.gridOptions.selectItem(index + 1, true);
+            } else if ($scope.executionListeners.length > 0) {
+                $scope.gridOptions.selectItem(index - 1, true);
+            }
+        }
+    };
+
+    // Click handler for up button
+    $scope.moveListenerUp = function() {
+        if ($scope.selectedListeners.length > 0) {
+            var index = $scope.executionListeners.indexOf($scope.selectedListeners[0]);
+            if (index != 0) { // If it's the first, no moving up of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.executionListeners[index];
+                $scope.executionListeners.splice(index, 1);
+                $timeout(function(){
+                    $scope.executionListeners.splice(index + -1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for down button
+    $scope.moveListenerDown = function() {
+        if ($scope.selectedListeners.length > 0) {
+            var index = $scope.executionListeners.indexOf($scope.selectedListeners[0]);
+            if (index != $scope.executionListeners.length - 1) { // If it's the last element, no moving down of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.executionListeners[index];
+                $scope.executionListeners.splice(index, 1);
+                $timeout(function(){
+                    $scope.executionListeners.splice(index + 1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+    
+    $scope.fieldDetailsChanged = function() {
+        if ($scope.selectedFields[0].stringValue !== '')
+        {
+            $scope.selectedFields[0].implementation = $scope.selectedFields[0].stringValue;
+        }
+        else if ($scope.selectedFields[0].expression !== '')
+        {
+            $scope.selectedFields[0].implementation = $scope.selectedFields[0].expression;
+        }
+        else if ($scope.selectedFields[0].string !== '')
+        {
+            $scope.selectedFields[0].implementation = $scope.selectedFields[0].string;
+        }
+        else
+        {
+            $scope.selectedFields[0].implementation = '';
+        }
+    };
+
+    // Click handler for add button
+    $scope.addNewField = function() {
+        if ($scope.selectedListeners.length > 0)
+        {
+            if ($scope.selectedListeners[0].fields == undefined)
+            {
+                $scope.selectedListeners[0].fields = [];
+            }
+            $scope.selectedListeners[0].fields.push({ name : 'fieldName',
+                implementation : '',
+                stringValue : '',
+                expression: '',
+                string: ''});
+        }
+    };
+
+    // Click handler for remove button
+    $scope.removeField = function() {
+        if ($scope.selectedFields.length > 0) {
+            var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
+            $scope.gridFieldOptions.selectItem(index, false);
+            $scope.selectedListeners[0].fields.splice(index, 1);
+
+            $scope.selectedFields.length = 0;
+            if (index < $scope.selectedListeners[0].fields.length) {
+                $scope.gridFieldOptions.selectItem(index + 1, true);
+            } else if ($scope.selectedListeners[0].fields.length > 0) {
+                $scope.gridFieldOptions.selectItem(index - 1, true);
+            }
+        }
+    };
+
+    // Click handler for up button
+    $scope.moveFieldUp = function() {
+        if ($scope.selectedFields.length > 0) {
+            var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
+            if (index != 0) { // If it's the first, no moving up of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.selectedListeners[0].fields[index];
+                $scope.selectedListeners[0].fields.splice(index, 1);
+                $timeout(function(){
+                    $scope.selectedListeners[0].fields.splice(index + -1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for down button
+    $scope.moveFieldDown = function() {
+        if ($scope.selectedFields.length > 0) {
+            var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
+            if (index != $scope.selectedListeners[0].fields.length - 1) { // If it's the last element, no moving down of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.selectedListeners[0].fields[index];
+                $scope.selectedListeners[0].fields.splice(index, 1);
+                $timeout(function(){
+                    $scope.selectedListeners[0].fields.splice(index + 1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for save button
+    $scope.save = function() {
+
+        if ($scope.executionListeners.length > 0) {
+            $scope.property.value = {};
+            $scope.property.value.executionListeners = $scope.executionListeners;
+        } else {
+            $scope.property.value = null;
+        }
+
+        $scope.updatePropertyInModel($scope.property);
+        $scope.close();
+    };
+
+    $scope.cancel = function() {
+        $scope.$hide();
+        $scope.property.mode = 'read';
+    };
+
+    // Close button handler
+    $scope.close = function() {
+        $scope.$hide();
+        $scope.property.mode = 'read';
+    };
+
+}];

+ 192 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-fields-controller.js

@@ -0,0 +1,192 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/*
+ * Task listeners
+ */
+
+var KisBpmFieldsCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
+
+    // Config for the modal window
+    var opts = {
+        template:  'editor-app/configuration/properties/fields-popup.html',
+        scope: $scope
+    };
+
+    // Open the dialog
+    $modal(opts);
+}];
+
+var KisBpmFieldsPopupCtrl = [ '$scope', '$q', '$translate', function($scope, $q, $translate) {
+
+    // Put json representing form properties on scope
+    if ($scope.property.value !== undefined && $scope.property.value !== null
+        && $scope.property.value.fields !== undefined
+        && $scope.property.value.fields !== null) {
+        // Note that we clone the json object rather then setting it directly,
+        // this to cope with the fact that the user can click the cancel button and no changes should have happened
+        $scope.fields = angular.copy($scope.property.value.fields);
+        
+        for (var i = 0; i < $scope.fields.length; i++)
+		{
+			var field = $scope.fields[i];
+			if (field.stringValue !== undefined && field.stringValue !== '')
+        	{
+				field.implementation = field.stringValue;
+        	}
+        	else if (field.expression !== undefined && field.expression !== '')
+        	{
+        		field.implementation = field.expression;
+        	}
+        	else if (field.string !== undefined && field.string !== '')
+        	{
+        		field.implementation = field.string;
+        	}
+		}
+        
+    } else {
+        $scope.fields = [];
+    }
+
+    // Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
+    $scope.selectedFields = [];
+    $scope.translationsRetrieved = false;
+    $scope.labels = {};
+
+    var namePromise = $translate('PROPERTY.FIELDS.NAME');
+    var implementationPromise = $translate('PROPERTY.FIELDS.IMPLEMENTATION');
+
+    $q.all([namePromise, implementationPromise]).then(function(results) {
+        $scope.labels.nameLabel = results[0];
+        $scope.labels.implementationLabel = results[1];
+        $scope.translationsRetrieved = true;
+
+        // Config for grid
+        $scope.gridOptions = {
+            data: 'fields',
+            enableRowReordering: true,
+            headerRowHeight: 28,
+            multiSelect: false,
+            keepLastSelected: false,
+            selectedItems: $scope.selectedFields,
+            columnDefs: [{field: 'name', displayName: $scope.labels.nameLabel},
+                {field: 'implementation', displayName: $scope.labels.implementationLabel}]
+        };
+    });
+    
+    $scope.fieldDetailsChanged = function() {
+    	if ($scope.selectedFields[0].stringValue != '')
+    	{
+    		$scope.selectedFields[0].implementation = $scope.selectedFields[0].stringValue;
+    	}
+    	else if ($scope.selectedFields[0].expression != '')
+    	{
+    		$scope.selectedFields[0].implementation = $scope.selectedFields[0].expression;
+    	}
+    	else if ($scope.selectedFields[0].string != '')
+    	{
+    		$scope.selectedFields[0].implementation = $scope.selectedFields[0].string;
+    	}
+    	else
+    	{
+    		$scope.selectedFields[0].implementation = '';
+    	}
+    };
+
+    // Click handler for add button
+    $scope.addNewField = function() {
+    	$scope.fields.push({ name : 'fieldName',
+            implementation : '',
+            stringValue : '',
+            expression: '',
+            string: ''});
+    };
+
+    // Click handler for remove button
+    $scope.removeField = function() {
+        if ($scope.selectedFields.length > 0) {
+            var index = $scope.fields.indexOf($scope.selectedFields[0]);
+            $scope.gridOptions.selectItem(index, false);
+            $scope.fields.splice(index, 1);
+
+            $scope.selectedFields.length = 0;
+            if (index < $scope.fields.length) {
+                $scope.gridOptions.selectItem(index + 1, true);
+            } else if ($scope.fields.length > 0) {
+                $scope.gridOptions.selectItem(index - 1, true);
+            }
+        }
+    };
+
+    // Click handler for up button
+    $scope.moveFieldUp = function() {
+        if ($scope.selectedFields.length > 0) {
+            var index = $scope.fields.indexOf($scope.selectedFields[0]);
+            if (index != 0) { // If it's the first, no moving up of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.fields[index];
+                $scope.fields.splice(index, 1);
+                $timeout(function(){
+                	$scope.fields.splice(index + -1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for down button
+    $scope.moveFieldDown = function() {
+        if ($scope.selectedFields.length > 0) {
+            var index = $scope.fields.indexOf($scope.selectedFields[0]);
+            if (index != $scope.fields.length - 1) { // If it's the last element, no moving down of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.fields[index];
+                $scope.fields.splice(index, 1);
+                $timeout(function(){
+                	$scope.fields.splice(index + 1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for save button
+    $scope.save = function() {
+
+        if ($scope.fields.length > 0) {
+            $scope.property.value = {};
+            $scope.property.value.fields = $scope.fields;
+        } else {
+            $scope.property.value = null;
+        }
+
+        $scope.updatePropertyInModel($scope.property);
+        $scope.close();
+    };
+
+    $scope.cancel = function() {
+        $scope.close();
+    };
+
+    // Close button handler
+    $scope.close = function() {
+        $scope.property.mode = 'read';
+        $scope.$hide();
+    };
+}];

+ 192 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-form-properties-controller.js

@@ -0,0 +1,192 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/*
+ * Form Properties
+ */
+
+var KisBpmFormPropertiesCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
+
+    // Config for the modal window
+    var opts = {
+        template:  'editor-app/configuration/properties/form-properties-popup.html?version=' + Date.now(),
+        scope: $scope
+    };
+
+    // Open the dialog
+    $modal(opts);
+}];
+
+var KisBpmFormPropertiesPopupCtrl = ['$scope', '$q', '$translate', function($scope, $q, $translate) {
+
+    // Put json representing form properties on scope
+    if ($scope.property.value !== undefined && $scope.property.value !== null
+        && $scope.property.value.formProperties !== undefined
+        && $scope.property.value.formProperties !== null) {
+        // Note that we clone the json object rather then setting it directly,
+        // this to cope with the fact that the user can click the cancel button and no changes should have happended
+        $scope.formProperties = angular.copy($scope.property.value.formProperties);
+    } else {
+        $scope.formProperties = [];
+    }
+
+    // Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
+    $scope.selectedProperties = [];
+    
+    $scope.translationsRetrieved = false;
+    
+    $scope.labels = {};
+    
+    var idPromise = $translate('PROPERTY.FORMPROPERTIES.ID');
+    var namePromise = $translate('PROPERTY.FORMPROPERTIES.NAME');
+    var typePromise = $translate('PROPERTY.FORMPROPERTIES.TYPE');
+    
+    $q.all([idPromise, namePromise, typePromise]).then(function(results) { 
+    	$scope.labels.idLabel = results[0];
+        $scope.labels.nameLabel = results[1];
+        $scope.labels.typeLabel = results[2];
+        $scope.translationsRetrieved = true;
+        
+    	// Config for grid
+        $scope.gridOptions = {
+            data: 'formProperties',
+            enableRowReordering: true,
+            headerRowHeight: 28,
+            multiSelect: false,
+            keepLastSelected : false,
+            selectedItems: $scope.selectedProperties,
+            columnDefs: [{ field: 'id', displayName: $scope.labels.idLabel },
+                { field: 'name', displayName: $scope.labels.nameLabel},
+                { field: 'type', displayName: $scope.labels.typeLabel}]
+        };
+    });
+
+    // Handler for when the value of the type dropdown changes
+    $scope.propertyTypeChanged = function() {
+
+        // Check date. If date, show date pattern
+        if ($scope.selectedProperties[0].type === 'date') {
+            $scope.selectedProperties[0].datePattern = 'MM-dd-yyyy hh:mm';
+        } else {
+            delete $scope.selectedProperties[0].datePattern;
+        }
+
+        // Check enum. If enum, show list of options
+        if ($scope.selectedProperties[0].type === 'enum') {
+            $scope.selectedProperties[0].enumValues = [ {value: 'value 1'}, {value: 'value 2'}];
+        } else {
+            delete $scope.selectedProperties[0].enumValues;
+        }
+    };
+
+    // Click handler for + button after enum value
+    var valueIndex = 3;
+    $scope.addEnumValue = function(index) {
+        $scope.selectedProperties[0].enumValues.splice(index + 1, 0, {value: 'value ' + valueIndex++});
+    };
+
+    // Click handler for - button after enum value
+    $scope.removeEnumValue = function(index) {
+        $scope.selectedProperties[0].enumValues.splice(index, 1);
+    };
+
+    // Click handler for add button
+    var propertyIndex = 1;
+    $scope.addNewProperty = function() {
+        $scope.formProperties.push({ id : 'new_property_' + propertyIndex++,
+            name : '',
+            type : 'string',
+            readable: true,
+            writable: true});
+    };
+
+    // Click handler for remove button
+    $scope.removeProperty = function() {
+        if ($scope.selectedProperties.length > 0) {
+            var index = $scope.formProperties.indexOf($scope.selectedProperties[0]);
+            $scope.gridOptions.selectItem(index, false);
+            $scope.formProperties.splice(index, 1);
+
+            $scope.selectedProperties.length = 0;
+            if (index < $scope.formProperties.length) {
+                $scope.gridOptions.selectItem(index + 1, true);
+            } else if ($scope.formProperties.length > 0) {
+                $scope.gridOptions.selectItem(index - 1, true);
+            }
+        }
+    };
+
+    // Click handler for up button
+    $scope.movePropertyUp = function() {
+        if ($scope.selectedProperties.length > 0) {
+            var index = $scope.formProperties.indexOf($scope.selectedProperties[0]);
+            if (index != 0) { // If it's the first, no moving up of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.formProperties[index];
+                $scope.formProperties.splice(index, 1);
+                $timeout(function(){
+                    $scope.formProperties.splice(index + -1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for down button
+    $scope.movePropertyDown = function() {
+        if ($scope.selectedProperties.length > 0) {
+            var index = $scope.formProperties.indexOf($scope.selectedProperties[0]);
+            if (index != $scope.formProperties.length - 1) { // If it's the last element, no moving down of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.formProperties[index];
+                $scope.formProperties.splice(index, 1);
+                $timeout(function(){
+                    $scope.formProperties.splice(index + 1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for save button
+    $scope.save = function() {
+
+        if ($scope.formProperties.length > 0) {
+            $scope.property.value = {};
+            $scope.property.value.formProperties = $scope.formProperties;
+        } else {
+            $scope.property.value = null;
+        }
+
+        $scope.updatePropertyInModel($scope.property);
+        $scope.close();
+    };
+
+    $scope.cancel = function() {
+    	$scope.$hide();
+    	$scope.property.mode = 'read';
+    };
+
+    // Close button handler
+    $scope.close = function() {
+    	$scope.$hide();
+    	$scope.property.mode = 'read';
+    };
+
+}];

+ 158 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-in-parameters-controller.js

@@ -0,0 +1,158 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/*
+ * Input parameters for call activity
+ */
+
+var KisBpmInParametersCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
+
+    // Config for the modal window
+    var opts = {
+        template:  'editor-app/configuration/properties/in-parameters-popup.html?version=' + Date.now(),
+        scope: $scope
+    };
+
+    // Open the dialog
+    $modal(opts);
+}];
+
+var KisBpmInParametersPopupCtrl = ['$scope', '$q', '$translate', function($scope, $q, $translate) {
+
+    // Put json representing form properties on scope
+    if ($scope.property.value !== undefined && $scope.property.value !== null
+        && $scope.property.value.inParameters !== undefined
+        && $scope.property.value.inParameters !== null) {
+        // Note that we clone the json object rather then setting it directly,
+        // this to cope with the fact that the user can click the cancel button and no changes should have happened
+        $scope.parameters = angular.copy($scope.property.value.inParameters);
+    } else {
+        $scope.parameters = [];
+    }
+
+    // Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
+    $scope.selectedParameters = [];
+    $scope.translationsRetrieved = false;
+    
+    $scope.labels = {};
+    
+    var sourcePromise = $translate('PROPERTY.PARAMETER.SOURCE');
+    var sourceExpressionPromise = $translate('PROPERTY.PARAMETER.SOURCEEXPRESSION');
+    var targetPromise = $translate('PROPERTY.PARAMETER.TARGET');
+    
+    $q.all([sourcePromise, sourceExpressionPromise, targetPromise]).then(function(results) { 
+        $scope.labels.sourceLabel = results[0];
+        $scope.labels.sourceExpressionLabel = results[1];
+        $scope.labels.targetLabel = results[2];
+        $scope.translationsRetrieved = true;
+
+        // Config for grid
+        $scope.gridOptions = {
+            data: 'parameters',
+            enableRowReordering: true,
+            headerRowHeight: 28,
+            multiSelect: false,
+            keepLastSelected : false,
+            selectedItems: $scope.selectedParameters,
+            columnDefs: [{ field: 'source', displayName: $scope.labels.sourceLabel },
+                         { field: 'sourceExpression', displayName: $scope.labels.sourceExpressionLabel },
+                         { field: 'target', displayName: $scope.labels.targetLabel }]
+        };
+    });
+
+    // Click handler for add button
+    $scope.addNewParameter = function() {
+        $scope.parameters.push({ source : '',
+            sourceExpression : '',
+            target : ''});
+    };
+
+    // Click handler for remove button
+    $scope.removeParameter = function() {
+        if ($scope.selectedParameters.length > 0) {
+            var index = $scope.parameters.indexOf($scope.selectedParameters[0]);
+            $scope.gridOptions.selectItem(index, false);
+            $scope.parameters.splice(index, 1);
+
+            $scope.selectedParameters.length = 0;
+            if (index < $scope.parameters.length) {
+                $scope.gridOptions.selectItem(index + 1, true);
+            } else if ($scope.parameters.length > 0) {
+                $scope.gridOptions.selectItem(index - 1, true);
+            }
+        }
+    };
+
+    // Click handler for up button
+    $scope.moveParameterUp = function() {
+        if ($scope.selectedParameters.length > 0) {
+            var index = $scope.parameters.indexOf($scope.selectedParameters[0]);
+            if (index != 0) { // If it's the first, no moving up of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.parameters[index];
+                $scope.parameters.splice(index, 1);
+                $timeout(function(){
+                    $scope.parameters.splice(index + -1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for down button
+    $scope.moveParameterDown = function() {
+        if ($scope.selectedParameters.length > 0) {
+            var index = $scope.parameters.indexOf($scope.selectedParameters[0]);
+            if (index != $scope.parameters.length - 1) { // If it's the last element, no moving down of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.parameters[index];
+                $scope.parameters.splice(index, 1);
+                $timeout(function(){
+                    $scope.parameters.splice(index + 1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for save button
+    $scope.save = function() {
+
+        if ($scope.parameters.length > 0) {
+            $scope.property.value = {};
+            $scope.property.value.inParameters = $scope.parameters;
+        } else {
+            $scope.property.value = null;
+        }
+
+        $scope.updatePropertyInModel($scope.property);
+        $scope.close();
+    };
+
+    $scope.cancel = function() {
+        $scope.close();
+    };
+
+    // Close button handler
+    $scope.close = function() {
+        $scope.property.mode = 'read';
+        $scope.$hide();
+    };
+
+}];

+ 48 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-message-scope-controller.js

@@ -0,0 +1,48 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+angular.module('activitiModeler').controller('ActivitiMessageRefCtrl', [ '$scope', function($scope) {
+
+    // Find the parent shape on which the message definitions are defined
+    var messageDefinitionsProperty = undefined;
+    var parent = $scope.selectedShape;
+    while (parent !== null && parent !== undefined && messageDefinitionsProperty === undefined) {
+        if (parent.properties && parent.properties['oryx-messagedefinitions']) {
+            messageDefinitionsProperty = parent.properties['oryx-messagedefinitions'];
+        } else {
+            parent = parent.parent;
+        }
+    }
+
+    try {
+        messageDefinitionsProperty = JSON.parse(messageDefinitionsProperty);
+        if (typeof messageDefinitionsProperty == 'string') {
+            messageDefinitionsProperty = JSON.parse(messageDefinitionsProperty);
+        }
+    } catch (err) {
+        // Do nothing here, just to be sure we try-catch it
+    }
+
+    $scope.messageDefinitions = messageDefinitionsProperty;
+
+
+    $scope.messageChanged = function() {
+    	$scope.updatePropertyInModel($scope.property);
+    };
+}]);

+ 34 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-multiinstance-controller.js

@@ -0,0 +1,34 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/*
+ * Execution listeners
+ */
+
+var KisBpmMultiInstanceCtrl = [ '$scope', function($scope) {
+
+    if ($scope.property.value == undefined && $scope.property.value == null)
+    {
+    	$scope.property.value = 'None';
+    }
+        
+    $scope.multiInstanceChanged = function() {
+    	$scope.updatePropertyInModel($scope.property);
+    };
+}];

+ 158 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-out-parameters-controller.js

@@ -0,0 +1,158 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/*
+ * Input parameters for call activity
+ */
+
+var KisBpmOutParametersCtrl = [ '$scope' , '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
+
+    // Config for the modal window
+    var opts = {
+        template:  'editor-app/configuration/properties/out-parameters-popup.html?version=' + Date.now(),
+        scope: $scope
+    };
+
+    // Open the dialog
+    $modal(opts);
+}];
+
+var KisBpmOutParametersPopupCtrl = [ '$scope', '$q', '$translate', function($scope, $q, $translate) {
+
+    // Put json representing form properties on scope
+    if ($scope.property.value !== undefined && $scope.property.value !== null
+        && $scope.property.value.outParameters !== undefined
+        && $scope.property.value.outParameters !== null) {
+        // Note that we clone the json object rather then setting it directly,
+        // this to cope with the fact that the user can click the cancel button and no changes should have happened
+        $scope.parameters = angular.copy($scope.property.value.outParameters);
+    } else {
+        $scope.parameters = [];
+    }
+
+    // Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
+    $scope.selectedParameters = [];
+    $scope.translationsRetrieved = false;
+    
+    $scope.labels = {};
+    
+    var sourcePromise = $translate('PROPERTY.PARAMETER.SOURCE');
+    var sourceExpressionPromise = $translate('PROPERTY.PARAMETER.SOURCEEXPRESSION');
+    var targetPromise = $translate('PROPERTY.PARAMETER.TARGET');
+    
+    $q.all([sourcePromise, sourceExpressionPromise, targetPromise]).then(function(results) { 
+        $scope.labels.sourceLabel = results[0];
+        $scope.labels.sourceExpressionLabel = results[1];
+        $scope.labels.targetLabel = results[2];
+        $scope.translationsRetrieved = true;
+        
+        // Config for grid
+        $scope.gridOptions = {
+            data: 'parameters',
+            enableRowReordering: true,
+            headerRowHeight: 28,
+            multiSelect: false,
+            keepLastSelected : false,
+            selectedItems: $scope.selectedParameters,
+            columnDefs: [{ field: 'source', displayName: $scope.labels.sourceLabel },
+                         { field: 'sourceExpression', displayName: $scope.labels.sourceExpressionLabel },
+                         { field: 'target', displayName: $scope.labels.targetLabel }]
+        };
+    });
+
+    // Click handler for add button
+    $scope.addNewParameter = function() {
+        $scope.parameters.push({ source : '',
+            sourceExpression : '',
+            target : ''});
+    };
+
+    // Click handler for remove button
+    $scope.removeParameter = function() {
+        if ($scope.selectedParameters.length > 0) {
+            var index = $scope.parameters.indexOf($scope.selectedParameters[0]);
+            $scope.gridOptions.selectItem(index, false);
+            $scope.parameters.splice(index, 1);
+
+            $scope.selectedParameters.length = 0;
+            if (index < $scope.parameters.length) {
+                $scope.gridOptions.selectItem(index + 1, true);
+            } else if ($scope.parameters.length > 0) {
+                $scope.gridOptions.selectItem(index - 1, true);
+            }
+        }
+    };
+
+    // Click handler for up button
+    $scope.moveParameterUp = function() {
+        if ($scope.selectedParameters.length > 0) {
+            var index = $scope.parameters.indexOf($scope.selectedParameters[0]);
+            if (index != 0) { // If it's the first, no moving up of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.parameters[index];
+                $scope.parameters.splice(index, 1);
+                $timeout(function(){
+                    $scope.parameters.splice(index + -1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for down button
+    $scope.moveParameterDown = function() {
+        if ($scope.selectedParameters.length > 0) {
+            var index = $scope.parameters.indexOf($scope.selectedParameters[0]);
+            if (index != $scope.parameters.length - 1) { // If it's the last element, no moving down of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.parameters[index];
+                $scope.parameters.splice(index, 1);
+                $timeout(function(){
+                    $scope.parameters.splice(index + 1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for save button
+    $scope.save = function() {
+
+        if ($scope.parameters.length > 0) {
+            $scope.property.value = {};
+            $scope.property.value.outParameters = $scope.parameters;
+        } else {
+            $scope.property.value = null;
+        }
+
+        $scope.updatePropertyInModel($scope.property);
+        $scope.close();
+    };
+
+    $scope.cancel = function() {
+        $scope.close();
+    };
+
+    // Close button handler
+    $scope.close = function() {
+        $scope.property.mode = 'read';
+        $scope.$hide();
+    };
+
+}];

+ 47 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-signal-scope-controller.js

@@ -0,0 +1,47 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+angular.module('activitiModeler').controller('ActivitiSignalRefCtrl', [ '$scope', function($scope) {
+
+    // Find the parent shape on which the signal definitions are defined
+    var signalDefinitionsProperty = undefined;
+    var parent = $scope.selectedShape;
+    while (parent !== null && parent !== undefined && signalDefinitionsProperty === undefined) {
+        if (parent.properties && parent.properties['oryx-signaldefinitions']) {
+            signalDefinitionsProperty = parent.properties['oryx-signaldefinitions'];
+        } else {
+            parent = parent.parent;
+        }
+    }
+
+    try {
+        signalDefinitionsProperty = JSON.parse(signalDefinitionsProperty);
+        if (typeof signalDefinitionsProperty == 'string') {
+            signalDefinitionsProperty = JSON.parse(signalDefinitionsProperty);
+        }
+    } catch (err) {
+        // Do nothing here, just to be sure we try-catch it
+    }
+
+    $scope.signalDefinitions = signalDefinitionsProperty;
+
+
+    $scope.signalChanged = function() {
+    	$scope.updatePropertyInModel($scope.property);
+    };
+}]);

+ 325 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties-task-listeners-controller.js

@@ -0,0 +1,325 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/*
+ * Task listeners
+ */
+
+var KisBpmTaskListenersCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
+
+    // Config for the modal window
+    var opts = {
+        template:  'editor-app/configuration/properties/task-listeners-popup.html?version=' + Date.now(),
+        scope: $scope
+    };
+
+    // Open the dialog
+    $modal(opts);
+}];
+
+var KisBpmTaskListenersPopupCtrl = [ '$scope', '$q', '$translate', function($scope, $q, $translate) {
+
+    // Put json representing form properties on scope
+    if ($scope.property.value !== undefined && $scope.property.value !== null
+        && $scope.property.value.taskListeners !== undefined
+        && $scope.property.value.taskListeners !== null) {
+        
+        if ($scope.property.value.taskListeners.constructor == String)
+        {
+            $scope.taskListeners = JSON.parse($scope.property.value.taskListeners);
+        }
+        else
+        {
+            // Note that we clone the json object rather then setting it directly,
+            // this to cope with the fact that the user can click the cancel button and no changes should have happened
+            $scope.taskListeners = angular.copy($scope.property.value.taskListeners);
+        }
+        
+        for (var i = 0; i < $scope.taskListeners.length; i++)
+        {
+            var taskListener = $scope.taskListeners[i];
+            if (taskListener.className !== undefined && taskListener.className !== '')
+            {
+                taskListener.implementation = taskListener.className;
+            }
+            else if (taskListener.expression !== undefined && taskListener.expression !== '')
+            {
+                taskListener.implementation = taskListener.expression;
+            }
+            else if (taskListener.delegateExpression !== undefined && taskListener.delegateExpression !== '')
+            {
+                taskListener.implementation = taskListener.delegateExpression;
+            }
+        }
+    } else {
+        $scope.taskListeners = [];
+    }
+
+    // Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
+    $scope.selectedListeners = [];
+    $scope.selectedFields = [];
+    $scope.translationsRetrieved = false;
+    
+    $scope.labels = {};
+    
+    var eventPromise = $translate('PROPERTY.TASKLISTENERS.EVENT');
+    var implementationPromise = $translate('PROPERTY.TASKLISTENERS.FIELDS.IMPLEMENTATION');
+    var namePromise = $translate('PROPERTY.TASKLISTENERS.FIELDS.NAME');
+    
+    $q.all([eventPromise, implementationPromise, namePromise]).then(function(results) { 
+        $scope.labels.eventLabel = results[0];
+        $scope.labels.implementationLabel = results[1];
+        $scope.labels.nameLabel = results[2];
+        $scope.translationsRetrieved = true;
+
+        // Config for grid
+        $scope.gridOptions = {
+            data: 'taskListeners',
+            enableRowReordering: true,
+            headerRowHeight: 28,
+            multiSelect: false,
+            keepLastSelected : false,
+            selectedItems: $scope.selectedListeners,
+            afterSelectionChange: function (rowItem, event) {
+                $scope.selectedFields.length = 0;
+                if ($scope.selectedListeners.length > 0)
+                {
+                    var fields = $scope.selectedListeners[0].fields;
+                    if (fields !== undefined && fields !== null)
+                    {
+                        for (var i = 0; i < fields.length; i++)
+                        {
+                            var field = fields[i];
+                            if (field.stringValue !== undefined && field.stringValue !== '')
+                            {
+                                field.implementation = field.stringValue;
+                            }
+                            else if (field.expression !== undefined && field.expression !== '')
+                            {
+                                field.implementation = field.expression;
+                            }
+                            else if (field.string !== undefined && field.string !== '')
+                            {
+                                field.implementation = field.string;
+                            }
+                        }
+                    }
+                }
+            },
+            columnDefs: [{ field: 'event', displayName: $scope.labels.eventLabel },
+                { field: 'implementation', displayName: $scope.labels.implementationLabel}]
+        };
+        
+        // Config for field grid
+        $scope.gridFieldOptions = {
+            data: 'selectedListeners[0].fields',
+            enableRowReordering: true,
+            headerRowHeight: 28,
+            multiSelect: false,
+            keepLastSelected : false,
+            selectedItems: $scope.selectedFields,
+            columnDefs: [{ field: 'name', displayName: $scope.labels.name },
+                { field: 'implementation', displayName: $scope.labels.implementationLabel}]
+        };
+    });
+    
+    $scope.listenerDetailsChanged = function() {
+        if ($scope.selectedListeners[0].className !== '')
+        {
+            $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].className;
+        }
+        else if ($scope.selectedListeners[0].expression !== '')
+        {
+            $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].expression;
+        }
+        else if ($scope.selectedListeners[0].delegateExpression !== '')
+        {
+            $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].delegateExpression;
+        }
+        else
+        {
+            $scope.selectedListeners[0].implementation = '';
+        }
+    };
+
+    // Click handler for add button
+    $scope.addNewListener = function() {
+        $scope.taskListeners.push({ event : 'create',
+            implementation : '',
+            className : '',
+            expression: '',
+            delegateExpression: ''});
+    };
+
+    // Click handler for remove button
+    $scope.removeListener = function() {
+        if ($scope.selectedListeners.length > 0) {
+            var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]);
+            $scope.gridOptions.selectItem(index, false);
+            $scope.taskListeners.splice(index, 1);
+
+            $scope.selectedListeners.length = 0;
+            if (index < $scope.taskListeners.length) {
+                $scope.gridOptions.selectItem(index + 1, true);
+            } else if ($scope.taskListeners.length > 0) {
+                $scope.gridOptions.selectItem(index - 1, true);
+            }
+        }
+    };
+
+    // Click handler for up button
+    $scope.moveListenerUp = function() {
+        if ($scope.selectedListeners.length > 0) {
+            var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]);
+            if (index != 0) { // If it's the first, no moving up of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.taskListeners[index];
+                $scope.taskListeners.splice(index, 1);
+                $timeout(function(){
+                    $scope.taskListeners.splice(index + -1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for down button
+    $scope.moveListenerDown = function() {
+        if ($scope.selectedListeners.length > 0) {
+            var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]);
+            if (index != $scope.taskListeners.length - 1) { // If it's the last element, no moving down of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.taskListeners[index];
+                $scope.taskListeners.splice(index, 1);
+                $timeout(function(){
+                    $scope.taskListeners.splice(index + 1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+    
+    $scope.fieldDetailsChanged = function() {
+        if ($scope.selectedFields[0].stringValue != '')
+        {
+            $scope.selectedFields[0].implementation = $scope.selectedFields[0].stringValue;
+        }
+        else if ($scope.selectedFields[0].expression != '')
+        {
+            $scope.selectedFields[0].implementation = $scope.selectedFields[0].expression;
+        }
+        else if ($scope.selectedFields[0].string != '')
+        {
+            $scope.selectedFields[0].implementation = $scope.selectedFields[0].string;
+        }
+        else
+        {
+            $scope.selectedFields[0].implementation = '';
+        }
+    };
+
+    // Click handler for add button
+    $scope.addNewField = function() {
+        if ($scope.selectedListeners.length > 0)
+        {
+            if ($scope.selectedListeners[0].fields == undefined)
+            {
+                $scope.selectedListeners[0].fields = [];
+            }
+            $scope.selectedListeners[0].fields.push({ name : 'fieldName',
+                implementation : '',
+                stringValue : '',
+                expression: '',
+                string: ''});
+        }
+    };
+
+    // Click handler for remove button
+    $scope.removeField = function() {
+        if ($scope.selectedFields.length > 0) {
+            var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
+            $scope.gridFieldOptions.selectItem(index, false);
+            $scope.selectedListeners[0].fields.splice(index, 1);
+
+            $scope.selectedFields.length = 0;
+            if (index < $scope.selectedListeners[0].fields.length) {
+                $scope.gridFieldOptions.selectItem(index + 1, true);
+            } else if ($scope.selectedListeners[0].fields.length > 0) {
+                $scope.gridFieldOptions.selectItem(index - 1, true);
+            }
+        }
+    };
+
+    // Click handler for up button
+    $scope.moveFieldUp = function() {
+        if ($scope.selectedFields.length > 0) {
+            var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
+            if (index != 0) { // If it's the first, no moving up of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.selectedListeners[0].fields[index];
+                $scope.selectedListeners[0].fields.splice(index, 1);
+                $timeout(function(){
+                    $scope.selectedListeners[0].fields.splice(index + -1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for down button
+    $scope.moveFieldDown = function() {
+        if ($scope.selectedFields.length > 0) {
+            var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
+            if (index != $scope.selectedListeners[0].fields.length - 1) { // If it's the last element, no moving down of course
+                // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
+                var temp = $scope.selectedListeners[0].fields[index];
+                $scope.selectedListeners[0].fields.splice(index, 1);
+                $timeout(function(){
+                    $scope.selectedListeners[0].fields.splice(index + 1, 0, temp);
+                }, 100);
+
+            }
+        }
+    };
+
+    // Click handler for save button
+    $scope.save = function() {
+
+        if ($scope.taskListeners.length > 0) {
+            $scope.property.value = {};
+            $scope.property.value.taskListeners = $scope.taskListeners;
+        } else {
+            $scope.property.value = null;
+        }
+
+        $scope.updatePropertyInModel($scope.property);
+        $scope.close();
+    };
+
+    $scope.cancel = function() {
+        $scope.close();
+    };
+
+    // Close button handler
+    $scope.close = function() {
+        $scope.property.mode = 'read';
+        $scope.$hide();
+    };
+
+}];

+ 4 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/assignment-display-template.html

@@ -0,0 +1,4 @@
+<span ng-if="property.value.assignment.assignee">{{'PROPERTY.ASSIGNMENT.ASSIGNEE_DISPLAY' | translate:property.value.assignment }} </span>
+<span ng-if="property.value.assignment.candidateUsers.length > 0">{{'PROPERTY.ASSIGNMENT.CANDIDATE_USERS_DISPLAY' | translate:property.value.assignment.candidateUsers}} </span>
+<span ng-if="property.value.assignment.candidateGroups.length > 0">{{'PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS_DISPLAY' | translate:property.value.assignment.candidateGroups}} </span>
+<span ng-if="!property.value.assignment.assignee && (!property.value.assignment.candidateUsers || property.value.assignment.candidateUsers.length == 0) && (!property.value.assignment.candidateGroups || property.value.assignment.candidateGroups.length == 0)" translate>PROPERTY.ASSIGNMENT.EMPTY</span>

+ 44 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/assignment-popup.html

@@ -0,0 +1,44 @@
+<div class="modal" ng-controller="KisBpmAssignmentPopupCtrl">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
+                <h2 translate>PROPERTY.ASSIGNMENT.TITLE</h2>
+            </div>
+            <div class="modal-body">
+            
+            	<div class="row row-no-gutter">
+            		<div class="form-group">
+            			<label for="assigneeField">{{'PROPERTY.ASSIGNMENT.ASSIGNEE' | translate}}</label>
+            			<input type="text" id="assigneeField" class="form-control" ng-model="assignment.assignee" placeholder="{{'PROPERTY.ASSIGNMENT.ASSIGNEE_PLACEHOLDER' | translate}}" />
+            		</div>
+            	</div>
+            	
+                <div class="row row-no-gutter">
+                    <div class="form-group">
+                    	<label for="userField">{{'PROPERTY.ASSIGNMENT.CANDIDATE_USERS' | translate}}</label>
+                        <div ng-repeat="candidateUser in assignment.candidateUsers">
+            	            <input id="userField" class="form-control" type="text" ng-model="candidateUser.value" />
+            	            <i class="glyphicon glyphicon-minus clickable-property" ng-click="removeCandidateUserValue($index)"></i>
+            	            <i ng-if="$index == (assignment.candidateUsers.length - 1)" class="glyphicon glyphicon-plus clickable-property" ng-click="addCandidateUserValue($index)"></i>
+                        </div>
+                   	</div>
+            
+                    <div class="form-group">
+                    	<label for="groupField">{{'PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS' | translate}}</label>
+                        <div ng-repeat="candidateGroup in assignment.candidateGroups">
+            	          	<input id="groupField" class="form-control" type="text" ng-model="candidateGroup.value" />
+            	          	<i class="glyphicon glyphicon-minus clickable-property" ng-click="removeCandidateGroupValue($index)"></i>
+            	          	<i ng-if="$index == (assignment.candidateGroups.length - 1)" class="glyphicon glyphicon-plus clickable-property" ng-click="addCandidateGroupValue($index)"></i>
+                        </div>
+                    </div>
+                </div>
+            
+            </div>
+            <div class="modal-footer">
+                <button ng-click="close()" class="btn btn-primary" translate>ACTION.CANCEL</button>
+                <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 2 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/condition-expression-display-template.html

@@ -0,0 +1,2 @@
+<span ng-if="property.value">{{property.value|limitTo:20}}</span>
+<span ng-if="!property.value">{{'PROPERTY.SEQUENCEFLOW.CONDITION.NO-CONDITION-DISPLAY' | translate}}</span>

+ 4 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/condition-expression-write-template.html

@@ -0,0 +1,4 @@
+
+<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
+<span ng-controller="KisBpmConditionExpressionCtrl">
+</span>

+ 115 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/event-listeners-popup.html

@@ -0,0 +1,115 @@
+
+<div class="modal" ng-controller="KisBpmEventListenersPopupCtrl">
+    <div class="modal-dialog modal-wide">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
+                <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
+            </div>
+            <div class="modal-body">
+            
+                <div class="row row-no-gutter">
+                	<div class="col-xs-10">
+            	        <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
+            	        <div class="pull-right">
+            	            <div class="btn-group">
+            	                <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.UP | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveListenerUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
+            	                <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.DOWN | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveListenerDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
+            	            </div>
+            	            <div class="btn-group">
+            	                <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.ADD | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewListener()"><i class="glyphicon glyphicon-plus"></i></a>
+            	                <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.REMOVE | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeListener()"><i class="glyphicon glyphicon-minus"></i></a>
+            	            </div>
+            	        </div>
+            		</div>
+            	</div>
+            	
+            	<div class="row row-no-gutter">
+                  	<div ng-if="translationsRetrieved" ng-show="selectedListeners.length > 0" class="col-xs-6">
+            			<div class="form-group">
+            	        	<label for="userField">{{'PROPERTY.EVENTLISTENERS.EVENTS' | translate}}</label>
+            	            <div ng-repeat="eventDefinition in selectedListeners[0].events">
+            	            	<select id="eventField" class="form-control" ng-model="eventDefinition.event" ng-change="listenerDetailsChanged()">
+            	            		<option title="{{'EVENT_TYPE.ACTIVITY.COMPENSATE.TOOLTIP' | translate}}">ACTIVITY_COMPENSATE</option>
+            	            		<option title="{{'EVENT_TYPE.ACTIVITY.COMPLETED.TOOLTIP' | translate}}">ACTIVITY_COMPLETED</option>
+            	            		<option title="bla">ACTIVITY_ERROR_RECEIVED</option>
+            	            		<option>ACTIVITY_MESSAGE_RECEIVED</option>
+            	            		<option>ACTIVITY_SIGNALED</option>
+            	            		<option>ACTIVITY_STARTED</option>
+            	            		<option>ENGINE_CLOSED</option>
+            	            		<option>ENGINE_CREATED</option>
+            	            		<option>ENTITY_ACTIVATED</option>
+            	                	<option>ENTITY_CREATED</option>
+            	                	<option>ENTITY_DELETED</option>
+            	                	<option>ENTITY_INITIALIZED</option>
+            	                	<option>ENTITY_SUSPENDED</option>
+            	                	<option>ENTITY_UPDATED</option>
+            	                	<option>JOB_EXECUTION_FAILURE</option>
+            	                	<option>JOB_EXECUTION_SUCCESS</option>
+            	                	<option>JOB_RETRIES_DECREMENTED</option>
+            	                	<option title="{{'EVENT_TYPE.MEMBERSHIP.CREATED.TOOLTIP' | translate}}">MEMBERSHIP_CREATED</option>
+            	                	<option title="{{'EVENT_TYPE.MEMBERSHIP.DELETED.TOOLTIP' | translate}}">MEMBERSHIP_DELETED</option>
+            	                	<option title="{{'EVENT_TYPE.MEMBERSHIPS.DELETED.TOOLTIP' | translate}}">MEMBERSHIPS_DELETED</option>
+            	                	<option title="{{'EVENT_TYPE.TASK.ASSIGNED.TOOLTIP' | translate}}">TASK_ASSIGNED</option>
+            	                	<option title="{{'EVENT_TYPE.TASK.COMPLETED.TOOLTIP' | translate}}">TASK_COMPLETED</option>
+            	                	<option>TIMER_FIRED</option>
+            	                	<option title="{{'EVENT_TYPE.UNCAUGHT.BPMNERROR.TOOLTIP' | translate}}">UNCAUGHT_BPMN_ERROR</option>
+            	                	<option title="{{'EVENT_TYPE.VARIABLE.CREATED.TOOLTIP' | translate}}">VARIABLE_CREATED</option>
+            	                	<option title="{{'EVENT_TYPE.VARIABLE.DELETED.TOOLTIP' | translate}}">VARIABLE_DELETED</option>
+            	                	<option title="{{'EVENT_TYPE.VARIABLE.UPDATED.TOOLTIP' | translate}}">VARIABLE_UPDATED</option>
+            	               	</select>
+            		            <i ng-if="$index > 0" class="glyphicon glyphicon-minus clickable-property" ng-click="removeEventValue($index)"></i>
+            		            <i class="glyphicon glyphicon-plus clickable-property" ng-click="addEventValue($index)"></i>
+            	            </div>
+            	            <div class="form-group">
+            			   		<label for="classField">{{'PROPERTY.EVENTLISTENERS.RETHROW' | translate}}</label>
+            			   		<input type="checkbox" id="rethrowField" class="form-control" ng-model="selectedListeners[0].rethrowEvent" ng-change="listenerDetailsChanged()" />
+            				</div>
+            	       	</div>
+                     </div>
+                     <div ng-show="selectedListeners.length > 0 && selectedListeners[0].events[0].event" class="col-xs-6">
+                     	<div class="form-group" ng-if="!selectedListeners[0].rethrowEvent">
+            		   		<label for="classField">{{'PROPERTY.EVENTLISTENERS.CLASS' | translate}}</label>
+            		   		<input type="text" id="classField" class="form-control" ng-model="selectedListeners[0].className" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EVENTLISTENERS.CLASS.PLACEHOLDER' | translate}}" />
+            			</div>
+            			<div class="form-group" ng-if="!selectedListeners[0].rethrowEvent">
+            		   		<label for="delegateExpressionField">{{'PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION' | translate}}</label>
+            		   		<input type="text" id="delegateExpressionField" class="form-control" ng-model="selectedListeners[0].delegateExpression" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER' | translate}}" />
+            			</div>
+            			<div class="form-group" ng-if="!selectedListeners[0].rethrowEvent">
+            		   		<label for="entityTypeField">{{'PROPERTY.EVENTLISTENERS.ENTITYTYPE' | translate}}</label>
+            		   		<input type="text" id="entityTypeField" class="form-control" ng-model="selectedListeners[0].entityType" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EVENTLISTENERS.ENTITYTYPE.PLACEHOLDER' | translate}}" />
+            			</div>
+            			<div class="form-group" ng-if="selectedListeners[0].rethrowEvent">
+            		   		<label for="delegateExpressionField">{{'PROPERTY.EVENTLISTENERS.RETHROWTYPE' | translate}}</label>
+            		   		<select id="rethrowTypeField" class="form-control" ng-model="selectedListeners[0].rethrowType" ng-change="rethrowTypeChanged()">
+                                <option>error</option>
+                                <option>message</option>
+                                <option>signal</option>
+                                <option>globalSignal</option>
+                            </select>
+            			</div>
+            			<div class="form-group" ng-if="selectedListeners[0].rethrowType === 'error'">
+            		   		<label for="errorCodeField">{{'PROPERTY.EVENTLISTENERS.ERRORCODE' | translate}}</label>
+            		   		<input type="text" id="errorCodeField" class="form-control" ng-model="selectedListeners[0].errorcode" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EVENTLISTENERS.ERRORCODE.PLACEHOLDER' | translate}}" />
+            			</div>
+            			<div class="form-group" ng-if="selectedListeners[0].rethrowType === 'message'">
+            		   		<label for="messageNameField">{{'PROPERTY.EVENTLISTENERS.MESSAGENAME' | translate}}</label>
+            		   		<input type="text" id="messageNameField" class="form-control" ng-model="selectedListeners[0].messagename" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EVENTLISTENERS.MESSAGENAME.PLACEHOLDER' | translate}}" />
+            			</div>
+            			<div class="form-group" ng-if="selectedListeners[0].rethrowType === 'signal' || selectedListeners[0].rethrowType === 'globalSignal'">
+            		   		<label for="messageNameField">{{'PROPERTY.EVENTLISTENERS.SIGNALNAME' | translate}}</label>
+            		   		<input type="text" id="signalNameField" class="form-control" ng-model="selectedListeners[0].signalname" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EVENTLISTENERS.SIGNALNAME.PLACEHOLDER' | translate}}" />
+            			</div>
+                     </div>
+                     <div ng-show="selectedListeners.length == 0" class="col-xs-6 muted no-property-selected" translate>PROPERTY.EVENTLISTENERS.UNSELECTED</div>
+                </div>
+            
+            </div>
+            <div class="modal-footer">
+                <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
+                <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 4 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/execution-listeners-write-template.html

@@ -0,0 +1,4 @@
+
+<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
+<span ng-controller="KisBpmExecutionListenersCtrl">
+</span>

+ 61 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/fields-popup.html

@@ -0,0 +1,61 @@
+
+<div class="modal" ng-controller="KisBpmFieldsPopupCtrl">
+    <div class="modal-dialog modal-wide">
+        <div class="modal-content">
+			<div class="modal-header">
+			    <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
+			    <h3>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h3>
+			</div>
+			<div class="modal-body">
+
+			    <div class="row row-no-gutter">
+			        <div class="col-xs-6">
+                        <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
+			            <div class="pull-right">
+			                <div class="btn-group">
+			                    <a href="#" class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.UP' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveFieldUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
+			                    <a href="#" class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.DOWN' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveFieldDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
+			                </div>
+			                <div class="btn-group">
+			                    <a href="#" class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.ADD' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewField()"><i class="glyphicon glyphicon-plus"></i></a>
+			                    <a href="#" class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.REMOVE' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeField()"><i class="glyphicon glyphicon-minus"></i></a>
+			                </div>
+			            </div>
+			        </div>
+
+			       <div class="col-xs-6">
+			            <div ng-show="selectedFields.length > 0">
+
+			                <div class="form-group">
+                                <label for="fieldName">{{'PROPERTY.FIELDS.NAME' | translate}}</label>
+                                <input type="text" id="fieldName"  class="form-control" ng-model="selectedFields[0].name" placeholder="{{'PROPERTY.FIELDS.NAME.PLACEHOLDER' | translate}}" />
+                            </div>
+
+                            <div class="form-group">
+                            <label for="fieldStringValue">{{'PROPERTY.FIELDS.STRINGVALUE' | translate}}</label>
+                                <input type="text" id="fieldStringValue"  class="form-control" ng-model="selectedFields[0].stringValue" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.FIELDS.STRINGVALUE.PLACEHOLDER' | translate}}" />
+                            </div>
+
+                            <div class="form-group">
+                            <label for="fieldExpression">{{'PROPERTY.FIELDS.EXPRESSION' | translate}}</label>
+                                <input type="text" id="fieldExpression"  class="form-control" ng-model="selectedFields[0].expression" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.FIELDS.EXPRESSION.PLACEHOLDER' | translate}}" />
+                            </div>
+
+                            <div class="form-group">
+                            <label for="fieldString">{{'PROPERTY.FIELDS.STRING' | translate}}</label>
+			                        <textarea type="text" id="fieldString"  class="form-control" ng-model="selectedFields[0].string" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.FIELDS.STRING.PLACEHOLDER' | translate}}"></textarea>
+                            </div>
+
+			            </div>
+			            <div ng-show="selectedFields.length == 0" class="muted no-property-selected" translate>PROPERTY.FIELDS.EMPTY</div>
+			        </div>
+			    </div>
+			
+			</div>
+			<div class="modal-footer">
+			    <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
+			    <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
+			</div>
+		</div>
+	</div>
+</div>

+ 93 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/form-properties-popup.html

@@ -0,0 +1,93 @@
+
+<div class="modal" ng-controller="KisBpmFormPropertiesPopupCtrl">
+    <div class="modal-dialog modal-wide">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
+                <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
+            </div>
+            <div class="modal-body">
+            
+                <div class="row row-no-gutter">
+                    <div class="col-xs-6">
+                        <div ng-if="translationsRetrieved" class="default-grid" ng-grid="gridOptions"></div>
+                        <div class="pull-right">
+                            <div class="btn-group">
+                                <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.UP' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="movePropertyUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
+                                <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.DOWN' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="movePropertyDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
+                            </div>
+                            <div class="btn-group">
+                                <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.ADD' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewProperty()"><i class="glyphicon glyphicon-plus"></i></a>
+                                <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.REMOVE' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeProperty()"><i class="glyphicon glyphicon-minus"></i></a>
+                            </div>
+                        </div>
+                    </div>
+            
+                    <div class="col-xs-6">
+                        <div ng-show="selectedProperties.length > 0">
+            
+                            <div class="form-group">
+            			   		<label for="idField">{{'PROPERTY.FORMPROPERTIES.ID' | translate}}</label>
+            			   		<input id="idField" class="form-control" type="text" ng-model="selectedProperties[0].id" placeholder="{{'PROPERTY.FORMPROPERTIES.ID.PLACEHOLDER' | translate }}" />
+            				</div>
+            				<div class="form-group">
+            			   		<label for="nameField">{{'PROPERTY.FORMPROPERTIES.NAME' | translate}}</label>
+            			   		<input id="nameField" class="form-control" type="text" ng-model="selectedProperties[0].name" placeholder="{{'PROPERTY.FORMPROPERTIES.NAME.PLACEHOLDER' | translate }}" />
+            				</div>
+            				<div class="form-group">
+            			   		<label for="typeField">{{'PROPERTY.FORMPROPERTIES.TYPE' | translate}}</label>
+            			   		<select id="typeField" class="form-control" ng-model="selectedProperties[0].type" ng-change="propertyTypeChanged()">
+                                    <option>string</option>
+                                    <option>long</option>
+                                    <option>boolean</option>
+                                    <option>date</option>
+                                    <option>enum</option>
+                                </select>
+            				</div>
+                           	<div class="form-group" ng-show="selectedProperties[0].datePattern">
+            			   		<label for="datePatternField">{{'PROPERTY.FORMPROPERTIES.DATEPATTERN' | translate}}</label>
+            			   		<input id="datePatternField" class="form-control" type="text" ng-model="selectedProperties[0].datePattern" placeholder="{{'PROPERTY.FORMPROPERTIES.DATEPATTERN.PLACEHOLDER' | translate }}" />
+            				</div>
+                            <div class="form-group" ng-show="selectedProperties[0].enumValues">
+            			   		<label for="valueField">{{'PROPERTY.FORMPROPERTIES.VALUES' | translate}}</label>
+            			   		<div ng-repeat="enum in selectedProperties[0].enumValues">
+                                    <input id="valueField" class="form-control" type="text" ng-model="enum.value" />
+                                    <i class="glyphicon glyphicon-minus clickable-property" ng-click="removeEnumValue($index)"></i>
+                                    <i ng-if="$index == (selectedProperties[0].enumValues.length - 1)" class="glyphicon glyphicon-plus clickable-property" ng-click="addEnumValue($index)"></i>
+                                </div>
+            				</div>
+                            <div class="form-group">
+            			   		<label for="expressionField">{{'PROPERTY.FORMPROPERTIES.EXPRESSION' | translate}}</label>
+            			   		<input id="expressionField" class="form-control" type="text" ng-model="selectedProperties[0].expression" placeholder="{{'PROPERTY.FORMPROPERTIES.EXPRESSION.PLACEHOLDER' | translate }}" />
+            				</div>
+            				<div class="form-group">
+            			   		<label for="variableField">{{'PROPERTY.FORMPROPERTIES.VARIABLE' | translate}}</label>
+            			   		<input id="variableField" class="form-control" type="text" ng-model="selectedProperties[0].variable" placeholder="{{'PROPERTY.FORMPROPERTIES.VARIABLE.PLACEHOLDER' | translate }}" />
+            				</div>
+            				<div class="form-inline">
+            					<div class="form-group col-xs-2" >
+            				   		<label for="requiredField">{{'PROPERTY.FORMPROPERTIES.REQUIRED' | translate}}</label>
+            				   		<input id="requiredField" class="form-control" type="checkbox" ng-model="selectedProperties[0].required" />
+            				   	</div>
+            				   	<div class="form-group col-xs-2">
+            				   		<label for="readableField">{{'PROPERTY.FORMPROPERTIES.READABLE' | translate}}</label>
+            				   		<input id="readableField" class="form-control" type="checkbox" ng-model="selectedProperties[0].readable" />
+            					</div>
+            					<div class="form-group col-xs-2">
+            						<label for="writableField">{{'PROPERTY.FORMPROPERTIES.WRITABLE' | translate}}</label>
+            			   			<input id="writableField" class="form-control" type="checkbox" ng-model="selectedProperties[0].writable" />
+            					</div>
+            				</div>
+                        </div>
+                        <div ng-show="selectedProperties.length == 0" class="muted no-property-selected" translate>PROPERTY.FORMPROPERTIES.EMPTY</div>
+                    </div>
+                </div>
+            
+            </div>
+            <div class="modal-footer">
+                <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
+                <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 1 - 1
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/modeler/editor/editor-app/configuration/properties/event-listeners-write-template.html

@@ -1,4 +1,4 @@
 
 <!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
-<span ng-controller="FlowableEventListenersCtrl">
+<span ng-controller="KisBpmFormPropertiesCtrl">
 </span>

+ 3 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/in-parameters-display-template.html

@@ -0,0 +1,3 @@
+
+<span ng-if="!property.noValue">{{'PROPERTY.INPARAMETERS.VALUE' | translate:property.value.inParameters}}</span>
+<span ng-if="property.noValue" translate>PROPERTY.INPARAMETERS.EMPTY</span>

+ 53 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/in-parameters-popup.html

@@ -0,0 +1,53 @@
+
+<div class="modal" ng-controller="KisBpmInParametersPopupCtrl">
+    <div class="modal-dialog modal-wide">
+        <div class="modal-content">
+			<div class="modal-header">
+			    <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
+			    <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
+			</div>
+			<div class="modal-body">
+			
+			    <div class="row row-no-gutter">
+			        <div class="col-xs-6">
+			            <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
+			            <div class="pull-right">
+			                <div class="btn-group">
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.UP' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveParameterUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.DOWN' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveParameterDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
+			                </div>
+			                <div class="btn-group">
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.ADD' | translate:property}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewParameter()"><i class="glyphicon glyphicon-plus"></i></a>
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.REMOVE' | translate:property}}" data-placement="bottom" data-original-title="" title="" ng-click="removeParameter()"><i class="glyphicon glyphicon-minus"></i></a>
+			                </div>
+			            </div>
+			        </div>
+			
+			        <div class="col-xs-6">
+			            <div ng-show="selectedParameters.length > 0">
+							
+							<div class="form-group">
+						   		<label for="sourceField">{{'PROPERTY.PARAMETER.SOURCE' | translate}}</label>
+						   		<input type="text" id="sourceField" class="form-control" ng-model="selectedParameters[0].source" placeholder="{{'PROPERTY.PARAMETER.SOURCE.PLACEHOLDER' | translate}}" />
+							</div>
+							<div class="form-group">
+						   		<label for="expressionField">{{'PROPERTY.PARAMETER.SOURCEEXPRESSION' | translate}}</label>
+						   		<input type="text" id="expressionField" class="form-control" ng-model="selectedParameters[0].sourceExpression" placeholder="{{'PROPERTY.PARAMETER.SOURCEEXPRESSION.PLACEHOLDER' | translate}}" />
+							</div>
+							<div class="form-group">
+						   		<label for="expressionField">{{'PROPERTY.PARAMETER.TARGET' | translate}}</label>
+						   		<input type="text" id="expressionField" class="form-control" ng-model="selectedParameters[0].target" placeholder="{{'PROPERTY.PARAMETER.TARGET.PLACEHOLDER' | translate}}" />
+							</div>
+			                
+			            </div>
+			            <div ng-show="selectedParameters.length == 0" class="muted no-property-selected" translate>PROPERTY.PARAMETER.EMPTY</div>
+			        </div>
+			    </div>
+			</div>
+			<div class="modal-footer">
+			    <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
+			    <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
+			</div>
+		</div>
+	</div>
+</div>

+ 2 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/message-definitions-display-template.html

@@ -0,0 +1,2 @@
+<span ng-if="!property.noValue">{{'PROPERTY.MESSAGEDEFINITIONS.DISPLAY' | translate:property.value}}</span>
+<span ng-if="property.noValue" translate>PROPERTY.MESSAGEDEFINITIONS.EMPTY</span>

+ 50 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/message-definitions-popup.html

@@ -0,0 +1,50 @@
+
+<div class="modal" ng-controller="ActivitiMessageDefinitionsPopupCtrl">
+    <div class="modal-dialog modal-wide">
+        <div class="modal-content">
+
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
+                <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
+            </div>
+
+            <div class="modal-body">
+            
+                <div class="row row-no-gutter">
+
+                	<div class="col-xs-8">
+                        <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
+            	        <div class="pull-right">
+            	            <div class="btn-group">
+            	                <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.ADD | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewMessageDefinition()"><i class="glyphicon glyphicon-plus"></i></a>
+            	                <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.REMOVE | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeMessageDefinition()"><i class="glyphicon glyphicon-minus"></i></a>
+            	            </div>
+            	        </div>
+            		</div>
+
+                    <div class="col-xs-4" ng-show="selectedMessages && selectedMessages.length > 0">
+
+                        <div class="form-group">
+                            <label>{{'PROPERTY.MESSAGEDEFINITIONS.ID' | translate}}</label>
+                            <input type="text" class="form-control" ng-model="selectedMessages[0].id">
+                        </div>
+
+                        <div class="form-group">
+                            <label>{{'PROPERTY.MESSAGEDEFINITIONS.NAME' | translate}}</label>
+                            <input type="text" class="form-control" ng-model="selectedMessages[0].name">
+                        </div>
+
+                    </div>
+
+            	</div>
+            	
+            </div>
+
+            <div class="modal-footer">
+                <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
+                <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 3 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/message-definitions-write-template.html

@@ -0,0 +1,3 @@
+<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
+<span ng-controller="ActivitiMessageDefinitionsCtrl">
+</span>

+ 4 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/message-property-write-template.html

@@ -0,0 +1,4 @@
+<div ng-controller="ActivitiMessageRefCtrl">
+    <select ng-model="property.value" ng-change="messageChanged()" ng-options="messageDefinition.id as (messageDefinition.name + ' (' + messageDefinition.id + ')') for messageDefinition in messageDefinitions">
+    </select>
+</div>

+ 8 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/multiinstance-property-write-template.html

@@ -0,0 +1,8 @@
+
+<div ng-controller="KisBpmMultiInstanceCtrl">
+    <select ng-model="property.value" ng-change="multiInstanceChanged()">
+    	<option>None</option>
+    	<option>Parallel</option>
+    	<option>Sequential</option>
+    </select>
+</div>

+ 3 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/out-parameters-display-template.html

@@ -0,0 +1,3 @@
+
+<span ng-if="!property.noValue">{{'PROPERTY.OUTPARAMETERS.VALUE' | translate:property.value.outParameters}}</span>
+<span ng-if="property.noValue" translate>PROPERTY.OUTPARAMETERS.EMPTY</span>

+ 53 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/out-parameters-popup.html

@@ -0,0 +1,53 @@
+
+<div class="modal" ng-controller="KisBpmOutParametersPopupCtrl">
+    <div class="modal-dialog modal-wide">
+        <div class="modal-content">
+			<div class="modal-header">
+			    <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
+			    <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
+			</div>
+			<div class="modal-body">
+			
+			    <div class="row row-no-gutter">
+			        <div class="col-xs-6">
+			            <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
+			            <div class="pull-right">
+			                <div class="btn-group">
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.UP' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveParameterUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.DOWN' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveParameterDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
+			                </div>
+			                <div class="btn-group">
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.ADD' | translate:property}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewParameter()"><i class="glyphicon glyphicon-plus"></i></a>
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.REMOVE' | translate:property}}" data-placement="bottom" data-original-title="" title="" ng-click="removeParameter()"><i class="glyphicon glyphicon-minus"></i></a>
+			                </div>
+			            </div>
+			        </div>
+			
+			        <div class="col-xs-6">
+			            <div ng-show="selectedParameters.length > 0">
+							
+							<div class="form-group">
+						   		<label for="sourceField">{{'PROPERTY.PARAMETER.SOURCE' | translate}}</label>
+						   		<input type="text" id="sourceField" class="form-control" ng-model="selectedParameters[0].source" placeholder="{{'PROPERTY.PARAMETER.SOURCE.PLACEHOLDER' | translate}}" />
+							</div>
+							<div class="form-group">
+						   		<label for="expressionField">{{'PROPERTY.PARAMETER.SOURCEEXPRESSION' | translate}}</label>
+						   		<input type="text" id="expressionField" class="form-control" ng-model="selectedParameters[0].sourceExpression" placeholder="{{'PROPERTY.PARAMETER.SOURCEEXPRESSION.PLACEHOLDER' | translate}}" />
+							</div>
+							<div class="form-group">
+						   		<label for="expressionField">{{'PROPERTY.PARAMETER.TARGET' | translate}}</label>
+						   		<input type="text" id="expressionField" class="form-control" ng-model="selectedParameters[0].target" placeholder="{{'PROPERTY.PARAMETER.TARGET.PLACEHOLDER' | translate}}" />
+							</div>
+			                
+			            </div>
+			            <div ng-show="selectedParameters.length == 0" class="muted no-property-selected" translate>PROPERTY.PARAMETER.EMPTY</div>
+			        </div>
+			    </div>
+			</div>
+			<div class="modal-footer">
+			    <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
+			    <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
+			</div>
+		</div>
+	</div>
+</div>

+ 1 - 1
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/modeler/editor/editor-app/configuration/properties/duedate-write-template.html

@@ -1,4 +1,4 @@
 
 <!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
-<span ng-controller="BpmnEditorDueDateCtrl">
+<span ng-controller="KisBpmOutParametersCtrl">
 </span>

+ 3 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/sequenceflow-order-display-template.html

@@ -0,0 +1,3 @@
+
+<span ng-if="!property.noValue" translate>PROPERTY.SEQUENCEFLOW.ORDER.NOT.EMPTY</span>
+<span ng-if="property.noValue" translate>PROPERTY.SEQUENCEFLOW.ORDER.EMPTY</span>

+ 47 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/sequenceflow-order-popup.html

@@ -0,0 +1,47 @@
+
+<div class="modal" ng-controller="KisBpmSequenceFlowOrderPopupCtrl">
+    <div class="modal-dialog">
+        <div class="modal-content">
+			<div class="modal-header">
+			    <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
+			    <h3>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h3>
+			</div>
+			
+			<div class="modal-body">
+			
+			    <div translate>PROPERTY.SEQUENCEFLOW.ORDER.DESCRIPTION</div>
+			    <br/>
+			    <ol>
+			        <li class="sequence-flow-order-element" ng-repeat="sequenceFlow in outgoingSequenceFlow">
+			            {{'PROPERTY.SEQUENCEFLOW.ORDER.SEQUENCEFLOW.VALUE' | translate:sequenceFlow}}
+			            <a class="btn btn-icon btn-sm"
+			               rel="tooltip"
+			               data-title="{{'ACTION.MOVE.UP' | translate}}"
+			               data-placement="bottom"
+			               data-original-title="" title=""
+			               ng-click="moveUp($index)"
+			               ng-if="$index > 0">
+			                 <i class="glyphicon glyphicon-arrow-up"></i>
+			            </a>
+			            <a class="btn btn-icon btn-sm"
+			               rel="tooltip"
+			               data-title="{{'ACTION.MOVE.DOWN' | translate}}"
+			               data-placement="bottom"
+			               data-original-title=""
+			               title=""
+			               ng-click="moveDown($index)"
+			               ng-if="$index < outgoingSequenceFlow.length - 1">
+			                 <i class="glyphicon glyphicon-arrow-down"></i>
+			            </a>
+			        </li>
+			    </ol>
+			
+			
+			</div>
+			<div class="modal-footer">
+			    <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
+			    <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
+			</div>
+		</div>
+	</div>
+</div>

+ 4 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/sequenceflow-order-write-template.html

@@ -0,0 +1,4 @@
+
+<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
+<span ng-controller="KisBpmSequenceFlowOrderCtrl">
+</span>

+ 3 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/signal-definitions-display-template.html

@@ -0,0 +1,3 @@
+
+<span ng-if="!property.noValue">{{'PROPERTY.SIGNALDEFINITIONS.DISPLAY' | translate:property.value}}</span>
+<span ng-if="property.noValue" translate>PROPERTY.SIGNALDEFINITIONS.EMPTY</span>

+ 58 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/signal-definitions-popup.html

@@ -0,0 +1,58 @@
+
+<div class="modal" ng-controller="ActivitiSignalDefinitionsPopupCtrl">
+    <div class="modal-dialog modal-wide">
+        <div class="modal-content">
+
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
+                <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
+            </div>
+
+            <div class="modal-body">
+            
+                <div class="row row-no-gutter">
+
+                	<div class="col-xs-8">
+                        <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
+            	        <div class="pull-right">
+            	            <div class="btn-group">
+            	                <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.ADD | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewSignalDefinition()"><i class="glyphicon glyphicon-plus"></i></a>
+            	                <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.REMOVE | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeSignalDefinition()"><i class="glyphicon glyphicon-minus"></i></a>
+            	            </div>
+            	        </div>
+            		</div>
+
+                    <div class="col-xs-4" ng-show="selectedSignals && selectedSignals.length > 0">
+
+                        <div class="form-group">
+                            <label>{{'PROPERTY.SIGNALDEFINITIONS.ID' | translate}}</label>
+                            <input type="text" class="form-control" ng-model="selectedSignals[0].id">
+                        </div>
+
+                        <div class="form-group">
+                            <label>{{'PROPERTY.SIGNALDEFINITIONS.NAME' | translate}}</label>
+                            <input type="text" class="form-control" ng-model="selectedSignals[0].name">
+                        </div>
+
+                        <div class="form-group">
+                            <label>{{'PROPERTY.SIGNALDEFINITIONS.SCOPE' | translate}}</label>
+                            <select class="form-control" ng-model="selectedSignals[0].scope">
+                                <option value="global">{{'PROPERTY.SIGNALDEFINITIONS.SCOPE-GLOBAL' | translate}}</option>
+                                <option value="processInstance">{{'PROPERTY.SIGNALDEFINITIONS.SCOPE-PROCESSINSTANCE' | translate}}</option>
+                            </select>
+                        </div>
+
+                    </div>
+
+            	</div>
+            	
+            </div>
+
+            <div class="modal-footer">
+                <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
+                <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 4 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/signal-definitions-write-template.html

@@ -0,0 +1,4 @@
+
+<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
+<span ng-controller="ActivitiSignalDefinitionsCtrl">
+</span>

+ 4 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/signal-property-write-template.html

@@ -0,0 +1,4 @@
+<div ng-controller="ActivitiSignalRefCtrl">
+    <select ng-model="property.value" ng-change="signalChanged()" ng-options="signalDefinition.id as (signalDefinition.name + ' (' + signalDefinition.id + ')') for signalDefinition in signalDefinitions">
+    </select>
+</div>

+ 8 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/string-property-write-mode-template.html

@@ -0,0 +1,8 @@
+
+<div ng-controller="KisBpmStringPropertyCtrl">
+    <input type="text" ng-model="property.value"
+    	   class="form-control" 
+           auto-focus
+           ng-blur="inputBlurred()"
+           ng-keypress="enterPressed($event)"/>
+</div>

+ 43 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/subprocess-reference-popup.html

@@ -0,0 +1,43 @@
+
+<div class="modal" ng-controller="KisBpmCollapsedSubprocessReferencePopupCrtl">
+    <div class="modal-dialog modal-wide">
+        <div class="modal-content">
+			<div class="modal-header">
+			    <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
+			    <h2>
+			        {{'PROPERTY.SUBPROCESSREFERENCE.TITLE' | translate}}
+			        <span ng-show="selectedSubProcess != null"> - {{selectedSubProcess.name}}</span>
+			        <span ng-show="selectedSubProcess == null"> - {{'PROPERTY.SUBPROCESSREFERENCE.EMPTY' | translate}}</span> 
+			    
+			    </h2>
+			</div>
+			<div class="modal-body">
+			    <div class="detail-group clearfix">
+                    <div class="col-xs-12">
+			            <div class="alert alert-error" ng-show="(!state.loadingFolders && !state.loadingSubprocesses) && state.subprocessError" translate>PROPERTY.SUBPROCESSREFERENCE.ERROR.SUBPROCESS</div>
+			        </div>
+			    </div>
+			    <div class="detail-group clearfix">
+                    <div class="col-xs-12 editor-item-picker">
+			            <div ng-if="!state.loadingSubprocesses && !state.subprocessError" class="col-xs-4 editor-item-picker-component" ng-repeat="sub in subProcesses" ng-class="{'selected' : sub.id == selectedSubProcess.id}" ng-click="selectSubProcess(sub, $event)">
+			               <div class="controls">
+			                   <input type="checkbox" value="option1" ng-click="selectSubProcess(sub, $event)" ng-checked="sub.id == selectedSubProcess.id" />
+			               </div>
+			               <h4>{{sub.name}}</h4>
+			               <img src="{{config.contextRoot}}/app/rest/models/{{sub.id}}/thumbnail" />
+			             </div>
+			             <div ng-show="state.loadingSubprocesses">
+			               <p class="loading" translate>PROPERTY.SUBPROCESSREFERENCE.SUBPROCESS.LOADING</p>
+			             </div>
+			             <div ng-show="!state.loadingSubprocesses && subProcesses.length == 0">
+			                <p translate>PROPERTY.SUBPROCESSREFERENCE.SUBPROCESS.EMPTY</p>
+			             </div>
+			        </div>
+			    </div>
+			</div>
+			<div class="modal-footer">
+			    <button ng-disabled="state.subprocessError" ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
+			</div>
+		</div>
+	</div>
+</div>

+ 3 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/task-listeners-display-template.html

@@ -0,0 +1,3 @@
+
+<span ng-if="!property.noValue">{{'PROPERTY.TASKLISTENERS.VALUE' | translate:property.value.taskListeners}}</span>
+<span ng-if="property.noValue" translate>PROPERTY.TASKLISTENERS.EMPTY</span>

+ 102 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/task-listeners-popup.html

@@ -0,0 +1,102 @@
+
+<div class="modal" ng-controller="KisBpmTaskListenersPopupCtrl">
+    <div class="modal-dialog modal-wide">
+        <div class="modal-content">
+			<div class="modal-header">
+			    <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
+			    <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
+			</div>
+			<div class="modal-body">
+			
+			    <div class="row row-no-gutter">
+			        <div class="col-xs-6">
+			            <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
+			            <div class="pull-right">
+			                <div class="btn-group">
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.UP | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveListenerUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.DOWN | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveListenerDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
+			                </div>
+			                <div class="btn-group">
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.ADD | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewListener()"><i class="glyphicon glyphicon-plus"></i></a>
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.REMOVE | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeListener()"><i class="glyphicon glyphicon-minus"></i></a>
+			                </div>
+			            </div>
+			        </div>
+			
+			        <div class="col-xs-6">
+			            <div ng-show="selectedListeners.length > 0">
+			
+			                <div class="form-group">
+						   		<label for="eventField">{{'PROPERTY.TASKLISTENERS.EVENT' | translate}}</label>
+						   		<select id="eventField" class="form-control" ng-model="selectedListeners[0].event">
+			                        <option>create</option>
+			                        <option>assignment</option>
+			                        <option>complete</option>
+			                        <option>delete</option>
+			                    </select>
+							</div>
+							<div class="form-group">
+						   		<label for="classField">{{'PROPERTY.TASKLISTENERS.CLASS' | translate}}</label>
+						   		<input type="text" id="classField" class="form-control" ng-model="selectedListeners[0].className" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.TASKLISTENERS.CLASS.PLACEHOLDER' | translate}}" />
+							</div>
+							<div class="form-group">
+						   		<label for="expressionField">{{'PROPERTY.TASKLISTENERS.EXPRESSION' | translate}}</label>
+						   		<input type="text" id="expressionField" class="form-control" ng-model="selectedListeners[0].expression" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.TASKLISTENERS.EXPRESSION.PLACEHOLDER' | translate}}" />
+							</div>
+							<div class="form-group">
+						   		<label for="delegateExpressionField">{{'PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION' | translate}}</label>
+						   		<input type="text" id="delegateExpressionField" class="form-control" ng-model="selectedListeners[0].delegateExpression" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER' | translate}}" />
+							</div>
+			            </div>
+			            <div ng-show="selectedListeners.length == 0" class="muted no-property-selected" translate>PROPERTY.TASKLISTENERS.UNSELECTED</div>
+			        </div>
+			    </div>
+			    
+			    <div class="row row-no-gutter">
+			        <div class="col-xs-6">
+			            <div ng-if="translationsRetrieved" class="kis-field-grid" ng-grid="gridFieldOptions"></div>
+			            <div class="pull-right">
+			                <div class="btn-group">
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.UP | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveFieldUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.DOWN | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveFieldDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
+			                </div>
+			                <div class="btn-group">
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.ADD | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewField()"><i class="glyphicon glyphicon-plus"></i></a>
+			                    <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.REMOVE | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeField()"><i class="glyphicon glyphicon-minus"></i></a>
+			                </div>
+			            </div>
+			        </div>
+			
+			        <div class="col-xs-6">
+			            <div ng-show="selectedFields.length > 0">
+			
+							<div class="form-group">
+						   		<label for="nameField">{{'PROPERTY.TASKLISTENERS.FIELDS.NAME' | translate}}</label>
+						   		<input type="text" id="nameField" class="form-control" ng-model="selectedFields[0].name" placeholder="{{'PROPERTY.TASKLISTENERS.FIELDS.NAME.PLACEHOLDER' | translate}}" />
+							</div>
+			                <div class="form-group">
+						   		<label for="stringValueField">{{'PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE' | translate}}</label>
+						   		<input type="text" id="stringValueField" class="form-control" ng-model="selectedFields[0].stringValue" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER' | translate}}" />
+							</div>
+							<div class="form-group">
+						   		<label for="expressionField">{{'PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION' | translate}}</label>
+						   		<input type="text" id="expressionField" class="form-control" ng-model="selectedFields[0].expression" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER' | translate}}" />
+							</div>
+							<div class="form-group">
+						   		<label for="stringField">{{'PROPERTY.TASKLISTENERS.FIELDS.STRING' | translate}}</label>
+						   		<textarea id="stringField" class="form-control" ng-model="selectedFields[0].string" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.TASKLISTENERS.FIELDS.STRING.PLACEHOLDER' | translate}}"></textarea>
+							</div>
+			                
+			            </div>
+			            <div ng-show="selectedFields.length == 0" class="muted no-property-selected"translate>PROPERTY.TASKLISTENERS.FIELDS.EMPTY</div>
+			        </div>
+			    </div>
+			
+			</div>
+			<div class="modal-footer">
+			    <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
+			    <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
+			</div>
+		</div>
+	</div>
+</div>

+ 1 - 1
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/modeler/editor/editor-app/configuration/properties/fields-write-template.html

@@ -1,4 +1,4 @@
 
 <!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
-<span ng-controller="FlowableFieldsCtrl">
+<span ng-controller="KisBpmTaskListenersCtrl">
 </span>

+ 17 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/properties/text-popup.html

@@ -0,0 +1,17 @@
+
+<div class="modal" ng-controller="KisBpmTextPropertyPopupCtrl">
+    <div class="modal-dialog">
+        <div class="modal-content">
+			<div class="modal-header">
+				<button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
+			    <h3>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h3>
+			</div>
+			<div class="modal-body">
+				<p><textarea auto-focus class="form-control" ng-model="property.value" style="width:70%; height:100%; max-width: 100%; max-height: 100%; min-height: 200px"/></p>
+			</div>
+			<div class="modal-footer">
+				<button ng-click="save()" class="btn btn-primary" translate >ACTION.SAVE</button>
+			</div>
+		</div>
+	</div>
+</div>

+ 1 - 1
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/modeler/editor/editor-app/configuration/properties/assignment-write-template.html

@@ -1,4 +1,4 @@
 
 <!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
-<span ng-controller="FlowableAssignmentCtrl">
+<span ng-controller="KisBpmTextPropertyCtrl">
 </span>

+ 18 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/toolbar-custom-actions.js

@@ -0,0 +1,18 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */

+ 429 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/toolbar-default-actions.js

@@ -0,0 +1,429 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+'use strict';
+
+var KISBPM = KISBPM || {};
+KISBPM.TOOLBAR = {
+    ACTIONS: {
+
+        saveModel: function (services) {
+
+            var modal = services.$modal({
+                backdrop: true,
+                keyboard: true,
+                template: 'editor-app/popups/save-model.html?version=' + Date.now(),
+                scope: services.$scope
+            });
+        },
+
+        undo: function (services) {
+
+            // Get the last commands
+            var lastCommands = services.$scope.undoStack.pop();
+
+            if (lastCommands) {
+                // Add the commands to the redo stack
+                services.$scope.redoStack.push(lastCommands);
+
+                // Force refresh of selection, might be that the undo command
+                // impacts properties in the selected item
+                if (services.$rootScope && services.$rootScope.forceSelectionRefresh) 
+                {
+                	services.$rootScope.forceSelectionRefresh = true;
+                }
+                
+                // Rollback every command
+                for (var i = lastCommands.length - 1; i >= 0; --i) {
+                    lastCommands[i].rollback();
+                }
+                
+                // Update and refresh the canvas
+                services.$scope.editor.handleEvents({
+                    type: ORYX.CONFIG.EVENT_UNDO_ROLLBACK,
+                    commands: lastCommands
+                });
+                
+                // Update
+                services.$scope.editor.getCanvas().update();
+                services.$scope.editor.updateSelection();
+            }
+            
+            var toggleUndo = false;
+            if (services.$scope.undoStack.length == 0)
+            {
+            	toggleUndo = true;
+            }
+            
+            var toggleRedo = false;
+            if (services.$scope.redoStack.length > 0)
+            {
+            	toggleRedo = true;
+            }
+
+            if (toggleUndo || toggleRedo) {
+                for (var i = 0; i < services.$scope.items.length; i++) {
+                    var item = services.$scope.items[i];
+                    if (toggleUndo && item.action === 'KISBPM.TOOLBAR.ACTIONS.undo') {
+                        services.$scope.safeApply(function () {
+                            item.enabled = false;
+                        });
+                    }
+                    else if (toggleRedo && item.action === 'KISBPM.TOOLBAR.ACTIONS.redo') {
+                        services.$scope.safeApply(function () {
+                            item.enabled = true;
+                        });
+                    }
+                }
+            }
+        },
+
+        redo: function (services) {
+
+            // Get the last commands from the redo stack
+            var lastCommands = services.$scope.redoStack.pop();
+
+            if (lastCommands) {
+                // Add this commands to the undo stack
+                services.$scope.undoStack.push(lastCommands);
+                
+                // Force refresh of selection, might be that the redo command
+                // impacts properties in the selected item
+                if (services.$rootScope && services.$rootScope.forceSelectionRefresh) 
+                {
+                	services.$rootScope.forceSelectionRefresh = true;
+                }
+
+                // Execute those commands
+                lastCommands.each(function (command) {
+                    command.execute();
+                });
+
+                // Update and refresh the canvas
+                services.$scope.editor.handleEvents({
+                    type: ORYX.CONFIG.EVENT_UNDO_EXECUTE,
+                    commands: lastCommands
+                });
+
+                // Update
+                services.$scope.editor.getCanvas().update();
+                services.$scope.editor.updateSelection();
+            }
+
+            var toggleUndo = false;
+            if (services.$scope.undoStack.length > 0) {
+                toggleUndo = true;
+            }
+
+            var toggleRedo = false;
+            if (services.$scope.redoStack.length == 0) {
+                toggleRedo = true;
+            }
+
+            if (toggleUndo || toggleRedo) {
+                for (var i = 0; i < services.$scope.items.length; i++) {
+                    var item = services.$scope.items[i];
+                    if (toggleUndo && item.action === 'KISBPM.TOOLBAR.ACTIONS.undo') {
+                        services.$scope.safeApply(function () {
+                            item.enabled = true;
+                        });
+                    }
+                    else if (toggleRedo && item.action === 'KISBPM.TOOLBAR.ACTIONS.redo') {
+                        services.$scope.safeApply(function () {
+                            item.enabled = false;
+                        });
+                    }
+                }
+            }
+        },
+
+        cut: function (services) {
+            KISBPM.TOOLBAR.ACTIONS._getOryxEditPlugin(services.$scope).editCut();
+            for (var i = 0; i < services.$scope.items.length; i++) {
+                var item = services.$scope.items[i];
+                if (item.action === 'KISBPM.TOOLBAR.ACTIONS.paste') {
+                    services.$scope.safeApply(function () {
+                        item.enabled = true;
+                    });
+                }
+            }
+        },
+
+        copy: function (services) {
+            KISBPM.TOOLBAR.ACTIONS._getOryxEditPlugin(services.$scope).editCopy();
+            for (var i = 0; i < services.$scope.items.length; i++) {
+                var item = services.$scope.items[i];
+                if (item.action === 'KISBPM.TOOLBAR.ACTIONS.paste') {
+                    services.$scope.safeApply(function () {
+                        item.enabled = true;
+                    });
+                }
+            }
+        },
+
+        paste: function (services) {
+            KISBPM.TOOLBAR.ACTIONS._getOryxEditPlugin(services.$scope).editPaste();
+        },
+
+        deleteItem: function (services) {
+            KISBPM.TOOLBAR.ACTIONS._getOryxEditPlugin(services.$scope).editDelete();
+        },
+
+        addBendPoint: function (services) {
+
+            var dockerPlugin = KISBPM.TOOLBAR.ACTIONS._getOryxDockerPlugin(services.$scope);
+
+            var enableAdd = !dockerPlugin.enabledAdd();
+            dockerPlugin.setEnableAdd(enableAdd);
+            if (enableAdd)
+            {
+            	dockerPlugin.setEnableRemove(false);
+            	document.body.style.cursor = 'pointer';
+            }
+            else
+            {
+            	document.body.style.cursor = 'default';
+            }
+        },
+
+        removeBendPoint: function (services) {
+
+            var dockerPlugin = KISBPM.TOOLBAR.ACTIONS._getOryxDockerPlugin(services.$scope);
+
+            var enableRemove = !dockerPlugin.enabledRemove();
+            dockerPlugin.setEnableRemove(enableRemove);
+            if (enableRemove)
+            {
+            	dockerPlugin.setEnableAdd(false);
+            	document.body.style.cursor = 'pointer';
+            }
+            else
+            {
+            	document.body.style.cursor = 'default';
+            }
+        },
+
+        /**
+         * Helper method: fetches the Oryx Edit plugin from the provided scope,
+         * if not on the scope, it is created and put on the scope for further use.
+         *
+         * It's important to reuse the same EditPlugin while the same scope is active,
+         * as the clipboard is stored for the whole lifetime of the scope.
+         */
+        _getOryxEditPlugin: function ($scope) {
+            if ($scope.oryxEditPlugin === undefined || $scope.oryxEditPlugin === null) {
+                $scope.oryxEditPlugin = new ORYX.Plugins.Edit($scope.editor);
+            }
+            return $scope.oryxEditPlugin;
+        },
+
+        zoomIn: function (services) {
+            KISBPM.TOOLBAR.ACTIONS._getOryxViewPlugin(services.$scope).zoom([1.0 + ORYX.CONFIG.ZOOM_OFFSET]);
+        },
+
+        zoomOut: function (services) {
+            KISBPM.TOOLBAR.ACTIONS._getOryxViewPlugin(services.$scope).zoom([1.0 - ORYX.CONFIG.ZOOM_OFFSET]);
+        },
+        
+        zoomActual: function (services) {
+            KISBPM.TOOLBAR.ACTIONS._getOryxViewPlugin(services.$scope).setAFixZoomLevel(1);
+        },
+        
+        zoomFit: function (services) {
+        	KISBPM.TOOLBAR.ACTIONS._getOryxViewPlugin(services.$scope).zoomFitToModel();
+        },
+        
+        alignVertical: function (services) {
+        	KISBPM.TOOLBAR.ACTIONS._getOryxArrangmentPlugin(services.$scope).alignShapes([ORYX.CONFIG.EDITOR_ALIGN_MIDDLE]);
+        },
+        
+        alignHorizontal: function (services) {
+        	KISBPM.TOOLBAR.ACTIONS._getOryxArrangmentPlugin(services.$scope).alignShapes([ORYX.CONFIG.EDITOR_ALIGN_CENTER]);
+        },
+        
+        sameSize: function (services) {
+        	KISBPM.TOOLBAR.ACTIONS._getOryxArrangmentPlugin(services.$scope).alignShapes([ORYX.CONFIG.EDITOR_ALIGN_SIZE]);
+        },
+        
+        closeEditor: function(services) {
+        	window.location.href = "./bpm/model/index";
+        },
+        
+        /**
+         * Helper method: fetches the Oryx View plugin from the provided scope,
+         * if not on the scope, it is created and put on the scope for further use.
+         */
+        _getOryxViewPlugin: function ($scope) {
+            if ($scope.oryxViewPlugin === undefined || $scope.oryxViewPlugin === null) {
+                $scope.oryxViewPlugin = new ORYX.Plugins.View($scope.editor);
+            }
+            return $scope.oryxViewPlugin;
+        },
+        
+        _getOryxArrangmentPlugin: function ($scope) {
+            if ($scope.oryxArrangmentPlugin === undefined || $scope.oryxArrangmentPlugin === null) {
+                $scope.oryxArrangmentPlugin = new ORYX.Plugins.Arrangement($scope.editor);
+            }
+            return $scope.oryxArrangmentPlugin;
+        },
+
+        _getOryxDockerPlugin: function ($scope) {
+            if ($scope.oryxDockerPlugin === undefined || $scope.oryxDockerPlugin === null) {
+                $scope.oryxDockerPlugin = new ORYX.Plugins.AddDocker($scope.editor);
+            }
+            return $scope.oryxDockerPlugin;
+        }
+    }
+};
+
+/** Custom controller for the save dialog */
+var SaveModelCtrl = [ '$rootScope', '$scope', '$http', '$route', '$location',
+    function ($rootScope, $scope, $http, $route, $location) {
+
+    var modelMetaData = $scope.editor.getModelMetaData();
+
+    var description = '';
+    if (modelMetaData.description) {
+    	description = modelMetaData.description;
+    }
+    
+    var saveDialog = { 'name' : modelMetaData.name,
+            'description' : description};
+    
+    $scope.saveDialog = saveDialog;
+    
+    var json = $scope.editor.getJSON();
+    json = JSON.stringify(json);
+
+    var params = {
+        modeltype: modelMetaData.model.modelType,
+        json_xml: json,
+        name: 'model'
+    };
+
+    $scope.status = {
+        loading: false
+    };
+
+    $scope.close = function () {
+    	$scope.$hide();
+    };
+
+    $scope.saveAndClose = function () {
+    	$scope.save(function() {
+    		window.location.href = "./bpm/model/index";
+    	});
+    };
+    $scope.save = function (successCallback) {
+
+        if (!$scope.saveDialog.name || $scope.saveDialog.name.length == 0) {
+            return;
+        }
+
+        // Indicator spinner image
+        $scope.status = {
+        	loading: true
+        };
+        
+        modelMetaData.name = $scope.saveDialog.name;
+        modelMetaData.description = $scope.saveDialog.description;
+
+        var json = $scope.editor.getJSON();
+        json = JSON.stringify(json);
+        
+        var selection = $scope.editor.getSelection();
+        $scope.editor.setSelection([]);
+        
+        // Get the serialized svg image source
+        var svgClone = $scope.editor.getCanvas().getSVGRepresentation(true);
+        $scope.editor.setSelection(selection);
+        if ($scope.editor.getCanvas().properties["oryx-showstripableelements"] === false) {
+            var stripOutArray = jQuery(svgClone).find(".stripable-element");
+            for (var i = stripOutArray.length - 1; i >= 0; i--) {
+            	stripOutArray[i].remove();
+            }
+        }
+
+        // Remove all forced stripable elements
+        var stripOutArray = jQuery(svgClone).find(".stripable-element-force");
+        for (var i = stripOutArray.length - 1; i >= 0; i--) {
+            stripOutArray[i].remove();
+        }
+
+        // Parse dom to string
+        var svgDOM = DataManager.serialize(svgClone);
+
+        var params = {
+            json_xml: json,
+            svg_xml: svgDOM,
+            name: $scope.saveDialog.name,
+            description: $scope.saveDialog.description
+        };
+
+        // Update
+        $http({    method: 'PUT',
+            data: params,
+            ignoreErrors: true,
+            headers: {'Accept': 'application/json',
+                      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
+            transformRequest: function (obj) {
+                var str = [];
+                for (var p in obj) {
+                    str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
+                }
+                return str.join("&");
+            },
+            url: KISBPM.URL.putModel(modelMetaData.modelId)})
+
+            .success(function (data, status, headers, config) {
+                $scope.editor.handleEvents({
+                    type: ORYX.CONFIG.EVENT_SAVED
+                });
+                $scope.modelData.name = $scope.saveDialog.name;
+                $scope.modelData.lastUpdated = data.lastUpdated;
+                
+                $scope.status.loading = false;
+                $scope.$hide();
+
+                // Fire event to all who is listening
+                var saveEvent = {
+                    type: KISBPM.eventBus.EVENT_TYPE_MODEL_SAVED,
+                    model: params,
+                    modelId: modelMetaData.modelId,
+		            eventType: 'update-model'
+                };
+                KISBPM.eventBus.dispatch(KISBPM.eventBus.EVENT_TYPE_MODEL_SAVED, saveEvent);
+
+                // Reset state
+                $scope.error = undefined;
+                $scope.status.loading = false;
+
+                // Execute any callback
+                if (successCallback) {
+                    successCallback();
+                }
+
+            })
+            .error(function (data, status, headers, config) {
+                $scope.error = {};
+                console.log('Something went wrong when updating the process model:' + JSON.stringify(data));
+                $scope.status.loading = false;
+            });
+    };
+
+}];

+ 175 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/toolbar.js

@@ -0,0 +1,175 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+'use strict';
+
+var KISBPM = KISBPM || {};
+KISBPM.TOOLBAR_CONFIG = {
+    "items" : [
+        {
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.SAVE",
+            "cssClass" : "editor-icon editor-icon-save",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.saveModel"
+        },
+        {
+            "type" : "separator",
+            "title" : "",
+            "cssClass" : "toolbar-separator"
+        },
+        {
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.CUT",
+            "cssClass" : "editor-icon editor-icon-cut",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.cut",
+            "enabled" : false,
+            "enabledAction" : "element"
+        },
+        {
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.COPY",
+            "cssClass" : "editor-icon editor-icon-copy",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.copy",
+            "enabled" : false,
+            "enabledAction" : "element"
+        },
+        {
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.PASTE",
+            "cssClass" : "editor-icon editor-icon-paste",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.paste",
+            "enabled" : false
+        },
+        {
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.DELETE",
+            "cssClass" : "editor-icon editor-icon-delete",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.deleteItem",
+            "enabled" : false,
+            "enabledAction" : "element"
+        },
+        {
+            "type" : "separator",
+            "title" : "TOOLBAR.ACTION.SAVE",
+            "cssClass" : "toolbar-separator"
+        },
+        {
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.REDO",
+            "cssClass" : "editor-icon editor-icon-redo",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.redo",
+            "enabled" : false
+        },
+        {
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.UNDO",
+            "cssClass" : "editor-icon editor-icon-undo",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.undo",
+            "enabled" : false
+        },
+        {
+            "type" : "separator",
+            "title" : "TOOLBAR.ACTION.SAVE",
+            "cssClass" : "toolbar-separator"
+        },
+        {
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.ALIGNVERTICAL",
+            "cssClass" : "editor-icon editor-icon-align-vertical",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.alignVertical",
+            "enabled" : false,
+            "enabledAction" : "element",
+            "minSelectionCount" : 2
+        },
+        {
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.ALIGNHORIZONTAL",
+            "cssClass" : "editor-icon editor-icon-align-horizontal",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.alignHorizontal",
+            "enabledAction" : "element",
+            "enabled" : false,
+            "minSelectionCount" : 2
+        },
+        {
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.SAMESIZE",
+            "cssClass" : "editor-icon editor-icon-same-size",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.sameSize",
+            "enabledAction" : "element",
+            "enabled" : false,
+            "minSelectionCount" : 2
+        },
+        {
+        	"type" : "separator",
+        	"title" : "TOOLBAR.ACTION.SAVE",
+        	"cssClass" : "toolbar-separator"
+        },
+        {
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.ZOOMIN",
+            "cssClass" : "editor-icon editor-icon-zoom-in",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.zoomIn"
+        },
+        {
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.ZOOMOUT",
+            "cssClass" : "editor-icon editor-icon-zoom-out",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.zoomOut"
+        },
+        {
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.ZOOMACTUAL",
+            "cssClass" : "editor-icon editor-icon-zoom-actual",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.zoomActual"
+        },
+        {
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.ZOOMFIT",
+            "cssClass" : "editor-icon editor-icon-zoom-fit",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.zoomFit"
+        },
+        {
+            "type" : "separator",
+            "title" : "TOOLBAR.ACTION.SAVE",
+            "cssClass" : "toolbar-separator"
+        },
+    	{
+            "type" : "button",
+            "title" : "TOOLBAR.ACTION.BENDPOINT.ADD",
+            "cssClass" : "editor-icon editor-icon-bendpoint-add",
+            "action" : "KISBPM.TOOLBAR.ACTIONS.addBendPoint",
+            "id" : "add-bendpoint-button"
+    	},
+    	{
+    	    "type" : "button",
+    	    "title" : "TOOLBAR.ACTION.BENDPOINT.REMOVE",
+    	    "cssClass" : "editor-icon editor-icon-bendpoint-remove",
+    	    "action" : "KISBPM.TOOLBAR.ACTIONS.removeBendPoint",
+    	    "id" : "remove-bendpoint-button"
+    	}
+    ],
+    
+    "secondaryItems" : [
+		{
+		    "type" : "button",
+		    "title" : "Close",
+		    "cssClass" : "editor-icon editor-icon-close",
+		    "action" : "KISBPM.TOOLBAR.ACTIONS.closeEditor"
+		}
+    ]
+};

+ 34 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/configuration/url-config.js

@@ -0,0 +1,34 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+var KISBPM = KISBPM || {};
+
+KISBPM.URL = {
+
+    getModel: function(modelId) {
+        return ACTIVITI.CONFIG.contextRoot + '/model/' + modelId + '/json';
+    },
+
+    getStencilSet: function() {
+        return ACTIVITI.CONFIG.contextRoot + '/editor/stencilset?version=' + Date.now();
+    },
+
+    putModel: function(modelId) {
+        return ACTIVITI.CONFIG.contextRoot + '/model/' + modelId + '/save';
+    }
+};

Datei-Diff unterdrückt, da er zu groß ist
+ 1518 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/css/style-common.css


+ 639 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/css/style-editor.css

@@ -0,0 +1,639 @@
+/**
+ Colors:
+ 
+  - Header: #333333
+  - Subheader: #e8edf1
+  - Subheader border: #a4acb9
+  - Highlight buttons/text: #36a7c4
+  - Text color: #1a1a1a
+  - Filter color: #373e48
+  - Dark highlight: #606b7d
+
+ */
+.container-fluid {
+	max-width: 1400px;
+	min-width: 1000px;
+	margin: 0 auto;
+}
+
+.subtle-select .glyphicon {
+    visibility: hidden;
+    padding-left: 5px;
+}
+
+a.subtle-select:hover .glyphicon {
+    visibility: visible;
+}
+
+.full {
+	padding: 0 15px;
+	width: 100%;
+}
+
+.inline {
+    display: inline;
+}
+
+.greyish {
+    color: #afafaf;
+}
+
+.roweditor-canvas {
+    margin-top: 50px;
+}
+
+.no-pad {
+	margin: 0;
+	max-width: 1300px;
+    min-width: 1100px;
+}
+
+.content.no-pad {
+    max-width: 100%;
+    min-width: 100%;
+}
+
+.inset .col-sm-3 {
+    margin-left: -15px;
+}
+.no-pad > div{
+	padding: 0;
+}
+
+
+.dropdown-toggle .icon-caret-down {
+	padding-left: 10px;
+	font-size: 85%;
+}
+
+h1 {
+	margin: 0 0 0 15px;
+	padding: 0;
+	font-size: 22px;
+	line-height: 40px;
+	border: none;
+	color: #ffffff;
+	font-family: 'Lato', sans-serif; 
+}
+
+.truncate, .truncate > span {
+  white-space: nowrap;
+  width: 100%;                   
+  overflow: hidden; 
+  text-overflow: ellipsis;
+}
+
+.subheader .details .counter {
+	top: -1px;
+	line-height: 1;
+	display: inline-block;
+	padding: 2px 6px;
+	min-width: 20px;
+	background-color: #e8edf1;
+	color: #333333;
+}
+
+.subheader .subtle-select {
+	margin: -6px 0 0 -8px;
+}
+
+.btn .icon-and-label {
+	padding-right: 5px;
+} 
+
+.dropdown-menu .title {
+	margin: 5px 10px 0px 10px;
+	font-size: 17px;
+	min-width: 250px;
+}
+
+.dropdown-menu ul {
+	list-style: none;
+	list-style-position: inside;
+	padding: 5px 10px;
+}
+
+.input-group-addon {
+	background-color: transparent;
+}
+
+/* List Filter */
+.filter-wrapper {
+	min-height: 400px;
+	margin-top: 10px;
+    margin-left: -15px;
+}
+
+ul.filter-list {
+	list-style: none;
+	list-style-position: inside;
+	padding-left: 0px;
+	padding-top: 10px;
+}
+
+ul.filter-list li a {
+	display: block;
+	color: #373e48;
+	font-size: 17px;
+	margin: 10px 5px 10px 0px;
+	padding-left: 10px;
+}
+
+ul.filter-list li.current a {
+	color: #36a7c4;
+	padding-left: 5px;
+	border-left: 4px solid #36a7c4;
+}
+
+ul.filter-list li a:hover, ul.filter-list li a:focus {
+	text-decoration: none;
+	background-color: #e8edf1;
+}
+
+ul.filter-list li.current a:hover, ul.filter-list li.current a:focus {
+	background-color: transparent;
+	color: #36a7c4;
+	cursor: default;
+	text-decoration: none;
+}
+
+
+/* Result items */
+
+
+.item-wrapper {
+	padding-left: 0;
+	margin-top: 5px;
+}
+
+.item-wrapper .message {
+	text-align: left;
+	margin-left: 5px;
+	line-height: 40px;
+	color: #606b7d;
+}
+.item-wrapper .message span {
+	font-size: 14px;	
+}
+
+.item-wrapper .item {
+	width: 25%;
+	padding: 0;
+	margin: 0;
+	float: left;
+}
+
+.item-wrapper .item .btn-default.disabled, 
+.item-wrapper .item .btn-default[disabled],
+.item-wrapper .item .btn-default[disabled]:active,
+.item-wrapper .item .btn-default[disabled]:hover {
+	border-color: #ffffff;
+	cursor: default;	
+}
+
+.item-wrapper .item .item-box {
+	margin: 5px;
+	border: 1px solid #e8edf1;
+	height: 250px;
+	overflow: hidden;
+	cursor: pointer;
+	background-repeat: no-repeat;
+	background-position: center 20px;
+	background-size: auto;
+    position: relative;
+}
+
+.item-box .details {
+    position: relative;
+	background-color: #e8edf1;
+	height: 160px;
+	margin-top: 120px;
+	padding: 5px;
+	color: #373e48;
+	font-size: 13px;
+	
+	transition: margin-top .5s ease;
+	-moz-transition: margin-top .5s ease;
+	-webkit-transition: margin-top .5s ease;
+	-o-transition: margin-top .5s ease;
+}
+
+.item-box:hover .details, .item-box.active .details {
+	margin-top: 50px;
+}
+
+.item-box .actions {
+	padding: 5px;
+	height: 45px;
+}
+
+.item-box .actions .btn-group {
+	visibility: hidden;
+}
+
+.item-box:hover .actions .btn-group, .item-box.active .actions .btn-group {
+	visibility: inherit;
+}
+
+
+.item-box .details h3 {
+	font-size: 14px;
+	margin: 0;
+	padding: 2px;
+	color: #373e48;
+}
+
+.item-box .details span {
+	display: block;
+	margin-top: 5px;
+}
+
+.item-box .details span i {
+	padding-right: 10px;
+	padding-left: 5px;
+}
+
+.item-box .details .basic-details {
+	min-height: 60px;
+}
+
+.item-box .details p {
+	width: 100%;
+	height: 70px;
+	font-size: 12px;
+	overflow: hidden;
+}
+
+.create-inline {
+	padding: 100px 20px 80px 20px;
+	border: 1px solid #e8edf1;
+}
+.create-inline span {
+	display: block;
+	font-size: 18px;
+	color: #1a1a1a;
+	text-align: center;
+	margin-bottom: 20px;
+} 
+
+.create-inline .glyphicon {
+	margin-right: 10px;
+}
+
+.show-more {
+	clear: both;
+	height: 50px;
+	text-align: center;
+	padding-top: 5px;
+	margin: 5px;
+}
+
+.show-more a {
+	display: block;
+	padding: 5px;
+	font-size: 15px;
+	text-decoration: none;
+	cursor: pointer;
+	color: #666666;
+}
+
+.show-more a:hover {
+	color: #1a1a1a;
+	background: #e8edf1;
+}
+
+.content-canvas-wrapper {
+    -moz-box-shadow:    inset  0  3px 3px -4px #ababab;
+    -webkit-box-shadow: inset  0  3px 3px -4px #ababab;
+    box-shadow:        inset  0  3px 3px -4px #ababab;
+    margin: 15px 7px 0 7px;
+    z-index: 0;
+}
+.content-canvas {
+    background-color: #f9f9f9;
+    margin: 0 3px 0 3px;
+
+    -moz-box-shadow:    inset  0  3px 3px -4px #ababab;
+    -webkit-box-shadow: inset  0  3px 3px -4px #ababab;
+    box-shadow:        inset  0  3px 3px -4px #ababab;
+
+    padding: 20px;
+}
+
+
+.content-canvas h3 {
+    margin-bottom: 5px;
+}
+
+.content-canvas .no-results{
+    color: #999999;
+    font-size: 16px;
+    margin: 10px 0px;
+}
+
+.content-canvas .item-wrapper {
+    margin: 5px 10px;
+}
+
+/* History */
+table.history {
+	margin: 0;
+	padding: 0;
+}
+
+.subheader table.history {
+	min-width: 250px;	
+}
+
+table.history td {
+	vertical-align: middle;	
+}
+
+table.history tr td:last-child {
+	width: 90%;
+}
+
+table.history tr:hover {
+	background-color: #f3f6f8;
+	cursor: pointer;
+}
+table.history tr.current:hover {
+	background-color: #e8edf1;
+	cursor: inherit;
+}
+
+
+table.history a:hover {
+	text-decoration: none;
+	
+}
+
+table.history .version {
+	font-size: 30px;
+	display: inline-block;
+	color: #36a7c4;
+	padding: 5px 10px;
+	vertical-align:middle;
+	color: #36a7c4;
+}
+
+table.history .detail {
+	padding: 5px 5px;
+	font-size: 15px;
+	color: #1a1a1a;
+	display: inline-block;
+}
+
+table.history tr.current {
+	font-weight: bold;
+	background-color: #e8edf1;
+}
+table.history tr.current td {
+	background-color: #e8edf1;
+}
+
+.comments {
+	clear: both;
+	width: 350px;
+	border-top: 1px solid #eeeeee;
+	margin-top: 5px;
+	max-height: 350px;
+	overflow: auto;	
+}
+
+.comment {
+	margin: 10px 0px 20px 0px;	
+	font-size: 12px;
+}
+
+.comment .date {
+	color: #999999;
+	font-size: 12px;
+}
+
+.comment .author {
+	color: #36a7c4;
+	font-size: 18px;
+}
+
+.comment p {
+	 word-wrap: break-word;
+}
+
+.modal.modal-wide .modal-dialog {
+	width: 1000px;	
+}
+
+.modal-dialog.modal-wide {
+    width: 1000px;  
+}
+
+.modal-body p {
+	font-size: 15px;
+}
+
+.modal-body p.danger {
+	color: #d35f5f;
+	margin-top: 10px;
+}
+
+.form-group .inline-help {
+    font-size: 11px;
+    color: #666666;
+    margin-top: 5px;
+}
+
+.form-group .message {
+    color: #1a1a1a;
+    font-size: 14px;
+}
+
+.people-select > .selection {
+    width: 100%;
+    text-align: left;
+}
+.popup-wrapper .people-select {
+    max-height: 160px;
+}
+
+.people-select .nothing-to-see {
+    padding: 5px 0;
+
+    color: #999999;
+}
+
+.inline-people-select {
+    max-height: 120px;
+    overflow: auto;
+}
+
+/** Center tabbed pane */
+.center-pane {
+    overflow: auto;
+    padding-bottom: 20px;
+}
+
+.center-pane .content {
+    overflow: hidden;
+}
+.center-pane .tab-actions {
+    padding: 8px;
+}
+
+.center-pane .tabs-wrapper > .pull-right {
+    margin-right: 5px;
+}
+.center-pane .content {
+    padding: 10px;
+}
+
+.center-pane.content {
+    padding: 0;
+}
+
+.center-pane .content .tabs, .center-pane.content .tabs {
+    padding-left: 15px;
+}
+
+.center-pane .content .tabs > li a, .center-pane.content .tabs > li a {
+    padding: 8px 30px;
+}
+
+.center-pane .header h1 {
+    font-size: 30px;
+    margin: 0;
+    padding:0;
+}
+
+.center-pane .header h2 {
+    font-size: 24px;
+    margin: 0 0 5px 0;
+    padding:0;
+}
+
+.center-pane .header {
+    padding: 5px 10px 25px 10px;
+}
+
+
+.center-pane .header.compact {
+    padding-bottom: 5px;
+}
+
+.center-pane .well {
+    -moz-border-radius: 0px;
+    -webkit-border-radius: px;
+    border-radius: 0px;
+    background-color: #f9f9f9;
+    padding: 12px 10px;
+    margin: 15px 0 0 0;
+    border: 1px solid #eeeeee;
+}
+
+/** General button styling */
+.btn.btn-clean {
+    border: none;
+    background-color: transparent;
+    font-size: 24px;
+    padding: 2px 6px;
+    color: #444444;
+
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+}
+
+.btn-clean:hover .icon-remove {
+    color: #a02828;
+}
+
+.btn-clean:focus, .btn-clean:hover {
+    color: #5f8dd3;
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+}
+
+
+.btn-clean:active {
+    color: #2c5aa0;
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+}
+
+/* Show list in popup */
+
+ul.list {
+    list-style: none inside;
+    padding: 0px;
+    margin-bottom: 3px;
+}
+
+ul.list>li {
+    line-height: 30px;
+    margin: 0;
+    padding: 4px;
+    cursor: pointer;
+}
+
+.popup-wrapper ul.list>li {
+    border-top: 1px solid #eeeeee;
+}
+
+.popup-wrapper ul.list>li:last-child {
+    border-bottom: 1px solid #eeeeee;
+}
+
+ul.list>li:hover, ul.list>li.active {
+    background-color: #f2f2f2;
+}
+
+ul.list >li .actions {
+    float:right;
+    margin: 0px 0px 0px 5px;
+    visibility: hidden;
+}
+
+ul.list>li:hover .actions {
+    visibility: inherit;
+}
+
+/** Animations **/
+.fadein.ng-enter, 
+.fadein.ng-move {
+  -webkit-transition: 0.5s linear opacity;
+  transition: 0.5s linear all;
+}
+
+.fadein.ng-enter {
+  opacity:0;
+}
+.fadein.ng-enter.ng-enter-active {
+  opacity:1;
+}
+
+.fadein.ng-move {
+  opacity:0.5;
+}
+.fadein.ng-move.ng-move-active {
+  opacity:1;
+}
+
+.popup-error {
+    color: red;
+    padding: 0 5px 8px 0;
+}
+
+/** Passwords */
+
+.password-field {
+    width: 320px;
+}
+
+/** LOADING */
+
+.message .loading {
+	line-height: 40px;
+	margin-left: 0px;	
+}

+ 471 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/css/style.css

@@ -0,0 +1,471 @@
+@font-face {
+    font-family: 'ActivitiModeler';
+    src: url('../fonts/activiti-admin-webfont.eot');
+    src: url('../fonts/activiti-admin-webfont.eot?#iefix') format('embedded-opentype'),
+         url('../fonts/activiti-admin-webfont.woff') format('woff'),
+         url('../fonts/activiti-admin-webfont.ttf') format('truetype'),
+         url('../fonts/activiti-admin-webfont.svg#activitimodelerregular') format('svg');
+    font-weight: normal;
+    font-style: normal;
+}
+
+.row-no-gutter .col-xs-9 {
+	padding-left: 0px;
+	padding-right: 0px;
+	z-index: 50;
+}
+
+.row-no-gutter .col-xs-3 {
+	padding-left: 0px;
+	padding-right: 0px;
+	z-index: 100;
+}
+
+.editor-item-picker {
+    height: 400px;
+    max-height: 400px;
+    min-height: 400px;
+    overflow: auto;
+}
+
+.editor-item-picker-component {
+    height: 185px;
+    max-height: 185px;
+    overflow: hidden;
+}
+
+.editor-toolbar {
+	padding-left: 5px;
+}
+
+.editor-toolbar > .btn-group {
+	margin: 12px 15px 0px 0px;
+}
+
+.editor-toolbar  > .btn-group.pull-right {
+	margin: 0;
+}
+
+.editor-toolbar .btn.btn-inverse {
+	font-size: 24px;
+	color: #FFFFFF;
+    border-color: rgba(0, 0, 0, 0);
+    padding: 3px 6px 0px 6px;
+    box-shadow: none;
+    text-shadow: none;
+    text-align: center;
+    border: none;
+    margin: 0px 0px 0px 5px;
+    height: 36px;
+    min-width: 36px;
+}
+.editor-toolbar .btn.btn-inverse.pressed {
+	background-color: #287d92;
+	color: #174753;
+}
+
+.editor-toolbar .btn.btn-inverse.disabled, .editor-toolbar .btn.btn-inverse[disabled], .editor-toolbar .btn.btn-inverse[disabled]:active, .editor-toolbar .btn.btn-inverse[disabled]:hover {
+	background-color: #668b94;
+	border-color: #668b94;
+}
+
+.editor-toolbar .btn.btn-inverse.separator {
+	background: transparent;
+	padding: 4px 5px 0px 5px;
+	width: 1px;
+	min-width: 1px;
+}
+
+.editor-toolbar .toolbar-separator {
+	background: #a4acb9;
+	width: 1px;
+	height: 30px;
+}
+
+.stencils {
+	border-right: 1pt solid #c7cacd;
+	overflow: auto;
+	z-index: 5000;
+}
+
+.stencils ul {
+	padding-left: 0;
+}
+
+.stencils > div {
+	margin-top: 10px;
+}
+
+.stencil-group {
+	list-style: none;
+	list-style-position: outside;
+	margin: 0px 15px 0px 0px;
+}
+
+
+.stencil-group > li {
+	list-style: none;
+	list-style-position: outside;
+	margin: 0px 0px 5px 15px;
+	background-color: #ffffff;
+	font-family: Arial, Regular;
+	font-size: 17px;
+	color: #323437;
+}
+
+.stencil-group > li > span {
+	margin-left: 5px;
+	padding-top:5px;
+	padding-bottom: 5px;
+	display: block;
+	cursor: pointer;
+}
+
+.stencil-group > li > span > i {
+	font-size: 12px;	
+	line-height: 17px;
+}
+.stencil-group > li > ul {
+	list-style: none;
+	list-style-position: inside;
+	background-color: transparent;
+	margin: 0px;
+	overflow: hidden;
+	padding-left: 20px;
+}
+
+.stencil-group.collapsed > li {
+	color: #000000;
+}
+.stencil-group.collapsed > li > ul {
+	max-height: 0px;
+	padding-top: 0;
+	padding-bottom: 0;
+}
+
+.stencil-group-non-root > li {
+    background-color: #ffffff;
+}
+
+.stencil-item {
+    cursor: pointer;
+    padding: 5px;
+}
+
+.root-stencil-item {
+    margin: 0 0 0 15px;
+    font-family: Arial, Regular;
+    font-size: 17px;
+}
+
+
+/* Modeling Canvas
+-------------------------------- */
+div.canvas-wrapper {
+	overflow: auto;
+	background-color: #F8F8F8;
+}
+
+.canvas_resize_indicator i {
+	font-size: 15px;
+	color: #ffffff;
+	cursor: pointer;
+}
+
+.canvas_resize_indicator.N, .canvas_resize_indicator.S, .canvas_resize_indicator.E, .canvas_resize_indicator.W {
+	background: #5fbcd3;
+	height: 17px;
+	width: 17px;
+	text-align: center;
+	-webkit-border-radius:3px;
+	-moz-border-radius:3px;
+	border-radius:3px;
+}
+
+#canvas-grow-N.canvas_resize_indicator, #canvas-shrink-S.canvas_resize_indicator {
+	margin: 0;
+	top: auto;
+}
+
+#canvas-grow-S.canvas_resize_indicator, #canvas-shrink-N.canvas_resize_indicator {
+	margin: 0;
+	bottom: auto;
+}
+
+#canvas-grow-E.canvas_resize_indicator, #canvas-shrink-W.canvas_resize_indicator {
+	margin: 0;
+	right: auto;
+}
+
+#canvas-grow-W.canvas_resize_indicator, #canvas-shrink-E.canvas_resize_indicator {
+	margin: 0;
+	left: auto;
+}
+
+.x-panel-body.x-panel-body-noheader.x-panel-body-noborder, .ORYX_Editor x-panel {
+	background-color: #F8F8F8;
+}
+
+.canvas-message {
+	position: absolute;
+	top: 60px;
+	right: 10px;
+	background: transparent;
+	font-size: 10pt;
+}
+
+
+div.propertySection {
+	height: 250px;
+    background-color: #e8edf1;
+	margin-bottom: 0px;
+}
+
+.selected-item-title {
+    font-size: 25px;
+    font-weight: bold;
+    padding: 8px 0 8px 8px;
+    border-bottom: 1px solid #a4acb9;
+    cursor: pointer;
+}
+
+.selected-item-title a {
+	display: block;
+	color: #1a1a1a;
+}
+
+.selected-item-title .glyphicon {
+	line-height: 25px;
+	font-size: 14px;
+}
+
+.selected-item-title a:hover, .selected-item-title a:focus {
+	color: #1a1a1a;
+	text-decoration: none;
+}
+
+.selected-item-section > div > .pull-right {
+	line-height: 50px;
+	margin: 0px 10px;
+	font-size: 14px;
+}
+
+.selected-item-body .property-row {
+	float: left;
+	width: 50%;
+	border: 0;
+	margin: 0;
+	padding: 0;
+	font-size: 13px;
+	overflow: hidden;
+}
+
+.selected-item-body .property-row:hover {
+	background-color: #d7dfe6;	
+}
+
+.selected-item-body {
+	padding: 0;
+	overflow: auto;
+	height: 199px;
+}
+
+.selected-item-body > div {
+	overflow: hidden;	
+	margin: 5px 20px;
+}
+
+.property-row > span {
+	display: block;
+	float: left;
+	margin: 2px 2%;
+	padding: 0;	
+	min-height: 25px;
+}
+
+.property-row span.value {
+	cursor: pointer;
+	width: 46%;
+	padding: 0;
+	margin: 0;
+}
+
+.property-row span.value:hover {
+	cursor: pointer;
+}
+
+.property-row span.title {
+	font-size: 13px;
+	font-weight: bold;
+	width: 46%;
+}
+
+.property-row span.title-removed {
+	font-size: 13px;
+	font-weight: normal;
+	width: 46%;
+}
+
+.propertySection.collapsed {
+	max-height: 50px;
+	height: 50px;
+	overflow: hidden;
+}
+
+.propertySection.collapsed .selected-item-title {
+	border: none;
+}
+
+.property-row input[type="text"] {
+	height: 25px;
+	margin: 2px 0;
+	padding: 0px 5px;
+	width: 100%;
+    outline: none;
+    border:none !important;
+    box-shadow:none !important;
+}
+
+.default-grid {
+    border: 1px solid rgb(212,212,212);
+    width: 100%;
+    height: 300px;
+    margin-bottom: 10px;
+}
+
+.kis-listener-grid {
+    border: 1px solid rgb(212,212,212);
+    width: 100%;
+    height: 200px;
+    margin-bottom: 10px;
+}
+
+.kis-field-grid {
+    border: 1px solid rgb(212,212,212);
+    width: 100%;
+    height: 150px;
+    margin-bottom: 10px;
+}
+
+.saving-text {
+    display: table;
+    margin: 0 auto;
+    padding: 20px 0 0px 0;
+}
+
+
+.form-property-checkbox {
+    margin:0;
+}
+
+/* Oryx overrides
+-------------------------------- */
+ul.x-menu-list {
+	list-style: none;
+	list-style-position: inside;
+	width: 200px;
+	background-color: #FFFFFF;
+	border: 1px solid #E1E2E5;
+	-webkit-border-radius:3px;
+	-moz-border-radius:3px;
+	border-radius:3px;
+	padding: 3px;
+}
+
+img.x-menu-item-icon  {
+	width: auto;
+	height: auto;
+	margin-right: 5px;
+}
+
+li.x-menu-list-item {
+	margin: 3px 0px;
+}
+
+li.x-menu-list-item.x-menu-item-active {
+	background-color: #EFEFEF;
+}
+
+li.x-menu-list-item a {
+	color: #000000;
+}
+
+li.x-menu-list-item.x-menu-item-active a {
+	text-decoration: none;
+}
+
+.sequence-flow-order-element {
+    margin: 12px 0 12px 0;
+}
+
+/* Editor icon font */
+.editor-icon {
+	position: relative;
+	top: 1px;
+	display: inline-block;
+	font-family: 'ActivitiModeler';
+	font-style: normal;
+	font-weight: 400;
+	line-height: 1;
+	-webkit-font-smoothing: antialiased;
+	-moz-osx-font-smoothing: grayscale;
+}
+
+.editor-icon-save:before {
+	content: 'a';
+}
+
+.editor-icon-edit:before {
+	content: 'b';
+}
+
+.editor-icon-cut:before {
+	content: 'c';
+}
+
+.editor-icon-copy:before {
+	content: 'd';
+}
+
+.editor-icon-paste:before {
+	content: 'e';
+}
+.editor-icon-delete:before {
+	content: 'f';
+}
+.editor-icon-redo:before {
+	content: 'h';
+}
+.editor-icon-undo:before {
+	content: 'g';
+}
+.editor-icon-same-size:before {
+	content: 'i';
+}
+.editor-icon-zoom-in:before {
+	content: 'k';
+}
+.editor-icon-zoom-out:before {
+	content: 'l';
+}
+.editor-icon-zoom-actual:before {
+	content: 'm';
+}
+.editor-icon-zoom-fit:before {
+	content: 'j';
+}
+.editor-icon-bendpoint-add:before {
+	content: 'n';
+}
+.editor-icon-bendpoint-remove:before {
+	content: 'o';
+}
+.editor-icon-align-horizontal:before {
+	content: 'p';
+}
+.editor-icon-align-vertical:before {
+	content: 'q';
+}
+.editor-icon-close:before {
+    content: "X";
+}

+ 32 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor-config.js

@@ -0,0 +1,32 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+'use strict';
+
+var KISBPM = KISBPM || {};
+
+KISBPM.CONFIG = {
+		'showRemovedProperties' : false
+};
+
+KISBPM.HEADER_CONFIG = {
+		'showAppTitle' : true,
+		'showHeaderMenu' : true,
+		'showMainNavigation' : true,
+		'showPageHeader' : true
+};

+ 65 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor-controller.js

@@ -0,0 +1,65 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+'use strict';
+
+angular.module('activitiModeler')
+.controller('EditorUnsavedChangesPopupCrtl', ['$rootScope', '$scope', '$http', '$location', '$window', function ($rootScope, $scope, $http, $location, $window) {
+   
+	$scope.ok = function () {
+		if ($scope.handleResponseFunction) {
+			$scope.handleResponseFunction(true);
+
+            // Also clear any 'onbeforeunload', added by oryx
+            $window.onbeforeunload = undefined;
+		}
+		$scope.$hide();
+	};
+
+	$scope.cancel = function () {
+		if ($scope.handleResponseFunction) {
+			$scope.handleResponseFunction(false);
+		}
+        $scope.$hide();
+	};
+}]);
+
+activitiModule
+.directive('autoFocus', ['$timeout', '$parse', function($timeout, $parse) {
+    return {
+        restrict: 'AC',
+        compile: function($element, attr) {
+
+            return function(_scope, _element, _attrs) {
+                var firstChild = (_attrs.focusFirstChild !== undefined);
+                $timeout(function () {
+                    if (firstChild) {
+                        // look for first input-element in child-tree and focus that
+                        var inputs = _element.find('input');
+                        if (inputs && inputs.length > 0) {
+                            inputs[0].focus();
+                        }
+                    } else {
+                        // Focus element where the directive is put on
+                        _element[0].focus();
+                    }
+                }, 100);
+            }
+        }
+    };
+}]);

+ 135 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor-utils.js

@@ -0,0 +1,135 @@
+/*
+ * Activiti Modeler component part of the Activiti project
+ * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+/**
+ * Utility methods are grouped together here.
+ */
+var EDITOR = EDITOR || {};
+
+EDITOR.UTIL = {
+
+    getParameterByName: function (name) {
+        name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
+        var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
+            results = regex.exec(location.search);
+        return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
+    },
+
+    /**
+     * Starts at the provided start element, and walks all preceding elements in the graph.
+     * Each element is tested to have a certain property and, if it has, adds this property value
+     * to the return result list.
+     */
+    collectPropertiesFromPrecedingElements: function (startElement, propertyType) {
+        var visitedElements = [];
+        var collectedProperties = [];
+        EDITOR.UTIL._visitElementAndCollectProperty(startElement, propertyType, visitedElements, collectedProperties);
+        return collectedProperties;
+    },
+
+    /**
+     * Starts at the provided start element, and walks all preceding elements in the graph.
+     * Each element is tested to be a specific stencil id and, if it has, adds the element
+     * to the return result list.
+     */
+    collectElementsFromPrecedingElements: function (startElement, stencilId) {
+        var visitedElements = [];
+        var collectedElements = [];
+
+        var incomingShapesIterator = startElement.getIncomingShapes();
+        if (incomingShapesIterator) {
+            for (var i = 0; i < incomingShapesIterator.length; i++) {
+                var incomingShape = incomingShapesIterator[i];
+                if (visitedElements.indexOf(incomingShape.id) < 0) {
+                    EDITOR.UTIL._visitElementAndCollectElement(incomingShape, stencilId, visitedElements, collectedElements);
+                }
+            }
+        }
+
+        return collectedElements;
+    },
+
+    _visitElementAndCollectProperty: function (element, propertyType, visitedElementsArray, collectedProperties) {
+
+        visitedElementsArray.push(element.id);
+
+        var property = element.properties[propertyType]
+        if (property) {
+            collectedProperties.push(property);
+        }
+
+        var incomingShapesIterator = element.getIncomingShapes();
+        if (incomingShapesIterator) {
+            for (var i = 0; i < incomingShapesIterator.length; i++) {
+                var incomingShape = incomingShapesIterator[i];
+                if (visitedElementsArray.indexOf(incomingShape.id) < 0) {
+                    EDITOR.UTIL._visitElementAndCollectProperty(incomingShape, propertyType, visitedElementsArray, collectedProperties);
+                }
+            }
+        }
+    },
+
+    _visitElementAndCollectElement: function (element, stencilId, visitedElementsArray, collectedElements) {
+
+        visitedElementsArray.push(element.id);
+
+        var elementStencilId = element.getStencil().id();
+        if (elementStencilId && elementStencilId.indexOf(stencilId) >= 0) {
+            collectedElements.push(element);
+        }
+
+        var incomingShapesIterator = element.getIncomingShapes();
+        if (incomingShapesIterator) {
+            for (var i = 0; i < incomingShapesIterator.length; i++) {
+                var incomingShape = incomingShapesIterator[i];
+                if (visitedElementsArray.indexOf(incomingShape.id) < 0) {
+                    EDITOR.UTIL._visitElementAndCollectElement(incomingShape, stencilId, visitedElementsArray, collectedElements);
+                }
+            }
+        }
+    },
+
+    /**
+     * Goes up the chain of parents of the provided element.
+     * When the property is encountered, its value is immediately returned.
+     * If the chain of parents is completely walked through, undefined is returned.
+     */
+    getPropertyFromParent: function (element, propertyType) {
+        if (element.parent) {
+            return EDITOR.UTIL._getPropertyFromParent(element.parent, propertyType);
+        } else {
+            return undefined;
+        }
+
+    },
+
+    _getPropertyFromParent: function (parentElement, propertyType) {
+        var property = parentElement.properties[propertyType];
+        if (property) {
+            return property;
+        }
+
+        if (parentElement.parent) {
+            return EDITOR.UTIL._getPropertyFromParent(parentElement.parent, propertyType);
+        } else {
+            return undefined;
+        }
+    }
+
+};

+ 136 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor.html

@@ -0,0 +1,136 @@
+<div ng-controller="StencilController">
+  <div class="subheader editor-toolbar" id="editor-header">
+  	<div class="btn-group">
+	    <div class="btn-toolbar pull-left" ng-controller="ToolbarController" ng-cloak>
+        	<button id="{{item.id}}"
+                    title="{{item.title | translate}}"
+                    ng-repeat="item in items"
+                    ng-switch on="item.type"
+                    class="btn btn-inverse" ng-class="{'separator': item.type == 'separator'}"
+                    ng-disabled="item.type == 'separator' || item.enabled == false"
+                    ng-click="toolbarButtonClicked($index)">
+        		<i ng-switch-when="button" ng-class="item.cssClass" class="toolbar-button" data-toggle="tooltip" title="{{item.title | translate}}"></i>
+	            <div ng-switch-when="separator" ng-class="item.cssClass"></div>
+        	</button>
+  		  </div>
+        </div>
+        <div class="btn-group pull-right" ng-show="!secondaryItems.length">
+	        <div class="btn-toolbar pull-right" ng-controller="ToolbarController">
+        	<button title="{{item.title | translate}}" ng-repeat="item in secondaryItems" ng-switch on="item.type" class="btn btn-inverse" ng-class="{'separator': item.type == 'separator'}"
+                ng-disabled="item.type == 'separator'" ng-click="toolbarSecondaryButtonClicked($index)" id="{{item.id}}">
+        		<i ng-switch-when="button" ng-class="item.cssClass" class="toolbar-button" data-toggle="tooltip" title="{{item.title | translate}}"></i>
+	            <div ng-switch-when="separator" ng-class="item.cssClass"></div>
+        	</button>
+  		  </div>
+        </div>
+  </div>
+  <div class="full">
+      <div class="row row-no-gutter">
+	      <div id="paletteHelpWrapper" class="col-xs-3">
+	      	<div class="stencils" id="paletteSection">
+			    <div ng-if="stencilItemGroups.length > 1">
+                    <div ng-repeat="group in stencilItemGroups">
+
+                        <ul ng-if="group.visible && group.items" class="stencil-group"  ng-class="{collapsed: !group.expanded, 'first': $first}">
+                            <li ng-include="'editor-app/partials/stencil-item-template.html?version=4'"></li>
+                        </ul>
+
+                        <div ng-if="!group.items" ng-include="'editor-app/partials/root-stencil-item-template.html?version=4'"></div>
+
+                    </div>
+			    </div>
+			    <div ng-if="stencilItemGroups.length == 1">
+	                <ul class="stencil-group">
+	                    <li ng-repeat="item in stencilItemGroups[0].paletteItems" class="stencil-item"
+	                         id="{{item.id}}"
+	                         title="{{item.description}}"
+	                         ng-model="draggedElement"
+	                         data-drag="true"
+	                         jqyoui-draggable="{onStart:'startDragCallback', onDrag:'dragCallback'}"
+	                         data-jqyoui-options="{revert: 'invalid', helper: 'clone', opacity : 0.5}">
+	                         
+	                        <img ng-src="editor-app/stencilsets/bpmn2.0/icons/{{item.icon}}" width="16px;" height="16px;"/>
+	                        {{item.name}}
+	                    </li>
+                    </ul>
+			     </div>
+		      </div>
+	      </div>
+	      <div id="canvasHelpWrapper" class="col-xs-9">
+	      	<div class="canvas-wrapper" id="canvasSection" 
+	      		ng-model="droppedElement"
+                  ng-model="droppedElement"
+                  data-drop="true"
+                  data-jqyoui-options
+                  jqyoui-droppable="{onDrop:'dropCallback',onOver: 'overCallback', onOut: 'outCallback'}"> 
+            	<div class="canvas-message" id="model-modified-date"></div>
+            	<div class="Oryx_button" 
+            	     id="delete-button" 
+            	     title="{{'BUTTON.ACTION.DELETE.TOOLTIP' | translate}}"
+            	     ng-click="deleteShape()"
+            	     style="display:none">
+            	    <img src="editor-app/images/delete.png"/>
+            	</div>
+            	<div class="Oryx_button" 
+            	     id="morph-button"
+            	     title="{{'BUTTON.ACTION.MORPH.TOOLTIP' | translate}}"
+            	     ng-click="morphShape()"
+            	     style="display:none">
+            	    <img src="editor-app/images/wrench.png"/>
+            	</div>
+            	<div class="Oryx_button"
+            		 ng-repeat="item in quickMenuItems"
+	                 id="{{item.id}}"
+	                 title="{{item.description}}"
+	                 ng-click="quickAddItem(item.id)"
+            	     ng-model="draggedElement"
+	                 data-drag="true"
+	                 jqyoui-draggable="{onStart:'startDragCallbackQuickMenu', onDrag:'dragCallbackQuickMenu'}"
+	                 data-jqyoui-options="{revert: 'invalid', helper: 'clone', opacity : 0.5}"
+	                 style="display:none">
+	             	<img ng-src="editor-app/stencilsets/bpmn2.0/icons/{{item.icon}}"/>
+	             </div>
+	         </div>
+           </div>
+           <div id="propertiesHelpWrapper" class="col-xs-9">
+            	<div class="propertySection" id="propertySection"
+                	ng-class="{collapsed: propertyWindowState.collapsed}">
+	                <div class="selected-item-section">
+	                	<div class="clearfix">
+		                    <div class="pull-right" ng-if="selectedItem.auditData.createDate">
+		                        <strong>{{'ELEMENT.DATE_CREATED' | translate}}: </strong> {{selectedItem.auditData.createDate}}
+		                    </div>
+		                    <div class="pull-right" ng-if="selectedItem.auditData.author">
+		                        <strong>{{'ELEMENT.AUTHOR' | translate}}: </strong> {{selectedItem.auditData.author}}
+		                    </div>
+		                    <div class="selected-item-title">
+		                        <a ng-click="propertyWindowState.toggle()"> 
+		                            <i class="glyphicon" ng-class="{'glyphicon-chevron-right': propertyWindowState.collapsed, 'glyphicon-chevron-down': !propertyWindowState.collapsed}"></i>
+		                            <span ng-show="selectedItem.title != undefined && selectedItem.title != null && selectedItem.title.length > 0">{{selectedItem.title}}</span> 
+		                            <span ng-show="!selectedItem || selectedItem.title == undefined || selectedItem.title == null || selectedItem.title.length == 0">{{modelData.name}}</span>
+		                        </a>
+		                    </div>
+		                </div>
+                    	<div class="selected-item-body">
+	                        <div>
+	                             <div class="property-row" ng-repeat="property in selectedItem.properties"
+	                                ng-click="propertyClicked($index)" ng-class="{'clear' : $index%2 == 0}">
+	                                <span class="title" ng-if="!property.hidden">{{ property.title }}&nbsp;:</span>
+	                                <span class="title-removed" ng-if="property.hidden"><i>{{ property.title }}&nbsp;({{'PROPERTY.REMOVED' | translate}})&nbsp;:</i></span>
+	                                <span class="value"> 
+	                                    <ng-include
+	                                        src="getPropertyTemplateUrl($index)" ng-if="!property.hasReadWriteMode"></ng-include>
+	                                    <ng-include src="getPropertyReadModeTemplateUrl($index)"
+	                                        ng-if="property.hasReadWriteMode && property.mode == 'read'"></ng-include>
+	                                    <ng-include src="getPropertyWriteModeTemplateUrl($index)"
+	                                        ng-if="property.hasReadWriteMode && property.mode == 'write'"></ng-include>
+	                                </span>
+	                            </div>
+	                        </div>
+	                    </div>
+	    			</div>     
+    			</div>            
+            </div>
+         </div>
+    </div>
+</div>

+ 202 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor/css/editor.css

@@ -0,0 +1,202 @@
+body, html {
+    font-family: tahoma,arial,helvetica,sans-serif;
+    font-size: 12px;
+}
+
+/*********
+ * SVG Style
+ */
+
+text,
+text * {
+    cursor:default;
+    -webkit-user-select: none;
+}
+
+/*********
+ * HEADER SECTION
+ *
+ */
+
+#oryx_canvas_htmlContainer {
+
+}
+
+.ORYX_Editor {
+    background: white;
+    border: none;
+    margin:-5px;
+    margin-top:0px;
+    width:1200px;
+    height:600px;
+}
+
+.icon-large {
+	width:18px !important;
+}
+
+#oryxcanvas {
+	width:1200px;
+	height:600px;
+}
+
+/** Resizer for the Canvas **/
+.canvas_resize_indicator_area {
+
+	margin		:auto;
+	display		:block;
+	height		:30px;
+	left		:20%;
+	position	:absolute;
+	text-align	:center;
+	top			:0;
+	width		:60%;
+
+}
+
+.canvas_resize_indicator {
+
+	width		: 15px;
+	height		: 15px;
+	position	: absolute;
+	display		: block;
+	margin		: auto;
+	opacity		: 0.6;
+}
+
+.canvas_resize_indicator:hover {
+
+	opacity		: 1.0;
+}
+/** End Resizer **/
+
+.Oryx_down {
+
+}
+
+.Oryx_button img {
+	width:16px;
+	height:16px;
+	top:0px;
+	left:0px;
+	line-height: 16px;
+}
+
+.Oryx_Right .Oryx_button,
+.Oryx_Left .Oryx_button,
+.Oryx_Top .Oryx_button,
+.Oryx_Bottom .Oryx_button {
+	opacity: 0.5;
+}
+
+.Oryx_button.x-opacity-0 {
+	opacity: 0;
+	display:none;
+}
+
+.Oryx_button.x-opacity-10 {
+	opacity: 0.1;
+}
+
+.Oryx_button.x-opacity-20 {
+	opacity: 0.2;
+}
+
+.Oryx_button.x-opacity-50 {
+	opacity: 0.5;
+}
+
+.Oryx_Right:hover .Oryx_button,
+.Oryx_Left:hover .Oryx_button,
+.Oryx_Top:hover .Oryx_button,
+.Oryx_Bottom:hover .Oryx_button {
+	opacity: 0.7;
+	display:block;
+}
+
+
+.Oryx_button img {
+	top:0px;
+}
+
+.Oryx_Left img {
+	top:0px;
+}
+
+.Oryx_button {
+	width:24px;
+	height:24px;
+	padding:2px;
+	position:absolute;
+	background-color: #ffffff;
+	background-color: rgba(255,255,255,0.7);
+	cursor: pointer;
+}
+
+.Oryx_button_with_caption {
+	width:inherit;
+	height:16px;
+	padding:4px;
+	position:absolute;
+}
+
+/*** Resizer ***/
+
+.resizer_southeast,
+.resizer_northwest {
+	width:12px;
+	height:12px;
+	position:relative;
+	background-color: transparent;
+	background-repeat:no-repeat;
+}
+
+/*** Selection Frame ***/
+
+.Oryx_SelectionFrame{
+	position:absolute;
+	border:1px dotted gray;
+	background:none;
+}
+
+.LoadingIndicator {
+    background-image: url('../../images/loading.gif');
+}
+
+.Oryx_hover, .Oryx_button:hover {
+    background-color: #999999;
+    background-color: rgba(193, 229, 238, 0.7);
+    opacity: 1 !important;
+    -webkit-border-radius: 3px;
+    -moz-border-radius: 3px;
+    border-radius: 3px;
+}
+
+.ValidateButton {
+    width:24px;
+    height:24px;
+    padding:2px;
+    position:absolute;
+    cursor: pointer;
+}
+
+.ValidateButton:hover {
+    background-color: #999999;
+    background-color: rgba(193, 229, 238, 0.7);
+    opacity: 1 !important;
+    -webkit-border-radius: 3px;
+    -moz-border-radius: 3px;
+    border-radius: 3px;
+}
+
+.resizer_southeast {
+    background-image:url(../../images/se-handle-dark.gif);
+    cursor: se-resize;
+    background-position: 4px 4px;
+}
+
+.resizer_northwest {
+    background-image:url(../../images/nw-handle-dark.gif);
+    cursor: nw-resize;
+    background-position: -2px -2px;
+}

+ 383 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor/i18n/translation_de.js

@@ -0,0 +1,383 @@
+/**
+ * @author nicolas.peters
+ * 
+ * Contains all strings for German language.
+ * Version 1 - 08/29/08
+ */
+if(!ORYX) var ORYX = {};
+
+if(!ORYX.I18N) ORYX.I18N = {};
+
+ORYX.I18N.Language = "de_DE"; //Pattern <ISO language code>_<ISO country code> in lower case!
+
+if(!ORYX.I18N.Oryx) ORYX.I18N.Oryx = {};
+
+ORYX.I18N.Oryx.pleaseWait = "Editor wird geladen. Bitte warten...";
+ORYX.I18N.Oryx.notLoggedOn = "Nicht angemeldet";
+ORYX.I18N.Oryx.noBackendDefined	= "Achtung! \n Es wurde kein Repository definiert.\n Ihr Model kann nicht geladen werden. Bitte nutzen sie eine Editor Konfiguration mit einem Speicher Plugin.";
+
+if(!ORYX.I18N.AddDocker) ORYX.I18N.AddDocker = {};
+
+ORYX.I18N.AddDocker.group = "Docker";
+ORYX.I18N.AddDocker.add = "Docker Hinzufügen";
+ORYX.I18N.AddDocker.addDesc = "Fügen Sie einer Kante einen Docker hinzu, indem Sie auf die Kante klicken";
+ORYX.I18N.AddDocker.del = "Docker Löschen";
+ORYX.I18N.AddDocker.delDesc = "Löscht einen Docker durch Klicken auf den zu löschenden Docker";
+
+if(!ORYX.I18N.Arrangement) ORYX.I18N.Arrangement = {};
+
+ORYX.I18N.Arrangement.groupZ = "Z-Order";
+ORYX.I18N.Arrangement.btf = "In den Vordergrund";
+ORYX.I18N.Arrangement.btfDesc = "In den Vordergrund";
+ORYX.I18N.Arrangement.btb = "In den Hintergrund";
+ORYX.I18N.Arrangement.btbDesc = "In den Hintergrund";
+ORYX.I18N.Arrangement.bf = "Eine Ebene nach Vorne";
+ORYX.I18N.Arrangement.bfDesc = "Eine Ebene nach Vorne";
+ORYX.I18N.Arrangement.bb = "Eine Ebene nach Hinten";
+ORYX.I18N.Arrangement.bbDesc = "Eine Ebene nach Hinten";
+ORYX.I18N.Arrangement.groupA = "Alignment";
+ORYX.I18N.Arrangement.ab = "Unten ausrichten";
+ORYX.I18N.Arrangement.abDesc = "Unten ausrichten";
+ORYX.I18N.Arrangement.am = "Horizontal ausrichten";
+ORYX.I18N.Arrangement.amDesc = "Horizontal ausrichten";
+ORYX.I18N.Arrangement.at = "Oben ausrichten";
+ORYX.I18N.Arrangement.atDesc = "Oben ausrichten";
+ORYX.I18N.Arrangement.al = "Links ausrichten";
+ORYX.I18N.Arrangement.alDesc = "Links ausrichten";
+ORYX.I18N.Arrangement.ac = "Vertikal ausrichten";
+ORYX.I18N.Arrangement.acDesc = "Vertikal ausrichten";
+ORYX.I18N.Arrangement.ar = "Rechts ausrichten";
+ORYX.I18N.Arrangement.arDesc = "Rechts ausrichten";
+ORYX.I18N.Arrangement.as = "Größenangleichung";
+ORYX.I18N.Arrangement.asDesc = "Größenangleichung";
+
+if(!ORYX.I18N.Edit) ORYX.I18N.Edit = {};
+
+ORYX.I18N.Edit.group = "Edit";
+ORYX.I18N.Edit.cut = "Ausschneiden";
+ORYX.I18N.Edit.cutDesc = "Ausschneiden der selektierten Elemente";
+ORYX.I18N.Edit.copy = "Kopieren";
+ORYX.I18N.Edit.copyDesc = "Kopieren der selektierten Elemente";
+ORYX.I18N.Edit.paste = "Einfügen";
+ORYX.I18N.Edit.pasteDesc = "Einfügen von kopierten/ausgeschnittenen Elementen";
+ORYX.I18N.Edit.del = "Löschen";
+ORYX.I18N.Edit.delDesc = "Löschen der selektierten Elemente";
+
+if(!ORYX.I18N.EPCSupport) ORYX.I18N.EPCSupport = {};
+
+ORYX.I18N.EPCSupport.group = "EPC";
+ORYX.I18N.EPCSupport.exp = "EPML Export";
+ORYX.I18N.EPCSupport.expDesc = "Exportieren nach EPML";
+ORYX.I18N.EPCSupport.imp = "EPML Import";
+ORYX.I18N.EPCSupport.impDesc = "Importieren einer EPML Datei";
+ORYX.I18N.EPCSupport.progressExp = "Exportiere Modell";
+ORYX.I18N.EPCSupport.selectFile = "Wählen Sie eine EPML Datei aus, die Sie importieren möchten.";
+ORYX.I18N.EPCSupport.file = "Datei";
+ORYX.I18N.EPCSupport.impPanel = "EPML Datei importieren";
+ORYX.I18N.EPCSupport.impBtn = "Importieren";
+ORYX.I18N.EPCSupport.close = "Schließen";
+ORYX.I18N.EPCSupport.error = "Fehler";
+ORYX.I18N.EPCSupport.progressImp = "Importiere...";
+
+if(!ORYX.I18N.ERDFSupport) ORYX.I18N.ERDFSupport = {};
+
+ORYX.I18N.ERDFSupport.exp = "ERDF Export";
+ORYX.I18N.ERDFSupport.expDesc = "Exportieren nach ERDF";
+ORYX.I18N.ERDFSupport.imp = "ERDF Import";
+ORYX.I18N.ERDFSupport.impDesc = "ERDF Datei importieren";
+ORYX.I18N.ERDFSupport.impFailed = "Anfrage für den Import der ERDF Datei ist fehlgeschlagen.";
+ORYX.I18N.ERDFSupport.impFailed2 = "Während des Importierens ist ein Fehler aufgetreten. <br/>Fehlermeldung: <br/><br/>";
+ORYX.I18N.ERDFSupport.error = "Fehler";
+ORYX.I18N.ERDFSupport.noCanvas = "Das XML Dokument enthält keinen Oryx Canvas Knoten.";
+ORYX.I18N.ERDFSupport.noSS = "Im XML Dokument ist kein Stencil Set referenziert.";
+ORYX.I18N.ERDFSupport.wrongSS = "Das im XML Dokument referenzierte Stencil Set passt nicht zu dem im Editor geladenen Stencil Set.";
+ORYX.I18N.ERDFSupport.selectFile = "Wählen sie eine ERDF Datei (.xml) aus oder geben Sie den ERDF Code im Textfeld ein.";
+ORYX.I18N.ERDFSupport.file = "Datei";
+ORYX.I18N.ERDFSupport.impERDF = "ERDF importieren";
+ORYX.I18N.ERDFSupport.impBtn = "Importieren";
+ORYX.I18N.ERDFSupport.impProgress = "Importiere...";
+ORYX.I18N.ERDFSupport.close = "Schließen";
+ORYX.I18N.ERDFSupport.deprTitle = "Wirklich nach eRDF exportieren?";
+ORYX.I18N.ERDFSupport.deprText = "Der Export nach eRDF wird nicht empfohlen, da dieses Format in zukünftigen Versionen des Oryx Editors nicht mehr unterstützt wird. Verwenden Sie statt dessen den Export nach JSON, falls möglich. Wollen Sie dennoch das Model nach eRDF exportieren?";
+
+if(!ORYX.I18N.jPDLSupport) ORYX.I18N.jPDLSupport = {};
+
+ORYX.I18N.jPDLSupport.group = "ExecBPMN";
+ORYX.I18N.jPDLSupport.exp = "jPDL Export";
+ORYX.I18N.jPDLSupport.expDesc = "Exportieren nach jPDL";
+ORYX.I18N.jPDLSupport.imp = "jPDL Import";
+ORYX.I18N.jPDLSupport.impDesc = "jPDL Datei importieren";
+ORYX.I18N.jPDLSupport.impFailedReq = "Anfrage für den Import der jPDL Datei ist fehlgeschlagen.";
+ORYX.I18N.jPDLSupport.impFailedJson = "Transformation der jPDL Datei ist fehlgeschlagen.";
+ORYX.I18N.jPDLSupport.impFailedJsonAbort = "Import abgebrochen.";
+ORYX.I18N.jPDLSupport.loadSseQuestionTitle = "Stencil Set Erweiterung für jBPM muss geladen werden"; 
+ORYX.I18N.jPDLSupport.loadSseQuestionBody = "Um jPDL importieren zu können, muss die Stencil Set Erweiterung für jBPM geladen werden. Möchten Sie fortfahren?";
+ORYX.I18N.jPDLSupport.expFailedReq = "Anfrage für den Export des Models ist fehlgeschlagen.";
+ORYX.I18N.jPDLSupport.expFailedXml = "Export nach jPDL ist fehlgeschlagen. Exporter meldet: ";
+ORYX.I18N.jPDLSupport.error = "Fehler";
+ORYX.I18N.jPDLSupport.selectFile = "Wählen sie eine jPDL Datei (.xml) aus oder geben Sie den jPDL Code im Textfeld ein.";
+ORYX.I18N.jPDLSupport.file = "Datei";
+ORYX.I18N.jPDLSupport.impJPDL = "jPDL importieren";
+ORYX.I18N.jPDLSupport.impBtn = "Importieren";
+ORYX.I18N.jPDLSupport.impProgress = "Importiere...";
+ORYX.I18N.jPDLSupport.close = "Schließen";
+
+if(!ORYX.I18N.Save) ORYX.I18N.Save = {};
+
+ORYX.I18N.Save.group = "File";
+ORYX.I18N.Save.save = "Speichern";
+ORYX.I18N.Save.saveDesc = "Speichern";
+ORYX.I18N.Save.saveAs = "Speichern als...";
+ORYX.I18N.Save.saveAsDesc = "Speichern als...";
+ORYX.I18N.Save.unsavedData = "Das Diagramm enthält nicht gespeicherte Daten. Sind Sie sicher, daß Sie den Editor schließen möchten?";
+ORYX.I18N.Save.newProcess = "Neuer Prozess";
+ORYX.I18N.Save.saveAsTitle = "Speichern als...";
+ORYX.I18N.Save.saveBtn = "Speichern";
+ORYX.I18N.Save.close = "Schließen";
+ORYX.I18N.Save.savedAs = "Gespeichert als";
+ORYX.I18N.Save.saved = "Gespeichert";
+ORYX.I18N.Save.failed = "Das Speichern ist fehlgeschlagen.";
+ORYX.I18N.Save.noRights = "Sie haben nicht die erforderlichen Rechte, um Änderungen zu speichern.";
+ORYX.I18N.Save.saving = "Speichern";
+ORYX.I18N.Save.saveAsHint = "Das Diagramm wurde unter folgendem Link gespeichert:";
+
+if(!ORYX.I18N.File) ORYX.I18N.File = {};
+
+ORYX.I18N.File.group = "File";
+ORYX.I18N.File.print = "Drucken";
+ORYX.I18N.File.printDesc = "Drucken";
+ORYX.I18N.File.pdf = "PDF Export";
+ORYX.I18N.File.pdfDesc = "Exportieren nach PDF";
+ORYX.I18N.File.info = "Über";
+ORYX.I18N.File.infoDesc = "Über";
+ORYX.I18N.File.genPDF = "PDF wird generiert";
+ORYX.I18N.File.genPDFFailed = "Die Generierung der PDF Datei ist fehlgeschlagen.";
+ORYX.I18N.File.printTitle = "Drucken";
+ORYX.I18N.File.printMsg = "Leider arbeitet die Druckfunktion zur Zeit nicht immer korrekt. Bitte nutzen Sie den PDF Export, und drucken Sie das PDF Dokument aus. Möchten Sie dennoch mit dem Drucken fortfahren?";
+
+if(!ORYX.I18N.Grouping) ORYX.I18N.Grouping = {};
+
+ORYX.I18N.Grouping.grouping = "Grouping";
+ORYX.I18N.Grouping.group = "Gruppieren";
+ORYX.I18N.Grouping.groupDesc = "Gruppierung der selektierten Elemente";
+ORYX.I18N.Grouping.ungroup = "Gruppierung aufheben";
+ORYX.I18N.Grouping.ungroupDesc = "Aufheben aller Gruppierungen der selektierten Elemente";
+
+if(!ORYX.I18N.Loading) ORYX.I18N.Loading = {};
+
+ORYX.I18N.Loading.waiting ="Bitte warten...";
+
+if(!ORYX.I18N.PropertyWindow) ORYX.I18N.PropertyWindow = {};
+
+ORYX.I18N.PropertyWindow.name = "Name";
+ORYX.I18N.PropertyWindow.value = "Wert";
+ORYX.I18N.PropertyWindow.selected = "ausgewählt";
+ORYX.I18N.PropertyWindow.clickIcon = "Symbol anklicken";
+ORYX.I18N.PropertyWindow.add = "Hinzufügen";
+ORYX.I18N.PropertyWindow.rem = "Löschen";
+ORYX.I18N.PropertyWindow.complex = "Editor für komplexe Eigenschaft";
+ORYX.I18N.PropertyWindow.text = "Editor für einen Text";
+ORYX.I18N.PropertyWindow.ok = "Ok";
+ORYX.I18N.PropertyWindow.cancel = "Abbrechen";
+ORYX.I18N.PropertyWindow.dateFormat = "d/m/y";
+
+if(!ORYX.I18N.ShapeMenuPlugin) ORYX.I18N.ShapeMenuPlugin = {};
+
+ORYX.I18N.ShapeMenuPlugin.drag = "Ziehen";
+ORYX.I18N.ShapeMenuPlugin.clickDrag = "Klicken oder ziehen";
+ORYX.I18N.ShapeMenuPlugin.morphMsg = "Shape morphen";
+
+if(!ORYX.I18N.SyntaxChecker) ORYX.I18N.SyntaxChecker = {};
+
+ORYX.I18N.SyntaxChecker.group = "Verification";
+ORYX.I18N.SyntaxChecker.name = "Syntax-Checker";
+ORYX.I18N.SyntaxChecker.desc = "Überprüfung der Syntax";
+ORYX.I18N.SyntaxChecker.noErrors = "Es wurden keine Syntaxfehler gefunden.";
+ORYX.I18N.SyntaxChecker.invalid = "Ungültige Antwort vom Server.";
+ORYX.I18N.SyntaxChecker.checkingMessage = "Überprüfung wird durchgeführt ...";
+
+if(!ORYX.I18N.Undo) ORYX.I18N.Undo = {};
+
+ORYX.I18N.Undo.group = "Undo";
+ORYX.I18N.Undo.undo = "Rückgängig";
+ORYX.I18N.Undo.undoDesc = "Rückgängig";
+ORYX.I18N.Undo.redo = "Wiederherstellen";
+ORYX.I18N.Undo.redoDesc = "Wiederherstellen";
+
+if(!ORYX.I18N.View) ORYX.I18N.View = {};
+
+ORYX.I18N.View.group = "Zoom";
+ORYX.I18N.View.zoomIn = "Vergrößern";
+ORYX.I18N.View.zoomInDesc = "Vergrößern";
+ORYX.I18N.View.zoomOut = "Verkleinern";
+ORYX.I18N.View.zoomOutDesc = "Verkleinern";
+ORYX.I18N.View.zoomStandard = "Originalgröße";
+ORYX.I18N.View.zoomStandardDesc = "Originalgröße";
+ORYX.I18N.View.zoomFitToModel = "Modelgröße";
+ORYX.I18N.View.zoomFitToModelDesc = "Modelgröße";
+
+/** New Language Properties: 08.12.2008 **/
+
+ORYX.I18N.PropertyWindow.title = "Eigenschaften";
+
+if(!ORYX.I18N.ShapeRepository) ORYX.I18N.ShapeRepository = {};
+ORYX.I18N.ShapeRepository.title = "Shape Verzeichnis";
+
+ORYX.I18N.Save.dialogDesciption = "Bitte geben Sie einen Namen, eine Beschreibung und einen Kommentar ein.";
+ORYX.I18N.Save.dialogLabelTitle = "Titel";
+ORYX.I18N.Save.dialogLabelDesc = "Beschreibung";
+ORYX.I18N.Save.dialogLabelType = "Typ";
+ORYX.I18N.Save.dialogLabelComment = "Revisionskommentar";
+
+if(!ORYX.I18N.Perspective) ORYX.I18N.Perspective = {};
+ORYX.I18N.Perspective.no = "Keine Perspektive"
+ORYX.I18N.Perspective.noTip = "Zurücksetzen der aktuellen Perspektive"
+
+/** New Language Properties: 21.04.2009 */
+ORYX.I18N.JSONSupport = {
+    imp: {
+        name: "JSON importieren",
+        desc: "Importiert ein neues Modell aus JSON",
+        group: "Export",
+        selectFile: "Wählen Sie eine JSON-Datei (*.json) aus, die Sie importieren möchten, oder fügen Sie JSON in das Textfeld ein.",
+        file: "Datei",
+        btnImp: "Importieren",
+        btnClose: "Schließen",
+        progress: "Importieren ...",
+        syntaxError: "Syntaxfehler"
+    },
+    exp: {
+        name: "Nach JSON exportieren",
+        desc: "Exportiert das aktuelle Modell nach JSON",
+        group: "Export"
+    }
+};
+
+/** New Language Properties: 09.05.2009 */
+if(!ORYX.I18N.JSONImport) ORYX.I18N.JSONImport = {};
+
+ORYX.I18N.JSONImport.title = "JSON Import";
+ORYX.I18N.JSONImport.wrongSS = "Das Stencil Set der importierten Datei ({0}) entspricht nicht dem geladenen Stencil Set ({1})."
+
+/** New Language Properties: 14.05.2009 */
+if(!ORYX.I18N.RDFExport) ORYX.I18N.RDFExport = {};
+ORYX.I18N.RDFExport.group = "Export";
+ORYX.I18N.RDFExport.rdfExport = "Nach RDF exportieren";
+ORYX.I18N.RDFExport.rdfExportDescription = "Exportiert das aktuelle Model in die XML-Serialisierung des Resource Description Frameworks (RDF)";
+
+/** New Language Properties: 15.05.2009*/
+if(!ORYX.I18N.SyntaxChecker.BPMN) ORYX.I18N.SyntaxChecker.BPMN={};
+ORYX.I18N.SyntaxChecker.BPMN_NO_SOURCE = "Eine Kante muss einen Ursprung haben.";
+ORYX.I18N.SyntaxChecker.BPMN_NO_TARGET = "Eine Kante muss ein Ziel haben.";
+ORYX.I18N.SyntaxChecker.BPMN_DIFFERENT_PROCESS = "Ursprungs- und Zielknoten müssen im gleichen Prozess sein.";
+ORYX.I18N.SyntaxChecker.BPMN_SAME_PROCESS = "Ursprungs- und Zielknoten müssen in verschiedenen Pools enthalten sein.";
+ORYX.I18N.SyntaxChecker.BPMN_FLOWOBJECT_NOT_CONTAINED_IN_PROCESS = "Ein Kontrollflussobjekt muss sich in einem Prozess befinden.";
+ORYX.I18N.SyntaxChecker.BPMN_ENDEVENT_WITHOUT_INCOMING_CONTROL_FLOW = "Ein End-Ereignis muss einen eingehenden Sequenzfluss haben.";
+ORYX.I18N.SyntaxChecker.BPMN_STARTEVENT_WITHOUT_OUTGOING_CONTROL_FLOW = "Ein Start-Ereignis muss einen ausgehenden Sequenzfluss haben.";
+ORYX.I18N.SyntaxChecker.BPMN_STARTEVENT_WITH_INCOMING_CONTROL_FLOW = "Start-Ereignisse dürfen keinen eingehenden Sequenzfluss haben.";
+ORYX.I18N.SyntaxChecker.BPMN_ATTACHEDINTERMEDIATEEVENT_WITH_INCOMING_CONTROL_FLOW = "Angeheftete Zwischen-Ereignisse dürfen keinen eingehenden Sequenzfluss haben.";
+ORYX.I18N.SyntaxChecker.BPMN_ATTACHEDINTERMEDIATEEVENT_WITHOUT_OUTGOING_CONTROL_FLOW = "Angeheftete Zwischen-Ereignisse müssen genau einen ausgehenden Sequenzfluss haben.";
+ORYX.I18N.SyntaxChecker.BPMN_ENDEVENT_WITH_OUTGOING_CONTROL_FLOW = "End-Ereignisse dürfen keinen ausgehenden Sequenzfluss haben.";
+ORYX.I18N.SyntaxChecker.BPMN_EVENTBASEDGATEWAY_BADCONTINUATION = "Auf Ereignis-basierte Gateways dürfen weder Gateways noch Subprozesse folgen.";
+ORYX.I18N.SyntaxChecker.BPMN_NODE_NOT_ALLOWED = "Knotentyp ist nicht erlaubt.";
+
+if(!ORYX.I18N.SyntaxChecker.IBPMN) ORYX.I18N.SyntaxChecker.IBPMN={};
+ORYX.I18N.SyntaxChecker.IBPMN_NO_ROLE_SET = "Für Interaktionen muss ein Sender und ein Empfänger definiert sein.";
+ORYX.I18N.SyntaxChecker.IBPMN_NO_INCOMING_SEQFLOW = "Dieser Knoten muss eingehenden Sequenzfluss besitzen.";
+ORYX.I18N.SyntaxChecker.IBPMN_NO_OUTGOING_SEQFLOW = "Dieser Knoten muss ausgehenden Sequenzfluss besitzen.";
+
+if(!ORYX.I18N.SyntaxChecker.InteractionNet) ORYX.I18N.SyntaxChecker.InteractionNet={};
+ORYX.I18N.SyntaxChecker.InteractionNet_SENDER_NOT_SET = "Sender ist nicht definiert";
+ORYX.I18N.SyntaxChecker.InteractionNet_RECEIVER_NOT_SET = "Empfänger ist nicht definiert";
+ORYX.I18N.SyntaxChecker.InteractionNet_MESSAGETYPE_NOT_SET = "Nachrichtentyp ist nicht definiert.";
+ORYX.I18N.SyntaxChecker.InteractionNet_ROLE_NOT_SET = "Rolle ist nicht definiert.";
+
+if(!ORYX.I18N.SyntaxChecker.EPC) ORYX.I18N.SyntaxChecker.EPC={};
+ORYX.I18N.SyntaxChecker.EPC_NO_SOURCE = "Eine Kante muss einen Ursprung haben.";
+ORYX.I18N.SyntaxChecker.EPC_NO_TARGET = "Eine Kante muss ein Ziel haben.";
+ORYX.I18N.SyntaxChecker.EPC_NOT_CONNECTED = "Dieser Knoten muss eingehende oder ausgehende Kanten besitzen.";
+ORYX.I18N.SyntaxChecker.EPC_NOT_CONNECTED_2 = "Dieser Knoten muss sowohl eingehende als auch ausgehende Kanten besitzen.";
+ORYX.I18N.SyntaxChecker.EPC_TOO_MANY_EDGES = "Knoten ist mit zu vielen Kanten verbunden.";
+ORYX.I18N.SyntaxChecker.EPC_NO_CORRECT_CONNECTOR = "Knoten ist kein korrekter Konnektor.";
+ORYX.I18N.SyntaxChecker.EPC_MANY_STARTS = "Es darf nur ein Start-Ereignis geben.";
+ORYX.I18N.SyntaxChecker.EPC_FUNCTION_AFTER_OR = "Funktionen hinter einem OR-/XOR-Split sind nicht erlaubt.";
+ORYX.I18N.SyntaxChecker.EPC_PI_AFTER_OR = "Prozessschnittstellen hinter einem OR-/XOR-Split ist nicht erlaubt.";
+ORYX.I18N.SyntaxChecker.EPC_FUNCTION_AFTER_FUNCTION =  "Auf eine Funktion darf keine Funktion folgen.";
+ORYX.I18N.SyntaxChecker.EPC_EVENT_AFTER_EVENT =  "Auf ein Ereignis darf kein Ereignis folgen.";
+ORYX.I18N.SyntaxChecker.EPC_PI_AFTER_FUNCTION =  "Auf eine Funktion darf keine Prozessschnittstelle folgen.";
+ORYX.I18N.SyntaxChecker.EPC_FUNCTION_AFTER_PI =  "Auf eine Prozessschnittstelle darf keine Funktion folgen.";
+ORYX.I18N.SyntaxChecker.EPC_SOURCE_EQUALS_TARGET = "Eine Kante muss zwei verschiedene Knoten verbinden."
+
+if(!ORYX.I18N.SyntaxChecker.PetriNet) ORYX.I18N.SyntaxChecker.PetriNet={};
+ORYX.I18N.SyntaxChecker.PetriNet_NOT_BIPARTITE = "Der Graph ist nicht bepartit.";
+ORYX.I18N.SyntaxChecker.PetriNet_NO_LABEL = "Bezeichnung für einen bezeichnete Transition ist nicht gesetzt.";
+ORYX.I18N.SyntaxChecker.PetriNet_NO_ID = "Ein Knoten besitzt keine ID.";
+ORYX.I18N.SyntaxChecker.PetriNet_SAME_SOURCE_AND_TARGET = "Zwei Flussbeziehungen besitzen den gleichen Ursprung und das gleiche Ziel.";
+ORYX.I18N.SyntaxChecker.PetriNet_NODE_NOT_SET = "Ein Knoten ist nicht definiert für einen Flussbeziehung.";
+
+/** New Language Properties: 02.06.2009*/
+ORYX.I18N.Edge = "Kante";
+ORYX.I18N.Node = "Knoten";
+
+/** New Language Properties: 02.06.2009*/
+ORYX.I18N.SyntaxChecker.notice = "Bitte bewegen Sie den Mauszeiger über ein rotes Kreuz, um die Details zu erfahren.";
+
+/** New Language Properties: 15.07.2009*/
+if(!ORYX.I18N.Layouting) ORYX.I18N.Layouting ={};
+ORYX.I18N.Layouting.doing = "Layouten...";
+
+/** New Language Properties: 18.08.2009*/
+ORYX.I18N.SyntaxChecker.MULT_ERRORS = "Mehrere Fehler";
+
+/** New Language Properties: 08.09.2009*/
+if(!ORYX.I18N.PropertyWindow) ORYX.I18N.PropertyWindow = {};
+ORYX.I18N.PropertyWindow.oftenUsed = "Hauptattribute";
+ORYX.I18N.PropertyWindow.moreProps = "Mehr Attribute";
+
+/** New Language Properties 01.10.2009 */
+if(!ORYX.I18N.SyntaxChecker.BPMN2) ORYX.I18N.SyntaxChecker.BPMN2 = {};
+
+ORYX.I18N.SyntaxChecker.BPMN2_DATA_INPUT_WITH_INCOMING_DATA_ASSOCIATION = "Ein Dateninput darf keine ausgehenden Datenassoziationen haben.";
+ORYX.I18N.SyntaxChecker.BPMN2_DATA_OUTPUT_WITH_OUTGOING_DATA_ASSOCIATION = "Ein Datenoutput darf keine eingehenden Datenassoziationen haben.";
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_BASED_TARGET_WITH_TOO_MANY_INCOMING_SEQUENCE_FLOWS = "Ziele von Ereignis-basierten Gateways dürfen nicht mehr als einen eingehenden Sequenzfluss haben.";
+
+/** New Language Properties 02.10.2009 */
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_BASED_WITH_TOO_LESS_OUTGOING_SEQUENCE_FLOWS = "Ein Ereignis-basiertes Gateway muss 2 oder mehr ausgehende Sequenzflüsse besitzen.";
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_BASED_EVENT_TARGET_CONTRADICTION = "Wenn Nachrichten-Zwischenereignisse im Diagramm verwendet werden, dann dürfen Receive Tasks nicht verwendet werden und umgekehrt.";
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_BASED_WRONG_TRIGGER = "Nur die folgenden Zwischen-Ereignis-Auslöser sind hier zulässig: Nachricht, Signal, Timer, Bedingungs und Mehrfach.";
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_BASED_WRONG_CONDITION_EXPRESSION = "Die ausgehenden Sequenzflüsse eines Ereignis-Gateways dürfen keinen Bedingungsausdruck besitzen.";
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_BASED_NOT_INSTANTIATING = "Das Gateway erfüllt nicht die Voraussetzungen um den Prozess zu instantiieren. Bitte verwenden Sie ein Start-Ereignis oder setzen Sie die Instanziierungs-Attribute korrekt.";
+
+/** New Language Properties 05.10.2009 */
+ORYX.I18N.SyntaxChecker.BPMN2_GATEWAYDIRECTION_MIXED_FAILURE = "Das Gateway muss mehrere eingehende und ausgehende Sequenzflüsse besitzen.";
+ORYX.I18N.SyntaxChecker.BPMN2_GATEWAYDIRECTION_CONVERGING_FAILURE = "Das Gateway muss mehrere eingehende aber darf keine mehrfache ausgehende Sequenzflüsse besitzen.";
+ORYX.I18N.SyntaxChecker.BPMN2_GATEWAYDIRECTION_DIVERGING_FAILURE = "Das Gateway darf keine mehrfachen eingehenden aber muss mehrfache ausgehende Sequenzflüsse besitzen.";
+ORYX.I18N.SyntaxChecker.BPMN2_GATEWAY_WITH_NO_OUTGOING_SEQUENCE_FLOW = "Ein Gateway muss mindestens einen ausgehenden Sequenzfluss besitzen.";
+ORYX.I18N.SyntaxChecker.BPMN2_RECEIVE_TASK_WITH_ATTACHED_EVENT = "Empfangende Tasks, die in Ereignis-Gateway-Konfigurationen benutzt werden, dürfen keine angehefteten Zwischen-Ereignisse besitzen.";
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_SUBPROCESS_BAD_CONNECTION = "Ein Ereignis-Unterprozess darf keinen eingehenden oder ausgehenden Sequenzfluss besitzen.";
+
+/** New Language Properties 13.10.2009 */
+ORYX.I18N.SyntaxChecker.BPMN_MESSAGE_FLOW_NOT_CONNECTED = "Mindestens ein Ende des Nachrichtenflusses muss mit einem anderen Objekt verbunden sein.";
+
+/** New Language Properties 05.11.2009 */
+if(!ORYX.I18N.RESIZE) ORYX.I18N.RESIZE = {};
+ORYX.I18N.RESIZE.tipGrow = "Zeichenfläche vergrößern:";
+ORYX.I18N.RESIZE.tipShrink = "Zeichenfläche verkleinern:";
+ORYX.I18N.RESIZE.N = "Nach oben";
+ORYX.I18N.RESIZE.W = "Nach links";
+ORYX.I18N.RESIZE.S ="Nach unten";
+ORYX.I18N.RESIZE.E ="Nach rechts";
+
+/** New Language Properties 24.11.2009 */
+ORYX.I18N.SyntaxChecker.BPMN2_TOO_MANY_INITIATING_MESSAGES = "Eine Choreographie-Aktivität darf nur eine initiierende Nachricht besitzen.";
+ORYX.I18N.SyntaxChecker.BPMN_MESSAGE_FLOW_NOT_ALLOWED = "Ein Nachrichtenfluss ist an dieser Stelle nicht erlaubt.";
+
+/** New Language Properties 27.11.2009 */
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_BASED_WITH_TOO_LESS_INCOMING_SEQUENCE_FLOWS = "Ein Ereignis-basiertes Gateway, dass nicht instanziierend ist, muss mindestens einen eingehenden Kontrollfluss besitzen.";
+ORYX.I18N.SyntaxChecker.BPMN2_TOO_FEW_INITIATING_PARTICIPANTS = "Eine Choreographie-Aktivität musst genau einen initiierenden Teilnehmer (weiß) besitzen.";
+ORYX.I18N.SyntaxChecker.BPMN2_TOO_MANY_INITIATING_PARTICIPANTS = "Eine Choreographie-Aktivität darf nicht mehr als einen initiierenden Teilnehmer (weiß) besitzen."
+
+ORYX.I18N.SyntaxChecker.COMMUNICATION_AT_LEAST_TWO_PARTICIPANTS = "Die Kommunikation oder Sub-Konversation muss mit mindestens zwei Teilnehmern verbunden sein.";
+ORYX.I18N.SyntaxChecker.MESSAGEFLOW_START_MUST_BE_PARTICIPANT = "Die Nachrichtenflussquelle muss ein Teilnehmer sein.";
+ORYX.I18N.SyntaxChecker.MESSAGEFLOW_END_MUST_BE_PARTICIPANT = "Das Nachrichtenflussziel muss ein Teilnehmer sein.";
+ORYX.I18N.SyntaxChecker.CONV_LINK_CANNOT_CONNECT_CONV_NODES = "Der Konversationslink muss eine Kommunikation oder Sub-Konversation mit einem Teilnehmer verbinden.";

+ 423 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor/i18n/translation_en_us.js

@@ -0,0 +1,423 @@
+/**
+ * @author nicolas.peters
+ * 
+ * Contains all strings for the default language (en-us).
+ * Version 1 - 08/29/08
+ */
+if(!ORYX) var ORYX = {};
+
+if(!ORYX.I18N) ORYX.I18N = {};
+
+ORYX.I18N.Language = "en_us"; //Pattern <ISO language code>_<ISO country code> in lower case!
+
+if(!ORYX.I18N.Oryx) ORYX.I18N.Oryx = {};
+
+ORYX.I18N.Oryx.title		= "Oryx";
+ORYX.I18N.Oryx.noBackendDefined	= "Caution! \nNo Backend defined.\n The requested model cannot be loaded. Try to load a configuration with a save plugin.";
+ORYX.I18N.Oryx.pleaseWait 	= "Please wait while loading...";
+ORYX.I18N.Oryx.notLoggedOn = "Not logged on";
+ORYX.I18N.Oryx.editorOpenTimeout = "The editor does not seem to be started yet. Please check, whether you have a popup blocker enabled and disable it or allow popups for this site. We will never display any commercials on this site.";
+
+if(!ORYX.I18N.AddDocker) ORYX.I18N.AddDocker = {};
+
+ORYX.I18N.AddDocker.group = "Docker";
+ORYX.I18N.AddDocker.add = "Add Docker";
+ORYX.I18N.AddDocker.addDesc = "Add a Docker to an edge, by clicking on it";
+ORYX.I18N.AddDocker.del = "Delete Docker";
+ORYX.I18N.AddDocker.delDesc = "Delete a Docker";
+
+if(!ORYX.I18N.Arrangement) ORYX.I18N.Arrangement = {};
+
+ORYX.I18N.Arrangement.groupZ = "Z-Order";
+ORYX.I18N.Arrangement.btf = "Bring To Front";
+ORYX.I18N.Arrangement.btfDesc = "Bring to Front";
+ORYX.I18N.Arrangement.btb = "Bring To Back";
+ORYX.I18N.Arrangement.btbDesc = "Bring To Back";
+ORYX.I18N.Arrangement.bf = "Bring Forward";
+ORYX.I18N.Arrangement.bfDesc = "Bring Forward";
+ORYX.I18N.Arrangement.bb = "Bring Backward";
+ORYX.I18N.Arrangement.bbDesc = "Bring Backward";
+ORYX.I18N.Arrangement.groupA = "Alignment";
+ORYX.I18N.Arrangement.ab = "Alignment Bottom";
+ORYX.I18N.Arrangement.abDesc = "Bottom";
+ORYX.I18N.Arrangement.am = "Alignment Middle";
+ORYX.I18N.Arrangement.amDesc = "Middle";
+ORYX.I18N.Arrangement.at = "Alignment Top";
+ORYX.I18N.Arrangement.atDesc = "Top";
+ORYX.I18N.Arrangement.al = "Alignment Left";
+ORYX.I18N.Arrangement.alDesc = "Left";
+ORYX.I18N.Arrangement.ac = "Alignment Center";
+ORYX.I18N.Arrangement.acDesc = "Center";
+ORYX.I18N.Arrangement.ar = "Alignment Right";
+ORYX.I18N.Arrangement.arDesc = "Right";
+ORYX.I18N.Arrangement.as = "Alignment Same Size";
+ORYX.I18N.Arrangement.asDesc = "Same Size";
+
+if(!ORYX.I18N.Edit) ORYX.I18N.Edit = {};
+
+ORYX.I18N.Edit.group = "Edit";
+ORYX.I18N.Edit.cut = "Cut";
+ORYX.I18N.Edit.cutDesc = "Cuts the selection into an Oryx clipboard";
+ORYX.I18N.Edit.copy = "Copy";
+ORYX.I18N.Edit.copyDesc = "Copies the selection into an Oryx clipboard";
+ORYX.I18N.Edit.paste = "Paste";
+ORYX.I18N.Edit.pasteDesc = "Pastes the Oryx clipboard to the canvas";
+ORYX.I18N.Edit.del = "Delete";
+ORYX.I18N.Edit.delDesc = "Deletes all selected shapes";
+
+if(!ORYX.I18N.EPCSupport) ORYX.I18N.EPCSupport = {};
+
+ORYX.I18N.EPCSupport.group = "EPC";
+ORYX.I18N.EPCSupport.exp = "Export EPC";
+ORYX.I18N.EPCSupport.expDesc = "Export diagram to EPML";
+ORYX.I18N.EPCSupport.imp = "Import EPC";
+ORYX.I18N.EPCSupport.impDesc = "Import an EPML file";
+ORYX.I18N.EPCSupport.progressExp = "Exporting model";
+ORYX.I18N.EPCSupport.selectFile = "Select an EPML (.empl) file to import.";
+ORYX.I18N.EPCSupport.file = "File";
+ORYX.I18N.EPCSupport.impPanel = "Import EPML File";
+ORYX.I18N.EPCSupport.impBtn = "Import";
+ORYX.I18N.EPCSupport.close = "Close";
+ORYX.I18N.EPCSupport.error = "Error";
+ORYX.I18N.EPCSupport.progressImp = "Import...";
+
+if(!ORYX.I18N.ERDFSupport) ORYX.I18N.ERDFSupport = {};
+
+ORYX.I18N.ERDFSupport.exp = "Export to ERDF";
+ORYX.I18N.ERDFSupport.expDesc = "Export to ERDF";
+ORYX.I18N.ERDFSupport.imp = "Import from ERDF";
+ORYX.I18N.ERDFSupport.impDesc = "Import from ERDF";
+ORYX.I18N.ERDFSupport.impFailed = "Request for import of ERDF failed.";
+ORYX.I18N.ERDFSupport.impFailed2 = "An error while importing occurs! <br/>Please check error message: <br/><br/>";
+ORYX.I18N.ERDFSupport.error = "Error";
+ORYX.I18N.ERDFSupport.noCanvas = "The xml document has no Oryx canvas node included!";
+ORYX.I18N.ERDFSupport.noSS = "The Oryx canvas node has no stencil set definition included!";
+ORYX.I18N.ERDFSupport.wrongSS = "The given stencil set does not fit to the current editor!";
+ORYX.I18N.ERDFSupport.selectFile = "Select an ERDF (.xml) file or type in the ERDF to import it!";
+ORYX.I18N.ERDFSupport.file = "File";
+ORYX.I18N.ERDFSupport.impERDF = "Import ERDF";
+ORYX.I18N.ERDFSupport.impBtn = "Import";
+ORYX.I18N.ERDFSupport.impProgress = "Importing...";
+ORYX.I18N.ERDFSupport.close = "Close";
+ORYX.I18N.ERDFSupport.deprTitle = "Really export to eRDF?";
+ORYX.I18N.ERDFSupport.deprText = "Exporting to eRDF is not recommended anymore because the support will be stopped in future versions of the Oryx editor. If possible, export the model to JSON. Do you want to export anyway?";
+
+if(!ORYX.I18N.jPDLSupport) ORYX.I18N.jPDLSupport = {};
+
+ORYX.I18N.jPDLSupport.group = "ExecBPMN";
+ORYX.I18N.jPDLSupport.exp = "Export to jPDL";
+ORYX.I18N.jPDLSupport.expDesc = "Export to jPDL";
+ORYX.I18N.jPDLSupport.imp = "Import from jPDL";
+ORYX.I18N.jPDLSupport.impDesc = "Import jPDL File";
+ORYX.I18N.jPDLSupport.impFailedReq = "Request for import of jPDL failed.";
+ORYX.I18N.jPDLSupport.impFailedJson = "Transformation of jPDL failed.";
+ORYX.I18N.jPDLSupport.impFailedJsonAbort = "Import aborted.";
+ORYX.I18N.jPDLSupport.loadSseQuestionTitle = "jBPM stencil set extension needs to be loaded"; 
+ORYX.I18N.jPDLSupport.loadSseQuestionBody = "In order to import jPDL, the stencil set extension has to be loaded. Do you want to proceed?";
+ORYX.I18N.jPDLSupport.expFailedReq = "Request for export of model failed.";
+ORYX.I18N.jPDLSupport.expFailedXml = "Export to jPDL failed. Exporter reported: ";
+ORYX.I18N.jPDLSupport.error = "Error";
+ORYX.I18N.jPDLSupport.selectFile = "Select an jPDL (.xml) file or type in the jPDL to import it!";
+ORYX.I18N.jPDLSupport.file = "File";
+ORYX.I18N.jPDLSupport.impJPDL = "Import jPDL";
+ORYX.I18N.jPDLSupport.impBtn = "Import";
+ORYX.I18N.jPDLSupport.impProgress = "Importing...";
+ORYX.I18N.jPDLSupport.close = "Close";
+
+if(!ORYX.I18N.Save) ORYX.I18N.Save = {};
+
+ORYX.I18N.Save.group = "File";
+ORYX.I18N.Save.save = "Save";
+ORYX.I18N.Save.saveDesc = "Save";
+ORYX.I18N.Save.saveAs = "Save As...";
+ORYX.I18N.Save.saveAsDesc = "Save As...";
+ORYX.I18N.Save.unsavedData = "There are unsaved data, please save before you leave, otherwise your changes get lost!";
+ORYX.I18N.Save.newProcess = "New Process";
+ORYX.I18N.Save.saveAsTitle = "Save as...";
+ORYX.I18N.Save.saveBtn = "Save";
+ORYX.I18N.Save.close = "Close";
+ORYX.I18N.Save.savedAs = "Saved As";
+ORYX.I18N.Save.saved = "Saved!";
+ORYX.I18N.Save.failed = "Saving failed.";
+ORYX.I18N.Save.noRights = "You have no rights to save changes.";
+ORYX.I18N.Save.saving = "Saving";
+ORYX.I18N.Save.saveAsHint = "The process diagram is stored under:";
+
+if(!ORYX.I18N.File) ORYX.I18N.File = {};
+
+ORYX.I18N.File.group = "File";
+ORYX.I18N.File.print = "Print";
+ORYX.I18N.File.printDesc = "Print current model";
+ORYX.I18N.File.pdf = "Export as PDF";
+ORYX.I18N.File.pdfDesc = "Export as PDF";
+ORYX.I18N.File.info = "Info";
+ORYX.I18N.File.infoDesc = "Info";
+ORYX.I18N.File.genPDF = "Generating PDF";
+ORYX.I18N.File.genPDFFailed = "Generating PDF failed.";
+ORYX.I18N.File.printTitle = "Print";
+ORYX.I18N.File.printMsg = "We are currently experiencing problems with the printing function. We recommend using the PDF Export to print the diagram. Do you really want to continue printing?";
+
+if(!ORYX.I18N.Grouping) ORYX.I18N.Grouping = {};
+
+ORYX.I18N.Grouping.grouping = "Grouping";
+ORYX.I18N.Grouping.group = "Group";
+ORYX.I18N.Grouping.groupDesc = "Groups all selected shapes";
+ORYX.I18N.Grouping.ungroup = "Ungroup";
+ORYX.I18N.Grouping.ungroupDesc = "Deletes the group of all selected Shapes";
+
+if(!ORYX.I18N.Loading) ORYX.I18N.Loading = {};
+
+ORYX.I18N.Loading.waiting ="Please wait...";
+
+if(!ORYX.I18N.PropertyWindow) ORYX.I18N.PropertyWindow = {};
+
+ORYX.I18N.PropertyWindow.name = "Name";
+ORYX.I18N.PropertyWindow.value = "Value";
+ORYX.I18N.PropertyWindow.selected = "selected";
+ORYX.I18N.PropertyWindow.clickIcon = "Click Icon";
+ORYX.I18N.PropertyWindow.add = "Add";
+ORYX.I18N.PropertyWindow.rem = "Remove";
+ORYX.I18N.PropertyWindow.complex = "Editor for a Complex Type";
+ORYX.I18N.PropertyWindow.text = "Editor for a Text Type";
+ORYX.I18N.PropertyWindow.ok = "Ok";
+ORYX.I18N.PropertyWindow.cancel = "Cancel";
+ORYX.I18N.PropertyWindow.dateFormat = "m/d/y";
+
+if(!ORYX.I18N.ShapeMenuPlugin) ORYX.I18N.ShapeMenuPlugin = {};
+
+ORYX.I18N.ShapeMenuPlugin.drag = "Drag";
+ORYX.I18N.ShapeMenuPlugin.clickDrag = "Click or drag";
+ORYX.I18N.ShapeMenuPlugin.morphMsg = "Morph shape";
+
+if(!ORYX.I18N.SyntaxChecker) ORYX.I18N.SyntaxChecker = {};
+
+ORYX.I18N.SyntaxChecker.group = "Verification";
+ORYX.I18N.SyntaxChecker.name = "Syntax Checker";
+ORYX.I18N.SyntaxChecker.desc = "Check Syntax";
+ORYX.I18N.SyntaxChecker.noErrors = "There are no syntax errors.";
+ORYX.I18N.SyntaxChecker.invalid = "Invalid answer from server.";
+ORYX.I18N.SyntaxChecker.checkingMessage = "Checking ...";
+
+if(!ORYX.I18N.FormHandler) ORYX.I18N.FormHandler = {};
+
+ORYX.I18N.FormHandler.group = "FormHandling";
+ORYX.I18N.FormHandler.name = "FormHandler";
+ORYX.I18N.FormHandler.desc = "Testing from handling";
+
+if(!ORYX.I18N.Deployer) ORYX.I18N.Deployer = {};
+
+ORYX.I18N.Deployer.group = "Deployment";
+ORYX.I18N.Deployer.name = "Deployer";
+ORYX.I18N.Deployer.desc = "Deploy to engine";
+
+if(!ORYX.I18N.Tester) ORYX.I18N.Tester = {};
+
+ORYX.I18N.Tester.group = "Testing";
+ORYX.I18N.Tester.name = "Test process";
+ORYX.I18N.Tester.desc = "Open the test component to test this process definition";
+
+if(!ORYX.I18N.Undo) ORYX.I18N.Undo = {};
+
+ORYX.I18N.Undo.group = "Undo";
+ORYX.I18N.Undo.undo = "Undo";
+ORYX.I18N.Undo.undoDesc = "Undo the last action";
+ORYX.I18N.Undo.redo = "Redo";
+ORYX.I18N.Undo.redoDesc = "Redo the last undone action";
+
+if(!ORYX.I18N.View) ORYX.I18N.View = {};
+
+ORYX.I18N.View.group = "Zoom";
+ORYX.I18N.View.zoomIn = "Zoom In";
+ORYX.I18N.View.zoomInDesc = "Zoom into the model";
+ORYX.I18N.View.zoomOut = "Zoom Out";
+ORYX.I18N.View.zoomOutDesc = "Zoom out of the model";
+ORYX.I18N.View.zoomStandard = "Zoom Standard";
+ORYX.I18N.View.zoomStandardDesc = "Zoom to the standard level";
+ORYX.I18N.View.zoomFitToModel = "Zoom fit to model";
+ORYX.I18N.View.zoomFitToModelDesc = "Zoom to fit the model size";
+
+if(!ORYX.I18N.XFormsSerialization) ORYX.I18N.XFormsSerialization = {};
+
+ORYX.I18N.XFormsSerialization.group = "XForms Serialization";
+ORYX.I18N.XFormsSerialization.exportXForms = "XForms Export";
+ORYX.I18N.XFormsSerialization.exportXFormsDesc = "Export XForms+XHTML markup";
+ORYX.I18N.XFormsSerialization.importXForms = "XForms Import";
+ORYX.I18N.XFormsSerialization.importXFormsDesc = "Import XForms+XHTML markup";
+ORYX.I18N.XFormsSerialization.noClientXFormsSupport = "No XForms support";
+ORYX.I18N.XFormsSerialization.noClientXFormsSupportDesc = "<h2>Your browser does not support XForms. Please install the <a href=\"https://addons.mozilla.org/firefox/addon/824\" target=\"_blank\">Mozilla XForms Add-on</a> for Firefox.</h2>";
+ORYX.I18N.XFormsSerialization.ok = "Ok";
+ORYX.I18N.XFormsSerialization.selectFile = "Select a XHTML (.xhtml) file or type in the XForms+XHTML markup to import it!";
+ORYX.I18N.XFormsSerialization.selectCss = "Please insert url of css file";
+ORYX.I18N.XFormsSerialization.file = "File";
+ORYX.I18N.XFormsSerialization.impFailed = "Request for import of document failed.";
+ORYX.I18N.XFormsSerialization.impTitle = "Import XForms+XHTML document";
+ORYX.I18N.XFormsSerialization.expTitle = "Export XForms+XHTML document";
+ORYX.I18N.XFormsSerialization.impButton = "Import";
+ORYX.I18N.XFormsSerialization.impProgress = "Importing...";
+ORYX.I18N.XFormsSerialization.close = "Close";
+
+/** New Language Properties: 08.12.2008 */
+
+ORYX.I18N.PropertyWindow.title = "Properties";
+
+if(!ORYX.I18N.ShapeRepository) ORYX.I18N.ShapeRepository = {};
+ORYX.I18N.ShapeRepository.title = "Shape Repository";
+
+ORYX.I18N.Save.dialogDesciption = "Please enter a name, a description and a comment.";
+ORYX.I18N.Save.dialogLabelTitle = "Title";
+ORYX.I18N.Save.dialogLabelDesc = "Description";
+ORYX.I18N.Save.dialogLabelType = "Type";
+ORYX.I18N.Save.dialogLabelComment = "Revision comment";
+
+if(!ORYX.I18N.Perspective) ORYX.I18N.Perspective = {};
+ORYX.I18N.Perspective.no = "No Perspective"
+ORYX.I18N.Perspective.noTip = "Unload the current perspective"
+
+/** New Language Properties: 21.04.2009 */
+ORYX.I18N.JSONSupport = {
+    imp: {
+        name: "Import from JSON",
+        desc: "Imports a model from JSON",
+        group: "Export",
+        selectFile: "Select an JSON (.json) file or type in JSON to import it!",
+        file: "File",
+        btnImp: "Import",
+        btnClose: "Close",
+        progress: "Importing ...",
+        syntaxError: "Syntax error"
+    },
+    exp: {
+        name: "Export to JSON",
+        desc: "Exports current model to JSON",
+        group: "Export"
+    }
+};
+
+/** New Language Properties: 09.05.2009 */
+if(!ORYX.I18N.JSONImport) ORYX.I18N.JSONImport = {};
+
+ORYX.I18N.JSONImport.title = "JSON Import";
+ORYX.I18N.JSONImport.wrongSS = "The stencil set of the imported file ({0}) does not match to the loaded stencil set ({1})."
+
+/** New Language Properties: 14.05.2009 */
+if(!ORYX.I18N.RDFExport) ORYX.I18N.RDFExport = {};
+ORYX.I18N.RDFExport.group = "Export";
+ORYX.I18N.RDFExport.rdfExport = "Export to RDF";
+ORYX.I18N.RDFExport.rdfExportDescription = "Exports current model to the XML serialization defined for the Resource Description Framework (RDF)";
+
+/** New Language Properties: 15.05.2009*/
+if(!ORYX.I18N.SyntaxChecker.BPMN) ORYX.I18N.SyntaxChecker.BPMN={};
+ORYX.I18N.SyntaxChecker.BPMN_NO_SOURCE = "An edge must have a source.";
+ORYX.I18N.SyntaxChecker.BPMN_NO_TARGET = "An edge must have a target.";
+ORYX.I18N.SyntaxChecker.BPMN_DIFFERENT_PROCESS = "Source and target node must be contained in the same process.";
+ORYX.I18N.SyntaxChecker.BPMN_SAME_PROCESS = "Source and target node must be contained in different pools.";
+ORYX.I18N.SyntaxChecker.BPMN_FLOWOBJECT_NOT_CONTAINED_IN_PROCESS = "A flow object must be contained in a process.";
+ORYX.I18N.SyntaxChecker.BPMN_ENDEVENT_WITHOUT_INCOMING_CONTROL_FLOW = "An end event must have an incoming sequence flow.";
+ORYX.I18N.SyntaxChecker.BPMN_STARTEVENT_WITHOUT_OUTGOING_CONTROL_FLOW = "A start event must have an outgoing sequence flow.";
+ORYX.I18N.SyntaxChecker.BPMN_STARTEVENT_WITH_INCOMING_CONTROL_FLOW = "Start events must not have incoming sequence flows.";
+ORYX.I18N.SyntaxChecker.BPMN_ATTACHEDINTERMEDIATEEVENT_WITH_INCOMING_CONTROL_FLOW = "Attached intermediate events must not have incoming sequence flows.";
+ORYX.I18N.SyntaxChecker.BPMN_ATTACHEDINTERMEDIATEEVENT_WITHOUT_OUTGOING_CONTROL_FLOW = "Attached intermediate events must have exactly one outgoing sequence flow.";
+ORYX.I18N.SyntaxChecker.BPMN_ENDEVENT_WITH_OUTGOING_CONTROL_FLOW = "End events must not have outgoing sequence flows.";
+ORYX.I18N.SyntaxChecker.BPMN_EVENTBASEDGATEWAY_BADCONTINUATION = "Event-based gateways must not be followed by gateways or subprocesses.";
+ORYX.I18N.SyntaxChecker.BPMN_NODE_NOT_ALLOWED = "Node type is not allowed.";
+
+if(!ORYX.I18N.SyntaxChecker.IBPMN) ORYX.I18N.SyntaxChecker.IBPMN={};
+ORYX.I18N.SyntaxChecker.IBPMN_NO_ROLE_SET = "Interactions must have a sender and a receiver role set";
+ORYX.I18N.SyntaxChecker.IBPMN_NO_INCOMING_SEQFLOW = "This node must have incoming sequence flow.";
+ORYX.I18N.SyntaxChecker.IBPMN_NO_OUTGOING_SEQFLOW = "This node must have outgoing sequence flow.";
+
+if(!ORYX.I18N.SyntaxChecker.InteractionNet) ORYX.I18N.SyntaxChecker.InteractionNet={};
+ORYX.I18N.SyntaxChecker.InteractionNet_SENDER_NOT_SET = "Sender not set";
+ORYX.I18N.SyntaxChecker.InteractionNet_RECEIVER_NOT_SET = "Receiver not set";
+ORYX.I18N.SyntaxChecker.InteractionNet_MESSAGETYPE_NOT_SET = "Message type not set";
+ORYX.I18N.SyntaxChecker.InteractionNet_ROLE_NOT_SET = "Role not set";
+
+if(!ORYX.I18N.SyntaxChecker.EPC) ORYX.I18N.SyntaxChecker.EPC={};
+ORYX.I18N.SyntaxChecker.EPC_NO_SOURCE = "Each edge must have a source.";
+ORYX.I18N.SyntaxChecker.EPC_NO_TARGET = "Each edge must have a target.";
+ORYX.I18N.SyntaxChecker.EPC_NOT_CONNECTED = "Node must be connected with edges.";
+ORYX.I18N.SyntaxChecker.EPC_NOT_CONNECTED_2 = "Node must be connected with more edges.";
+ORYX.I18N.SyntaxChecker.EPC_TOO_MANY_EDGES = "Node has too many connected edges.";
+ORYX.I18N.SyntaxChecker.EPC_NO_CORRECT_CONNECTOR = "Node is no correct connector.";
+ORYX.I18N.SyntaxChecker.EPC_MANY_STARTS = "There must be only one start event.";
+ORYX.I18N.SyntaxChecker.EPC_FUNCTION_AFTER_OR = "There must be no functions after a splitting OR/XOR.";
+ORYX.I18N.SyntaxChecker.EPC_PI_AFTER_OR = "There must be no process interface after a splitting OR/XOR.";
+ORYX.I18N.SyntaxChecker.EPC_FUNCTION_AFTER_FUNCTION =  "There must be no function after a function.";
+ORYX.I18N.SyntaxChecker.EPC_EVENT_AFTER_EVENT =  "There must be no event after an event.";
+ORYX.I18N.SyntaxChecker.EPC_PI_AFTER_FUNCTION =  "There must be no process interface after a function.";
+ORYX.I18N.SyntaxChecker.EPC_FUNCTION_AFTER_PI =  "There must be no function after a process interface.";
+ORYX.I18N.SyntaxChecker.EPC_SOURCE_EQUALS_TARGET = "Edge must connect two distinct nodes."
+
+if(!ORYX.I18N.SyntaxChecker.PetriNet) ORYX.I18N.SyntaxChecker.PetriNet={};
+ORYX.I18N.SyntaxChecker.PetriNet_NOT_BIPARTITE = "The graph is not bipartite";
+ORYX.I18N.SyntaxChecker.PetriNet_NO_LABEL = "Label not set for a labeled transition";
+ORYX.I18N.SyntaxChecker.PetriNet_NO_ID = "There is a node without id";
+ORYX.I18N.SyntaxChecker.PetriNet_SAME_SOURCE_AND_TARGET = "Two flow relationships have the same source and target";
+ORYX.I18N.SyntaxChecker.PetriNet_NODE_NOT_SET = "A node is not set for a flowrelationship";
+
+/** New Language Properties: 02.06.2009*/
+ORYX.I18N.Edge = "Edge";
+ORYX.I18N.Node = "Node";
+
+/** New Language Properties: 03.06.2009*/
+ORYX.I18N.SyntaxChecker.notice = "Move the mouse over a red cross icon to see the error message.";
+
+/** New Language Properties: 05.06.2009*/
+if(!ORYX.I18N.RESIZE) ORYX.I18N.RESIZE = {};
+ORYX.I18N.RESIZE.tipGrow = "Increase canvas size:";
+ORYX.I18N.RESIZE.tipShrink = "Decrease canvas size:";
+ORYX.I18N.RESIZE.N = "Top";
+ORYX.I18N.RESIZE.W = "Left";
+ORYX.I18N.RESIZE.S ="Down";
+ORYX.I18N.RESIZE.E ="Right";
+
+/** New Language Properties: 15.07.2009*/
+if(!ORYX.I18N.Layouting) ORYX.I18N.Layouting ={};
+ORYX.I18N.Layouting.doing = "Layouting...";
+
+/** New Language Properties: 18.08.2009*/
+ORYX.I18N.SyntaxChecker.MULT_ERRORS = "Multiple Errors";
+
+/** New Language Properties: 08.09.2009*/
+if(!ORYX.I18N.PropertyWindow) ORYX.I18N.PropertyWindow = {};
+ORYX.I18N.PropertyWindow.oftenUsed = "Often used";
+ORYX.I18N.PropertyWindow.moreProps = "More Properties";
+
+/** New Language Properties 01.10.2009 */
+if(!ORYX.I18N.SyntaxChecker.BPMN2) ORYX.I18N.SyntaxChecker.BPMN2 = {};
+
+ORYX.I18N.SyntaxChecker.BPMN2_DATA_INPUT_WITH_INCOMING_DATA_ASSOCIATION = "A Data Input must not have any incoming Data Associations.";
+ORYX.I18N.SyntaxChecker.BPMN2_DATA_OUTPUT_WITH_OUTGOING_DATA_ASSOCIATION = "A Data Output must not have any outgoing Data Associations.";
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_BASED_TARGET_WITH_TOO_MANY_INCOMING_SEQUENCE_FLOWS = "Targets of Event-based Gateways may only have one incoming Sequence Flow.";
+
+/** New Language Properties 02.10.2009 */
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_BASED_WITH_TOO_LESS_OUTGOING_SEQUENCE_FLOWS = "An Event-based Gateway must have two or more outgoing Sequence Flows.";
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_BASED_EVENT_TARGET_CONTRADICTION = "If Message Intermediate Events are used in the configuration, then Receive Tasks must not be used and vice versa.";
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_BASED_WRONG_TRIGGER = "Only the following Intermediate Event triggers are valid: Message, Signal, Timer, Conditional and Multiple.";
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_BASED_WRONG_CONDITION_EXPRESSION = "The outgoing Sequence Flows of the Event Gateway must not have a condition expression.";
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_BASED_NOT_INSTANTIATING = "The Gateway does not meet the conditions to instantiate the process. Please use a start event or an instantiating attribute for the gateway.";
+
+/** New Language Properties 05.10.2009 */
+ORYX.I18N.SyntaxChecker.BPMN2_GATEWAYDIRECTION_MIXED_FAILURE = "The Gateway must have both multiple incoming and outgoing Sequence Flows.";
+ORYX.I18N.SyntaxChecker.BPMN2_GATEWAYDIRECTION_CONVERGING_FAILURE = "The Gateway must have multiple incoming but most NOT have multiple outgoing Sequence Flows.";
+ORYX.I18N.SyntaxChecker.BPMN2_GATEWAYDIRECTION_DIVERGING_FAILURE = "The Gateway must NOT have multiple incoming but must have multiple outgoing Sequence Flows.";
+ORYX.I18N.SyntaxChecker.BPMN2_GATEWAY_WITH_NO_OUTGOING_SEQUENCE_FLOW = "A Gateway must have a minimum of one outgoing Sequence Flow.";
+ORYX.I18N.SyntaxChecker.BPMN2_RECEIVE_TASK_WITH_ATTACHED_EVENT = "Receive Tasks used in Event Gateway configurations must not have any attached Intermediate Events.";
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_SUBPROCESS_BAD_CONNECTION = "An Event Subprocess must not have any incoming or outgoing Sequence Flow.";
+
+/** New Language Properties 13.10.2009 */
+ORYX.I18N.SyntaxChecker.BPMN_MESSAGE_FLOW_NOT_CONNECTED = "At least one side of the Message Flow has to be connected.";
+
+/** New Language Properties 24.11.2009 */
+ORYX.I18N.SyntaxChecker.BPMN2_TOO_MANY_INITIATING_MESSAGES = "A Choreography Activity may only have one initiating message.";
+ORYX.I18N.SyntaxChecker.BPMN_MESSAGE_FLOW_NOT_ALLOWED = "A Message Flow is not allowed here.";
+
+/** New Language Properties 27.11.2009 */
+ORYX.I18N.SyntaxChecker.BPMN2_EVENT_BASED_WITH_TOO_LESS_INCOMING_SEQUENCE_FLOWS = "An Event-based Gateway that is not instantiating must have a minimum of one incoming Sequence Flow.";
+ORYX.I18N.SyntaxChecker.BPMN2_TOO_FEW_INITIATING_PARTICIPANTS = "A Choreography Activity must have one initiating Participant (white).";
+ORYX.I18N.SyntaxChecker.BPMN2_TOO_MANY_INITIATING_PARTICIPANTS = "A Choreography Acitivity must not have more than one initiating Participant (white)."
+
+ORYX.I18N.SyntaxChecker.COMMUNICATION_AT_LEAST_TWO_PARTICIPANTS = "The communication must be connected to at least two participants.";
+ORYX.I18N.SyntaxChecker.MESSAGEFLOW_START_MUST_BE_PARTICIPANT = "The message flow's source must be a participant.";
+ORYX.I18N.SyntaxChecker.MESSAGEFLOW_END_MUST_BE_PARTICIPANT = "The message flow's target must be a participant.";
+ORYX.I18N.SyntaxChecker.CONV_LINK_CANNOT_CONNECT_CONV_NODES = "The conversation link must connect a communication or sub conversation node with a participant.";

+ 106 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor/i18n/translation_signavio_de.js

@@ -0,0 +1,106 @@
+Ext.PagingToolbar.prototype.firstText = "Erste Seite";
+Ext.PagingToolbar.prototype.prevText = "Vorherige Seite";
+Ext.PagingToolbar.prototype.nextText = "Nächste Seite";
+Ext.PagingToolbar.prototype.lastText  = "Letzte Seite";
+	
+
+ORYX.I18N.PropertyWindow.dateFormat = "d.m.y";
+
+
+ORYX.I18N.View.East = "Attribute";
+ORYX.I18N.View.West = "Modellierungselemente";
+
+ORYX.I18N.Oryx.pleaseWait = "Der Signavio Process Editor wird geladen. Bitte warten...";
+ORYX.I18N.AddDocker.add = "Docker hinzufügen";
+ORYX.I18N.AddDocker.del = "Docker löschen";
+ORYX.I18N.ERDFSupport.noCanvas = "Das XML Dokument enthält keinen Canvas Knoten.";
+ORYX.I18N.ERDFSupport.deprText = "Der Export nach eRDF wird nicht empfohlen, da dieses Format in zukünftigen Versionen des Signavio Process Editors nicht mehr unterstützt wird. Verwenden Sie stattdessen den Export nach JSON, falls möglich. Wollen Sie dennoch das Model nach eRDF exportieren?";
+ORYX.I18N.Save.unsavedData = "Das Diagramm enthält nicht gespeicherte Daten. Sind Sie sicher, dass Sie den Editor schließen möchten?";
+ORYX.I18N.Save.pleaseWait = "Bitte warten Sie, während<br/>das Diagramm gespeichert wird.";
+ORYX.I18N.File.info = "Info";
+ORYX.I18N.File.infoDesc = "Info";
+ORYX.I18N.PropertyWindow.name = "Attribut";
+ORYX.I18N.View.zoomStandard = "Zoom: Originalgröße";
+ORYX.I18N.View.zoomStandardDesc = "Zoom: Originalgröße";
+ORYX.I18N.View.zoomFitToModel = "Zoom: Modellgröße";
+ORYX.I18N.View.zoomFitToModelDesc = "Zoom: Modellgröße";
+ORYX.I18N.ShapeRepository.title = "Modellierungselemente";
+ORYX.I18N.Save.dialogLabelComment = "Änderungs-\nkommentar";
+
+ORYX.I18N.Save.saveAs = "Kopie speichern...";
+ORYX.I18N.Save.saveAsDesc = "Kopie speichern...";
+ORYX.I18N.Save.saveAsTitle = "Kopie speichern...";
+ORYX.I18N.Save.savedAs = "Kopie gespeichert";
+ORYX.I18N.Save.savedDescription = "Das kopierte Diagramm ist unter folgendem Link gespeichert";
+ORYX.I18N.Save.notAuthorized = "Sie sind derzeit nicht angemeldet. Bitte melden Sie sich in einem <a href='/p/login' target='_blank'>neuen Fenstern</a> an, damit Sie diese Model speichern können."
+ORYX.I18N.Save.transAborted = "Die Anfrage zum Speichern Ihres Diagramms hat zu lange gedauert. Bitte benutzen Sie eine schnellere Internetverbindung. Wenn Sie eine kabellose Internetverbindung benutzen, dann überprüfen Sie bitte die Signalstärke.";
+ORYX.I18N.Save.noRights = "Sie haben nicht die benötigten Rechte, um das Diagramm abzuspeichern. Bitte überprüfen Sie im <a href='/p/explorer' target='_blank'>Signavio Explorer</a>, ob Sie noch die benötigten Rechte im Zielordner besitzen.";
+ORYX.I18N.Save.comFailed = "Die Kommunikation mit dem Signavio Server ist fehlgeschlagen. Bitte überprüfen Sie Ihre Internetverbindung. Wenn das Problem weiterhin besteht, wenden Sie sich bitte an den Signavio Support über das Briefumschlagssymbol in der Toolbar.";
+ORYX.I18N.Save.failed = "Beim Speichern Ihres Diagramms ist ein Problem aufgetreten. Bitte versuchen Sie es erneut. Wenn das Problem weiterhin besteht, wenden Sie sich bitte an den Signavio Support über das Briefumschlagssymbol in der Toolbar.";
+ORYX.I18N.Save.exception = "Beim Speichern Ihres Diagramms sind einige Probleme aufgetreten. Bitte versuchen Sie es erneut. Wenn das Problem weiterhin besteht, wenden Sie sich bitte an den Signavio Support über das Briefumschlagssymbol in der Toolbar.";
+ORYX.I18N.Save.retrieveData = "Bitte warten, Daten werden geladen";
+
+/** New Language Properties: 10.6.09*/
+if(!ORYX.I18N.ShapeMenuPlugin) ORYX.I18N.ShapeMenuPlugin = {};
+ORYX.I18N.ShapeMenuPlugin.morphMsg = "Umwandeln";
+ORYX.I18N.ShapeMenuPlugin.morphWarningTitleMsg = "Umwandeln";
+ORYX.I18N.ShapeMenuPlugin.morphWarningMsg = "Einige Kindelemente können nicht im neuen Element enthalten sein.<br/>Möchten Sie dennoch das Element umwandeln?";
+
+if (!Signavio) { var Signavio = {}; }
+if (!Signavio.I18N) { Signavio.I18N = {} }
+if (!Signavio.I18N.Editor) { Signavio.I18N.Editor = {} }
+
+if (!Signavio.I18N.Editor.Linking) { Signavio.I18N.Editor.Linking = {} }
+Signavio.I18N.Editor.Linking.CreateDiagram = "Neues Diagramm erstellen:";
+Signavio.I18N.Editor.Linking.UseDiagram = "Vorhandenes Diagramm verwenden";
+Signavio.I18N.Editor.Linking.UseLink = "Web-Link verwenden";
+Signavio.I18N.Editor.Linking.CreateTitle = "Verlinkung setzen";
+Signavio.I18N.Editor.Linking.Close = "Schließen";
+Signavio.I18N.Editor.Linking.Cancel = "Abbrechen";
+Signavio.I18N.Editor.Linking.UseName = "Diagrammnamen übernehmen";
+Signavio.I18N.Editor.Linking.UseNameHint = "Ersetzt den Bezeichner des aktuellen Elements ({type}) durch den Namen des zu verlinkenden Diagramms.";
+Signavio.I18N.Editor.Linking.AlertSelectModel = "Bitte selektieren Sie ein Diagramm.";
+Signavio.I18N.Editor.Linking.ButtonLink = "Verlinkung setzen";
+Signavio.I18N.Editor.Linking.LinkNoAccess = "Sie haben keine Berechtigung für das Diagramm.";
+Signavio.I18N.Editor.Linking.LinkUnavailable = "Das Diagramm ist nicht verfügbar.";
+Signavio.I18N.Editor.Linking.RemoveLink = "Link löschen";
+Signavio.I18N.Editor.Linking.EditLink = "Link ändern";
+Signavio.I18N.Editor.Linking.OpenLink = "Öffnen";
+Signavio.I18N.Editor.Linking.BrokenLink = "Der Link ist nicht verfügbar!";
+Signavio.I18N.Editor.Linking.PreviewTitle = "Vorschau";
+
+if(!ORYX.I18N.PropertyWindow) ORYX.I18N.PropertyWindow = {};
+ORYX.I18N.PropertyWindow.oftenUsed = "Hauptattribute";
+ORYX.I18N.PropertyWindow.moreProps = "Weitere Attribute";
+ORYX.I18N.PropertyWindow.characteristicNr = "Kennzahlen";
+ORYX.I18N.PropertyWindow.meta = "Eigene Attribute";
+
+if(!ORYX.I18N.PropertyWindow.Category){ORYX.I18N.PropertyWindow.Category = {}}
+ORYX.I18N.PropertyWindow.Category.popular = "Hauptattribute";
+ORYX.I18N.PropertyWindow.Category.characteristicnr = "Kennzahlen";
+ORYX.I18N.PropertyWindow.Category.others = "Weitere Attribute";
+ORYX.I18N.PropertyWindow.Category.meta = "Eigene Attribute";
+
+if(!ORYX.I18N.PropertyWindow.ListView) ORYX.I18N.PropertyWindow.ListView = {};
+ORYX.I18N.PropertyWindow.ListView.title = "Attribut: ";
+ORYX.I18N.PropertyWindow.ListView.dataViewLabel = "Bereits vorhandene Einträge";
+ORYX.I18N.PropertyWindow.ListView.dataViewEmptyText = "Es sind noch keine Einträge vorhanden.";
+ORYX.I18N.PropertyWindow.ListView.addEntryLabel = "Neuen Eintrag hinzufügen";
+ORYX.I18N.PropertyWindow.ListView.buttonAdd = "Hinzufügen";
+ORYX.I18N.PropertyWindow.ListView.save = "Speichern";
+ORYX.I18N.PropertyWindow.ListView.cancel = "Abbrachen";
+
+if(!Signavio.I18N.Buttons) Signavio.I18N.Buttons = {};
+Signavio.I18N.Buttons.save		= "Speichern";
+Signavio.I18N.Buttons.cancel 	= "Abbrechen";
+Signavio.I18N.Buttons.remove	= "Entfernen";
+
+if(!Signavio.I18N.btn) {Signavio.I18N.btn = {};}
+Signavio.I18N.btn.btnEdit = "Editieren";
+Signavio.I18N.btn.btnRemove = "Löschen";
+Signavio.I18N.btn.moveUp = "Nach oben";
+Signavio.I18N.btn.moveDown = "Nach unten";
+
+if(!Signavio.I18N.field) {Signavio.I18N.field = {};}
+Signavio.I18N.field.Url = "URL";
+Signavio.I18N.field.UrlLabel = "Label";

+ 108 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor/i18n/translation_signavio_en_us.js

@@ -0,0 +1,108 @@
+ORYX.I18N.PropertyWindow.dateFormat = "d/m/y";
+
+ORYX.I18N.View.East = "Attributes";
+ORYX.I18N.View.West = "Modeling Elements";
+
+ORYX.I18N.Oryx.title	= "Signavio";
+ORYX.I18N.Oryx.pleaseWait = "Please wait while the Signavio Process Editor is loading...";
+ORYX.I18N.Edit.cutDesc = "Cuts the selection into the clipboard";
+ORYX.I18N.Edit.copyDesc = "Copies the selection into the clipboard";
+ORYX.I18N.Edit.pasteDesc = "Pastes the clipboard to the canvas";
+ORYX.I18N.ERDFSupport.noCanvas = "The xml document has no canvas node included!";
+ORYX.I18N.ERDFSupport.noSS = "The Signavio Process Editor canvas node has no stencil set definition included!";
+ORYX.I18N.ERDFSupport.deprText = "Exporting to eRDF is not recommended anymore because the support will be stopped in future versions of the Signavio Process Editor. If possible, export the model to JSON. Do you want to export anyway?";
+ORYX.I18N.Save.pleaseWait = "Please wait<br/>while saving...";
+
+ORYX.I18N.Save.saveAs = "Save a copy...";
+ORYX.I18N.Save.saveAsDesc = "Save a copy...";
+ORYX.I18N.Save.saveAsTitle = "Save a copy...";
+ORYX.I18N.Save.savedAs = "Copy saved";
+ORYX.I18N.Save.savedDescription = "The process diagram is stored under";
+ORYX.I18N.Save.notAuthorized = "You are currently not logged in. Please <a href='/p/login' target='_blank'>log in</a> in a new window so that you can save the current diagram."
+ORYX.I18N.Save.transAborted = "The saving request took too long. You may use a faster internet connection. If you use wireless LAN, please check the strength of your connection.";
+ORYX.I18N.Save.noRights = "You do not have the required rights to store that model. Please check in the <a href='/p/explorer' target='_blank'>Signavio Explorer</a>, if you still have the rights to write in the target directory.";
+ORYX.I18N.Save.comFailed = "The communication with the Signavio server failed. Please check your internet connection. If the problem resides, please contact the Signavio Support via the envelope symbol in the toolbar.";
+ORYX.I18N.Save.failed = "Something went wrong when trying to save your diagram. Please try again. If the problem resides, please contact the Signavio Support via the envelope symbol in the toolbar.";
+ORYX.I18N.Save.exception = "Some exceptions are raised while trying to save your diagram. Please try again. If the problem resides, please contact the Signavio Support via the envelope symbol in the toolbar.";
+ORYX.I18N.Save.retrieveData = "Please wait, data is retrieving.";
+
+/** New Language Properties: 10.6.09*/
+if(!ORYX.I18N.ShapeMenuPlugin) ORYX.I18N.ShapeMenuPlugin = {};
+ORYX.I18N.ShapeMenuPlugin.morphMsg = "Transform shape";
+ORYX.I18N.ShapeMenuPlugin.morphWarningTitleMsg = "Transform shape";
+ORYX.I18N.ShapeMenuPlugin.morphWarningMsg = "There are child shape which can not be contained in the transformed element.<br/>Do you want to transform anyway?";
+
+if (!Signavio) { var Signavio = {}; }
+if (!Signavio.I18N) { Signavio.I18N = {} }
+if (!Signavio.I18N.Editor) { Signavio.I18N.Editor = {} }
+
+if (!Signavio.I18N.Editor.Linking) { Signavio.I18N.Editor.Linking = {} }
+Signavio.I18N.Editor.Linking.CreateDiagram = "Create a new diagram";
+Signavio.I18N.Editor.Linking.UseDiagram = "Use existing diagram";
+Signavio.I18N.Editor.Linking.UseLink = "Use web link";
+Signavio.I18N.Editor.Linking.Close = "Close";
+Signavio.I18N.Editor.Linking.Cancel = "Cancel";
+Signavio.I18N.Editor.Linking.UseName = "Adopt diagram name";
+Signavio.I18N.Editor.Linking.UseNameHint = "Replaces the current name of the modeling element ({type}) with the name of the linked diagram.";
+Signavio.I18N.Editor.Linking.CreateTitle = "Establish link";
+Signavio.I18N.Editor.Linking.AlertSelectModel = "You have to select a model.";
+Signavio.I18N.Editor.Linking.ButtonLink = "Link diagram";
+Signavio.I18N.Editor.Linking.LinkNoAccess = "You have no access to this diagram.";
+Signavio.I18N.Editor.Linking.LinkUnavailable = "The diagram is unavailable.";
+Signavio.I18N.Editor.Linking.RemoveLink = "Remove link";
+Signavio.I18N.Editor.Linking.EditLink = "Edit Link";
+Signavio.I18N.Editor.Linking.OpenLink = "Open";
+Signavio.I18N.Editor.Linking.BrokenLink = "The link is broken!";
+Signavio.I18N.Editor.Linking.PreviewTitle = "Preview";
+
+if(!Signavio.I18N.Glossary_Support) { Signavio.I18N.Glossary_Support = {}; }
+Signavio.I18N.Glossary_Support.renameEmpty = "No dictionary entry";
+Signavio.I18N.Glossary_Support.renameLoading = "Searching...";
+
+/** New Language Properties: 08.09.2009*/
+if(!ORYX.I18N.PropertyWindow) ORYX.I18N.PropertyWindow = {};
+ORYX.I18N.PropertyWindow.oftenUsed = "Main properties";
+ORYX.I18N.PropertyWindow.moreProps = "More properties";
+
+ORYX.I18N.PropertyWindow.btnOpen = "Open";
+ORYX.I18N.PropertyWindow.btnRemove = "Remove";
+ORYX.I18N.PropertyWindow.btnEdit = "Edit";
+ORYX.I18N.PropertyWindow.btnUp = "Move up";
+ORYX.I18N.PropertyWindow.btnDown = "Move down";
+ORYX.I18N.PropertyWindow.createNew = "Create new";
+
+if(!ORYX.I18N.PropertyWindow) ORYX.I18N.PropertyWindow = {};
+ORYX.I18N.PropertyWindow.oftenUsed = "Main attributes";
+ORYX.I18N.PropertyWindow.moreProps = "More attributes";
+ORYX.I18N.PropertyWindow.characteristicNr = "Cost &amp; Resource Analysis";
+ORYX.I18N.PropertyWindow.meta = "Custom attributes";
+
+if(!ORYX.I18N.PropertyWindow.Category){ORYX.I18N.PropertyWindow.Category = {}}
+ORYX.I18N.PropertyWindow.Category.popular = "Main Attributes";
+ORYX.I18N.PropertyWindow.Category.characteristicnr = "Cost &amp; Resource Analysis";
+ORYX.I18N.PropertyWindow.Category.others = "More Attributes";
+ORYX.I18N.PropertyWindow.Category.meta = "Custom Attributes";
+
+if(!ORYX.I18N.PropertyWindow.ListView) ORYX.I18N.PropertyWindow.ListView = {};
+ORYX.I18N.PropertyWindow.ListView.title = "Edit: ";
+ORYX.I18N.PropertyWindow.ListView.dataViewLabel = "Already existing entries.";
+ORYX.I18N.PropertyWindow.ListView.dataViewEmptyText = "No list entries.";
+ORYX.I18N.PropertyWindow.ListView.addEntryLabel = "Add a new entry";
+ORYX.I18N.PropertyWindow.ListView.buttonAdd = "Add";
+ORYX.I18N.PropertyWindow.ListView.save = "Save";
+ORYX.I18N.PropertyWindow.ListView.cancel = "Cancel";
+
+if(!Signavio.I18N.Buttons) Signavio.I18N.Buttons = {};
+Signavio.I18N.Buttons.save		= "Save";
+Signavio.I18N.Buttons.cancel 	= "Cancel";
+Signavio.I18N.Buttons.remove	= "Remove";
+
+if(!Signavio.I18N.btn) {Signavio.I18N.btn = {};}
+Signavio.I18N.btn.btnEdit = "Edit";
+Signavio.I18N.btn.btnRemove = "Remove";
+Signavio.I18N.btn.moveUp = "Move up";
+Signavio.I18N.btn.moveDown = "Move down";
+
+if(!Signavio.I18N.field) {Signavio.I18N.field = {};}
+Signavio.I18N.field.Url = "URL";
+Signavio.I18N.field.UrlLabel = "Label";

Datei-Diff unterdrückt, da er zu groß ist
+ 24510 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor/oryx.debug.js


Datei-Diff unterdrückt, da er zu groß ist
+ 30 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/editor/oryx.js


+ 0 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-flowable-modeler/src/main/resources/static/workflow/editor-app/eventbus.js


Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.