@idraw/core 0.4.0-beta.33 → 0.4.0-beta.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,12 @@
1
- import { is, calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, calcElementCenterFromVertexes, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions, getElementPositionFromList, deepResizeGroupElement, getElementSize } from '@idraw/util';
1
+ import { is, calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, calcElementCenterFromVertexes, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions, getElementPositionFromList, getElementPositionMapFromList, deepResizeGroupElement, getElementSize } from '@idraw/util';
2
2
  import { drawHoverVertexesWrapper, drawLockedVertexesWrapper, drawArea, drawListArea, drawGroupQueueVertexesWrappers, drawSelectedElementControllersVertexes } from './draw-wrapper';
3
3
  import { drawReferenceLines } from './draw-reference';
4
4
  import { getPointTarget, resizeElement, rotateElement, getSelectedListArea, calcSelectedElementsArea, isElementInGroup, isPointInViewActiveGroup, calcMoveInGroup } from './util';
5
- import { middlewareEventSelect, middlewareEventSelectClear, middlewareEventSelectInGroup, middlewareEventSnapToGrid, keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keySelectedElementPosition, keyIsMoving, keyEnableSelectInGroup, keyEnableSnapToGrid, controllerSize, defaultStyle } from './config';
5
+ import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keySelectedElementPosition, keyIsMoving, keyEnableSelectInGroup, keyEnableSnapToGrid, controllerSize, defaultStyle } from './config';
6
6
  import { calcReferenceInfo } from './reference';
7
- import { middlewareEventTextEdit } from '../text-editor';
8
- import { eventChange } from '../../config';
7
+ import { coreEventKeys } from '../../config';
9
8
  import { keyLayoutIsSelected } from '../layout-selector';
10
9
  export { keySelectedElementList, keyHoverElement, keyActionType, keyResizeType, keyGroupQueue };
