UpdateLabelHandler.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import {
  2. setLabel,
  3. getLabel
  4. } from '../LabelUtil';
  5. import {
  6. getExternalLabelMid,
  7. isLabelExternal,
  8. hasExternalLabel,
  9. isLabel
  10. } from '../../../util/LabelUtil';
  11. import {
  12. is
  13. } from '../../../util/ModelUtil';
  14. var NULL_DIMENSIONS = {
  15. width: 0,
  16. height: 0
  17. };
  18. /**
  19. * A handler that updates the text of a BPMN element.
  20. */
  21. export default function UpdateLabelHandler(modeling, textRenderer) {
  22. /**
  23. * Set the label and return the changed elements.
  24. *
  25. * Element parameter can be label itself or connection (i.e. sequence flow).
  26. *
  27. * @param {djs.model.Base} element
  28. * @param {string} text
  29. */
  30. function setText(element, text) {
  31. // external label if present
  32. var label = element.label || element;
  33. var labelTarget = element.labelTarget || element;
  34. setLabel(label, text, labelTarget !== label);
  35. return [ label, labelTarget ];
  36. }
  37. function preExecute(ctx) {
  38. var element = ctx.element,
  39. businessObject = element.businessObject,
  40. newLabel = ctx.newLabel;
  41. if (!isLabel(element)
  42. && isLabelExternal(element)
  43. && !hasExternalLabel(element)
  44. && !isEmptyText(newLabel)) {
  45. // create label
  46. var paddingTop = 7;
  47. var labelCenter = getExternalLabelMid(element);
  48. labelCenter = {
  49. x: labelCenter.x,
  50. y: labelCenter.y + paddingTop
  51. };
  52. modeling.createLabel(element, labelCenter, {
  53. id: businessObject.id + '_label',
  54. businessObject: businessObject
  55. });
  56. }
  57. }
  58. function execute(ctx) {
  59. ctx.oldLabel = getLabel(ctx.element);
  60. return setText(ctx.element, ctx.newLabel);
  61. }
  62. function revert(ctx) {
  63. return setText(ctx.element, ctx.oldLabel);
  64. }
  65. function postExecute(ctx) {
  66. var element = ctx.element,
  67. label = element.label || element,
  68. newLabel = ctx.newLabel,
  69. newBounds = ctx.newBounds,
  70. hints = ctx.hints || {};
  71. // ignore internal labels for elements except text annotations
  72. if (!isLabel(label) && !is(label, 'bpmn:TextAnnotation')) {
  73. return;
  74. }
  75. if (isLabel(label) && isEmptyText(newLabel)) {
  76. if (hints.removeShape !== false) {
  77. modeling.removeShape(label, { unsetLabel: false });
  78. }
  79. return;
  80. }
  81. var text = getLabel(label);
  82. // resize element based on label _or_ pre-defined bounds
  83. if (typeof newBounds === 'undefined') {
  84. newBounds = textRenderer.getExternalLabelBounds(label, text);
  85. }
  86. // setting newBounds to false or _null_ will
  87. // disable the postExecute resize operation
  88. if (newBounds) {
  89. modeling.resizeShape(label, newBounds, NULL_DIMENSIONS);
  90. }
  91. }
  92. // API
  93. this.preExecute = preExecute;
  94. this.execute = execute;
  95. this.revert = revert;
  96. this.postExecute = postExecute;
  97. }
  98. UpdateLabelHandler.$inject = [
  99. 'modeling',
  100. 'textRenderer'
  101. ];
  102. // helpers ///////////////////////
  103. function isEmptyText(label) {
  104. return !label || !label.trim();
  105. }