11
- export { middlewareEventSelect, middlewareEventSelectClear, middlewareEventSelectInGroup, middlewareEventSnapToGrid };
12
10
  export const MiddlewareSelector = (opts, config) => {
13
11
  const innerConfig = Object.assign(Object.assign({}, defaultStyle), config);
14
12
  const { activeColor, activeAreaColor, lockedColor, referenceColor } = innerConfig;
@@ -19,6 +17,7 @@ export const MiddlewareSelector = (opts, config) => {
19
17
  let moveOriginalStartPoint = null;
20
18
  let moveOriginalStartElementSize = null;
21
19
  let inBusyMode = null;
20
+ let hasChangedData = null;
22
21
  sharer.setSharedStorage(keyActionType, null);
23
22
  sharer.setSharedStorage(keyEnableSnapToGrid, true);
24
23
  const getActiveElements = () => {
@@ -72,7 +71,10 @@ export const MiddlewareSelector = (opts, config) => {
72
71
  sharer.setSharedStorage(keySelectedElementPosition, []);
73
72
  }
74
73
  if ((opts === null || opts === void 0 ? void 0 : opts.triggerEvent) === true) {
75
- eventHub.trigger(middlewareEventSelect, { uuids: list.map((elem) => elem.uuid) });
74
+ const uuids = list.map((elem) => elem.uuid);
75
+ const data = sharer.getActiveStorage('data');
76
+ const positionMap = getElementPositionMapFromList(uuids, (data === null || data === void 0 ? void 0 : data.elements) || []);
77
+ eventHub.trigger(coreEventKeys.SELECT, { uuids, positions: list.map((elem) => [...positionMap[elem.uuid]]) });
76
78
  }
77
79
  };
78
80
  const pointTargetBaseOptions = () => {
@@ -105,7 +107,7 @@ export const MiddlewareSelector = (opts, config) => {
105
107
  sharer.setSharedStorage(keyIsMoving, null);
106
108
  };
107
109
  clear();
108
- const selectCallback = ({ uuids, positions }) => {
110
+ const selectCallback = ({ uuids = [], positions }) => {
109
111
  let elements = [];
110
112
  const actionType = sharer.getSharedStorage(keyActionType);
111
113
  const data = sharer.getActiveStorage('data');
@@ -144,16 +146,16 @@ export const MiddlewareSelector = (opts, config) => {
144
146
  return {
145
147
  name: '@middleware/selector',
146
148
  use() {
147
- eventHub.on(middlewareEventSelect, selectCallback);
148
- eventHub.on(middlewareEventSelectClear, selectClearCallback);
149
- eventHub.on(middlewareEventSelectInGroup, selectInGroupCallback);
150
- eventHub.on(middlewareEventSnapToGrid, setSnapToSnapCallback);
149
+ eventHub.on(coreEventKeys.SELECT, selectCallback);
150
+ eventHub.on(coreEventKeys.CLEAR_SELECT, selectClearCallback);
151
+ eventHub.on(coreEventKeys.SELECT_IN_GROUP, selectInGroupCallback);
152
+ eventHub.on(coreEventKeys.SNAP_TO_GRID, setSnapToSnapCallback);
151
153
  },
152
154
  disuse() {
153
- eventHub.off(middlewareEventSelect, selectCallback);
154
- eventHub.off(middlewareEventSelectClear, selectClearCallback);
155
- eventHub.off(middlewareEventSelectInGroup, selectInGroupCallback);
156
- eventHub.off(middlewareEventSnapToGrid, setSnapToSnapCallback);
155
+ eventHub.off(coreEventKeys.SELECT, selectCallback);
156
+ eventHub.off(coreEventKeys.CLEAR_SELECT, selectClearCallback);
157
+ eventHub.off(coreEventKeys.SELECT_IN_GROUP, selectInGroupCallback);
158
+ eventHub.off(coreEventKeys.SNAP_TO_GRID, setSnapToSnapCallback);
157
159
  },
158
160
  hover: (e) => {
159
161
  var _a, _b, _c, _d, _e;
@@ -167,7 +169,7 @@ export const MiddlewareSelector = (opts, config) => {
167
169
  }
168
170
  const cursor = target.type;
169
171
  if (inBusyMode === null) {
170
- eventHub.trigger('cursor', {
172
+ eventHub.trigger(coreEventKeys.CURSOR, {
171
173
  type: cursor,
172
174
  groupQueue: target.groupQueue,
173
175
  element: target.elements[0]
@@ -263,16 +265,15 @@ export const MiddlewareSelector = (opts, config) => {
263
265
  groupQueue
264
266
  })) {
265
267
  const target = getPointTarget(e.point, pointTargetBaseOptions());
266
- if (((_a = target === null || target === void 0 ? void 0 : target.elements) === null || _a === void 0 ? void 0 : _a.length) === 1 && ((_c = (_b = target.elements[0]) === null || _b === void 0 ? void 0 : _b.operations) === null || _c === void 0 ? void 0 : _c.locked) === true) {
267
- return;
268
- }
269
- else {
270
- updateHoverElement(null);
271
- }
268
+ const isLockedElement = ((_a = target === null || target === void 0 ? void 0 : target.elements) === null || _a === void 0 ? void 0 : _a.length) === 1 && ((_c = (_b = target.elements[0]) === null || _b === void 0 ? void 0 : _b.operations) === null || _c === void 0 ? void 0 : _c.locked) === true;
269
+ updateHoverElement(null);
272
270
  if (((_d = target === null || target === void 0 ? void 0 : target.elements) === null || _d === void 0 ? void 0 : _d.length) === 1) {
273
271
  moveOriginalStartElementSize = getElementSize(target === null || target === void 0 ? void 0 : target.elements[0]);
274
272
  }
275
- if (target.type === 'over-element' && ((_e = target === null || target === void 0 ? void 0 : target.elements) === null || _e === void 0 ? void 0 : _e.length) === 1) {
273
+ if (isLockedElement === true) {
274
+ clear();
275
+ }
276
+ else if (target.type === 'over-element' && ((_e = target === null || target === void 0 ? void 0 : target.elements) === null || _e === void 0 ? void 0 : _e.length) === 1) {
276
277
  updateSelectedElementList([target.elements[0]], { triggerEvent: true });
277
278
  sharer.setSharedStorage(keyActionType, 'drag');
278
279
  }
@@ -297,30 +298,26 @@ export const MiddlewareSelector = (opts, config) => {
297
298
  });
298
299
  const target = getPointTarget(e.point, Object.assign(Object.assign({}, pointTargetBaseOptions()), { areaSize: listAreaSize, groupQueue: [] }));
299
300
  const isLockedElement = ((_g = target === null || target === void 0 ? void 0 : target.elements) === null || _g === void 0 ? void 0 : _g.length) === 1 && ((_j = (_h = target.elements[0]) === null || _h === void 0 ? void 0 : _h.operations) === null || _j === void 0 ? void 0 : _j.locked) === true;
300
- if (!isLockedElement) {
301
- updateHoverElement(null);
302
- }
301
+ updateHoverElement(null);
303
302
  if (((_k = target === null || target === void 0 ? void 0 : target.elements) === null || _k === void 0 ? void 0 : _k.length) === 1) {
304
303
  moveOriginalStartElementSize = getElementSize(target === null || target === void 0 ? void 0 : target.elements[0]);
305
304
  }
306
- if (!isLockedElement) {
307
- if (target.type === 'list-area') {
308
- sharer.setSharedStorage(keyActionType, 'drag-list');
309
- }
310
- else if (target.type === 'over-element' && ((_l = target === null || target === void 0 ? void 0 : target.elements) === null || _l === void 0 ? void 0 : _l.length) === 1) {
311
- updateSelectedElementList([target.elements[0]], { triggerEvent: true });
312
- sharer.setSharedStorage(keyActionType, 'drag');
313
- }
314
- else if ((_m = target.type) === null || _m === void 0 ? void 0 : _m.startsWith('resize-')) {
315
- sharer.setSharedStorage(keyResizeType, target.type);
316
- sharer.setSharedStorage(keyActionType, 'resize');
317
- }
318
- else {
319
- clear();
320
- sharer.setSharedStorage(keyActionType, 'area');
321
- sharer.setSharedStorage(keyAreaStart, e.point);
322
- updateSelectedElementList([], { triggerEvent: true });
323
- }
305
+ if (isLockedElement === true) {
306
+ clear();
307
+ sharer.setSharedStorage(keyActionType, 'area');
308
+ sharer.setSharedStorage(keyAreaStart, e.point);
309
+ updateSelectedElementList([], { triggerEvent: true });
310
+ }
311
+ else if (target.type === 'list-area') {
312
+ sharer.setSharedStorage(keyActionType, 'drag-list');
313
+ }
314
+ else if (target.type === 'over-element' && ((_l = target === null || target === void 0 ? void 0 : target.elements) === null || _l === void 0 ? void 0 : _l.length) === 1) {
315
+ updateSelectedElementList([target.elements[0]], { triggerEvent: true });
316
+ sharer.setSharedStorage(keyActionType, 'drag');
317
+ }
318
+ else if ((_m = target.type) === null || _m === void 0 ? void 0 : _m.startsWith('resize-')) {
319
+ sharer.setSharedStorage(keyResizeType, target.type);
320
+ sharer.setSharedStorage(keyActionType, 'resize');
324
321
  }
325
322
  else {
326
323
  clear();
@@ -346,6 +343,7 @@ export const MiddlewareSelector = (opts, config) => {
346
343
  const groupQueue = sharer.getSharedStorage(keyGroupQueue);
347
344
  const enableSnapToGrid = sharer.getSharedStorage(keyEnableSnapToGrid);
348
345
  if (actionType === 'drag') {
346
+ hasChangedData = true;
349
347
  inBusyMode = 'drag';
350
348
  if (data && (elems === null || elems === void 0 ? void 0 : elems.length) === 1 && moveOriginalStartElementSize && originalStart && end && ((_b = (_a = elems[0]) === null || _a === void 0 ? void 0 : _a.operations) === null || _b === void 0 ? void 0 : _b.locked) !== true) {
351
349
  const { moveX, moveY } = calcMoveInGroup(originalStart, end, groupQueue);
@@ -391,6 +389,7 @@ export const MiddlewareSelector = (opts, config) => {
391
389
  viewer.drawFrame();
392
390
  }
393
391
  else if (actionType === 'drag-list') {
392
+ hasChangedData = true;
394
393
  inBusyMode = 'drag-list';
395
394
  if (data && originalStart && start && end && (elems === null || elems === void 0 ? void 0 : elems.length) > 1) {
396
395
  const moveX = (end.x - start.x) / scale;
@@ -419,6 +418,7 @@ export const MiddlewareSelector = (opts, config) => {
419
418
  }
420
419
  else if (actionType === 'resize') {
421
420
  if (data && (elems === null || elems === void 0 ? void 0 : elems.length) === 1 && originalStart && moveOriginalStartElementSize && (resizeType === null || resizeType === void 0 ? void 0 : resizeType.startsWith('resize-'))) {
421
+ hasChangedData = true;
422
422
  inBusyMode = 'resize';
423
423
  const pointGroupQueue = [];
424
424
  groupQueue.forEach((group) => {
@@ -569,7 +569,10 @@ export const MiddlewareSelector = (opts, config) => {
569
569
  if (type === 'resize') {
570
570
  type = 'resizeElement';
571
571
  }
572
- eventHub.trigger(eventChange, { data, type, selectedElements, hoverElement });
572
+ if (hasChangedData) {
573
+ eventHub.trigger(coreEventKeys.CHANGE, { data, type, selectedElements, hoverElement });
574
+ hasChangedData = false;
575
+ }
573
576
  }
574
577
  viewer.drawFrame();
575
578
  };
@@ -602,7 +605,7 @@ export const MiddlewareSelector = (opts, config) => {
602
605
  }
603
606
  }
604
607
  else if (target.elements.length === 1 && ((_d = target.elements[0]) === null || _d === void 0 ? void 0 : _d.type) === 'text' && !((_f = (_e = target.elements[0]) === null || _e === void 0 ? void 0 : _e.operations) === null || _f === void 0 ? void 0 : _f.invisible)) {
605
- eventHub.trigger(middlewareEventTextEdit, {
608
+ eventHub.trigger(coreEventKeys.TEXT_EDIT, {
606
609
  element: target.elements[0],
607
610
  groupQueue: sharer.getSharedStorage(keyGroupQueue) || [],
608
611
  position: getElementPositionFromList((_g = target.elements[0]) === null || _g === void 0 ? void 0 : _g.uuid, ((_h = sharer.getActiveStorage('data')) === null || _h === void 0 ? void 0 : _h.elements) || []),
@@ -611,6 +614,44 @@ export const MiddlewareSelector = (opts, config) => {
611
614
  }
612
615
  sharer.setSharedStorage(keyActionType, null);
613
616
  },
617
+ contextMenu: (e) => {
618
+ var _a, _b, _c, _d, _e, _f, _g, _h;
619
+ const groupQueue = sharer.getSharedStorage(keyGroupQueue);
620
+ if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
621
+ if (isPointInViewActiveGroup(e.point, {
622
+ ctx: overlayContext,
623
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
624
+ viewSizeInfo: sharer.getActiveViewSizeInfo(),
625
+ groupQueue
626
+ })) {
627
+ const target = getPointTarget(e.point, pointTargetBaseOptions());
628
+ if (((_a = target === null || target === void 0 ? void 0 : target.elements) === null || _a === void 0 ? void 0 : _a.length) === 1 && ((_c = (_b = target.elements[0]) === null || _b === void 0 ? void 0 : _b.operations) === null || _c === void 0 ? void 0 : _c.locked) !== true) {
629
+ clear();
630
+ updateSelectedElementList([target.elements[0]], { triggerEvent: true });
631
+ viewer.drawFrame();
632
+ }
633
+ else if (!((_d = target === null || target === void 0 ? void 0 : target.elements) === null || _d === void 0 ? void 0 : _d.length)) {
634
+ clear();
635
+ }
636
+ }
637
+ return;
638
+ }
639
+ const listAreaSize = calcSelectedElementsArea(getActiveElements(), {
640
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
641
+ viewSizeInfo: sharer.getActiveViewSizeInfo(),
642
+ calculator
643
+ });
644
+ const target = getPointTarget(e.point, Object.assign(Object.assign({}, pointTargetBaseOptions()), { areaSize: listAreaSize, groupQueue: [] }));
645
+ if (((_e = target === null || target === void 0 ? void 0 : target.elements) === null || _e === void 0 ? void 0 : _e.length) === 1 && ((_g = (_f = target.elements[0]) === null || _f === void 0 ? void 0 : _f.operations) === null || _g === void 0 ? void 0 : _g.locked) !== true) {
646
+ clear();
647
+ updateSelectedElementList([target.elements[0]], { triggerEvent: true });
648
+ viewer.drawFrame();
649
+ return;
650
+ }
651
+ else if (!((_h = target === null || target === void 0 ? void 0 : target.elements) === null || _h === void 0 ? void 0 : _h.length)) {
652
+ clear();
653
+ }
654
+ },
614
655
  beforeDrawFrame({ snapshot }) {
615
656
  var _a;
616
657
  const { activeStore, sharedStore } = snapshot;
@@ -637,11 +678,11 @@ export const MiddlewareSelector = (opts, config) => {
637
678
  viewScaleInfo
638
679
  })
639
680
  : null;
640
- const isLocked = !!((_a = hoverElement === null || hoverElement === void 0 ? void 0 : hoverElement.operations) === null || _a === void 0 ? void 0 : _a.locked);
681
+ const isHoverLocked = !!((_a = hoverElement === null || hoverElement === void 0 ? void 0 : hoverElement.operations) === null || _a === void 0 ? void 0 : _a.locked);
641
682
  if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
642
683
  drawGroupQueueVertexesWrappers(overlayContext, groupQueueVertexesList, drawBaseOpts);
643
684
  if (hoverElement && actionType !== 'drag') {
644
- if (isLocked) {
685
+ if (isHoverLocked) {
645
686
  drawLockedVertexesWrapper(overlayContext, hoverElementVertexes, Object.assign(Object.assign({}, drawBaseOpts), { controller: calcElementSizeController(hoverElement, {
646
687
  groupQueue,
647
688
  controllerSize: 10,
@@ -652,7 +693,7 @@ export const MiddlewareSelector = (opts, config) => {
652
693
  drawHoverVertexesWrapper(overlayContext, hoverElementVertexes, drawBaseOpts);
653
694
  }
654
695
  }
655
- if (!isLocked && elem && ['select', 'drag', 'resize'].includes(actionType)) {
696
+ if (elem && ['select', 'drag', 'resize'].includes(actionType)) {
656
697
  drawSelectedElementControllersVertexes(overlayContext, selectedElementController, Object.assign(Object.assign({}, drawBaseOpts), { element: elem, calculator, hideControllers: !!isMoving && actionType === 'drag', style }));
657
698
  if (actionType === 'drag') {
658
699
  if (enableSnapToGrid === true) {
@@ -679,7 +720,7 @@ export const MiddlewareSelector = (opts, config) => {
679
720
  }
680
721
  else {
681
722
  if (hoverElement && actionType !== 'drag') {
682
- if (isLocked) {
723
+ if (isHoverLocked) {
683
724
  drawLockedVertexesWrapper(overlayContext, hoverElementVertexes, Object.assign(Object.assign({}, drawBaseOpts), { controller: calcElementSizeController(hoverElement, {
684
725
  groupQueue,
685
726
  controllerSize: 10,
@@ -690,7 +731,7 @@ export const MiddlewareSelector = (opts, config) => {
690
731
  drawHoverVertexesWrapper(overlayContext, hoverElementVertexes, drawBaseOpts);
691
732
  }
692
733
  }
693
- if (!isLocked && elem && ['select', 'drag', 'resize'].includes(actionType)) {
734
+ if (elem && ['select', 'drag', 'resize'].includes(actionType)) {
694
735
  drawSelectedElementControllersVertexes(overlayContext, selectedElementController, Object.assign(Object.assign({}, drawBaseOpts), { element: elem, calculator, hideControllers: !!isMoving && actionType === 'drag', style }));
695
736
  if (actionType === 'drag') {
696
737
  if (enableSnapToGrid === true) {
@@ -1,6 +1,5 @@
1
1
  import type { BoardMiddleware, CoreEventMap, Element, ViewScaleInfo, ElementPosition } from '@idraw/types';
2
- export declare const middlewareEventTextEdit = "@middleware/text-edit";
3
- export declare const middlewareEventTextChange = "@middleware/text-change";
2
+ import { coreEventKeys } from '../../config';
4
3
  type TextEditEvent = {
5
4
  element: Element<'text'>;
6
5
  position: ElementPosition;
@@ -16,6 +15,6 @@ type TextChangeEvent = {
16
15
  };
17
16
  position: ElementPosition;
18
17
  };
19
- type ExtendEventMap = Record<typeof middlewareEventTextEdit, TextEditEvent> & Record<typeof middlewareEventTextChange, TextChangeEvent>;
18
+ type ExtendEventMap = Record<typeof coreEventKeys.TEXT_EDIT, TextEditEvent> & Record<typeof coreEventKeys.TEXT_CHANGE, TextChangeEvent>;
20
19
  export declare const MiddlewareTextEditor: BoardMiddleware<ExtendEventMap, CoreEventMap & ExtendEventMap>;
21
20
  export {};
@@ -1,6 +1,5 @@
1
1
  import { limitAngle, getDefaultElementDetailConfig, enhanceFontFamliy } from '@idraw/util';
2
- export const middlewareEventTextEdit = '@middleware/text-edit';
3
- export const middlewareEventTextChange = '@middleware/text-change';
2
+ import { coreEventKeys } from '../../config';
4
3
  const defaultElementDetail = getDefaultElementDetailConfig();
5
4
  export const MiddlewareTextEditor = (opts) => {
6
5
  const { eventHub, boardContent, viewer, sharer } = opts;
@@ -12,6 +11,8 @@ export const MiddlewareTextEditor = (opts) => {
12
11
  const mask = document.createElement('div');
13
12
  let activeElem = null;
14
13
  let activePosition = [];
14
+ const id = `idraw-middleware-text-editor-${Math.random().toString(26).substring(2)}`;
15
+ mask.setAttribute('id', id);
15
16
  canvasWrapper.appendChild(textarea);
16
17
  canvasWrapper.style.position = 'absolute';
17
18
  mask.appendChild(canvasWrapper);
@@ -163,7 +164,7 @@ export const MiddlewareTextEditor = (opts) => {
163
164
  textarea.addEventListener('input', () => {
164
165
  if (activeElem && activePosition) {
165
166
  activeElem.detail.text = textarea.innerText || '';
166
- eventHub.trigger(middlewareEventTextChange, {
167
+ eventHub.trigger(coreEventKeys.TEXT_CHANGE, {
167
168
  element: {
168
169
  uuid: activeElem.uuid,
169
170
  detail: {
@@ -177,7 +178,7 @@ export const MiddlewareTextEditor = (opts) => {
177
178
  });
178
179
  textarea.addEventListener('blur', () => {
179
180
  if (activeElem && activePosition) {
180
- eventHub.trigger(middlewareEventTextChange, {
181
+ eventHub.trigger(coreEventKeys.TEXT_CHANGE, {
181
182
  element: {
182
183
  uuid: activeElem.uuid,
183
184
  detail: {
@@ -213,10 +214,10 @@ export const MiddlewareTextEditor = (opts) => {
213
214
  return {
214
215
  name: '@middleware/text-editor',
215
216
  use() {
216
- eventHub.on(middlewareEventTextEdit, textEditCallback);
217
+ eventHub.on(coreEventKeys.TEXT_EDIT, textEditCallback);
217
218
  },
218
219
  disuse() {
219
- eventHub.off(middlewareEventTextEdit, textEditCallback);
220
+ eventHub.off(coreEventKeys.TEXT_EDIT, textEditCallback);
220
221
  }
221
222
  };
222
223
  };