@node-projects/web-component-designer 0.1.90 → 0.1.92

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.
Files changed (59) hide show
  1. package/assets/images/tools/PanTool.svg +5 -0
  2. package/config/elements-native.json +1 -0
  3. package/dist/elements/helper/ElementHelper.js +9 -4
  4. package/dist/elements/helper/SelectionHelper.d.ts +2 -0
  5. package/dist/elements/helper/SelectionHelper.js +51 -0
  6. package/dist/elements/helper/TransformHelper.js +5 -0
  7. package/dist/elements/item/DesignItem.d.ts +1 -0
  8. package/dist/elements/item/DesignItem.js +10 -0
  9. package/dist/elements/item/IDesignItem.d.ts +1 -0
  10. package/dist/elements/services/DefaultServiceBootstrap.js +1 -1
  11. package/dist/elements/services/dragDropService/DragDropService.js +1 -2
  12. package/dist/elements/services/placementService/AbsolutePlacementService.d.ts +19 -0
  13. package/dist/elements/services/placementService/AbsolutePlacementService.js +153 -0
  14. package/dist/elements/services/placementService/DefaultPlacementService copy.d.ts +19 -0
  15. package/dist/elements/services/placementService/DefaultPlacementService copy.js +151 -0
  16. package/dist/elements/services/placementService/DefaultPlacementService.d.ts +1 -1
  17. package/dist/elements/services/placementService/DefaultPlacementService.js +3 -1
  18. package/dist/elements/services/placementService/FlexBoxPlacementService.d.ts +1 -1
  19. package/dist/elements/services/placementService/FlexBoxPlacementService.js +1 -1
  20. package/dist/elements/services/placementService/GridPlacementService.d.ts +1 -1
  21. package/dist/elements/services/placementService/GridPlacementService.js +1 -1
  22. package/dist/elements/services/placementService/IPlacementService.d.ts +1 -1
  23. package/dist/elements/services/propertiesService/propertyEditors/FontPropertyEditor.d.ts +2 -1
  24. package/dist/elements/services/propertiesService/propertyEditors/FontPropertyEditor.js +9 -6
  25. package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +0 -1
  26. package/dist/elements/widgets/designerView/designerCanvas.d.ts +0 -1
  27. package/dist/elements/widgets/designerView/designerCanvas.js +0 -9
  28. package/dist/elements/widgets/designerView/extensions/AltToEnterContainerExtension.js +1 -1
  29. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.d.ts +2 -8
  30. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +60 -53
  31. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.d.ts +1 -0
  32. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.js +5 -1
  33. package/dist/elements/widgets/designerView/extensions/ElementDragTitleExtension.js +3 -3
  34. package/dist/elements/widgets/designerView/extensions/ExtensionManager.d.ts +1 -0
  35. package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +15 -0
  36. package/dist/elements/widgets/designerView/extensions/ExtensionType.d.ts +2 -1
  37. package/dist/elements/widgets/designerView/extensions/ExtensionType.js +2 -1
  38. package/dist/elements/widgets/designerView/extensions/GrayOutExtension.d.ts +0 -2
  39. package/dist/elements/widgets/designerView/extensions/GrayOutExtension.js +6 -9
  40. package/dist/elements/widgets/designerView/extensions/IExtensionManger.d.ts +1 -0
  41. package/dist/elements/widgets/designerView/tools/PointerTool.d.ts +2 -1
  42. package/dist/elements/widgets/designerView/tools/PointerTool.js +26 -10
  43. package/dist/elements/widgets/designerView/tools/TextTool.js +3 -5
  44. package/dist/elements/widgets/designerView/tools/toolBar/buttons/PointerToolButtonProvider.js +4 -1
  45. package/dist/elements/widgets/designerView/tools/toolBar/popups/AbstractBaseToolPopup.d.ts +5 -0
  46. package/dist/elements/widgets/designerView/tools/toolBar/popups/AbstractBaseToolPopup.js +37 -0
  47. package/dist/elements/widgets/designerView/tools/toolBar/popups/DrawToolPopup.d.ts +3 -3
  48. package/dist/elements/widgets/designerView/tools/toolBar/popups/DrawToolPopup.js +6 -33
  49. package/dist/elements/widgets/designerView/tools/toolBar/popups/PointerToolPopup copy.d.ts +6 -0
  50. package/dist/elements/widgets/designerView/tools/toolBar/popups/PointerToolPopup copy.js +49 -0
  51. package/dist/elements/widgets/designerView/tools/toolBar/popups/PointerToolPopup.d.ts +4 -0
  52. package/dist/elements/widgets/designerView/tools/toolBar/popups/PointerToolPopup.js +16 -0
  53. package/dist/elements/widgets/designerView/tools/toolBar/popups/SelectionToolPopup copy.d.ts +6 -0
  54. package/dist/elements/widgets/designerView/tools/toolBar/popups/SelectionToolPopup copy.js +49 -0
  55. package/dist/elements/widgets/designerView/tools/toolBar/popups/SelectionToolPopup.d.ts +2 -4
  56. package/dist/elements/widgets/designerView/tools/toolBar/popups/SelectionToolPopup.js +3 -36
  57. package/dist/index.d.ts +5 -0
  58. package/dist/index.js +5 -0
  59. package/package.json +24 -24
@@ -5,8 +5,12 @@ export class FontPropertyEditor extends BasePropertyEditor {
5
5
  super(property);
6
6
  let element = document.createElement("select");
7
7
  this.element = element;
8
+ FontPropertyEditor.addFontsToSelect(element);
9
+ this.element.onchange = (e) => this._valueChanged(this.element.value);
10
+ }
11
+ static addFontsToSelect(select) {
8
12
  if (FontPropertyEditor.fontList) {
9
- this.parseFontList();
13
+ FontPropertyEditor.parseFontList(select);
10
14
  //@ts-ignore
11
15
  }
12
16
  else if (window.queryLocalFonts) {
@@ -14,22 +18,21 @@ export class FontPropertyEditor extends BasePropertyEditor {
14
18
  window.queryLocalFonts().then(x => {
15
19
  //@ts-ignore
16
20
  FontPropertyEditor.fontList = [...new Set(x.map(y => y.family))];
17
- this.parseFontList();
21
+ FontPropertyEditor.parseFontList(select);
18
22
  });
19
23
  }
20
24
  else {
21
25
  FontPropertyEditor.fontList = ["Verdana", "Arial", "Tahoma", "Trebuchet MS", "Times New Roman", "Georgia", "Garamond", "Courier New", "Brush Script MT"];
22
- this.parseFontList();
26
+ FontPropertyEditor.parseFontList(select);
23
27
  }
24
28
  }
25
- parseFontList() {
29
+ static parseFontList(select) {
26
30
  for (let v of FontPropertyEditor.fontList) {
27
31
  let option = document.createElement("option");
28
32
  option.value = v;
29
33
  option.text = v;
30
- this.element.appendChild(option);
34
+ select.appendChild(option);
31
35
  }
32
- this.element.onchange = (e) => this._valueChanged(this.element.value);
33
36
  }
34
37
  refreshValue(valueType, value) {
35
38
  this.element.value = value;
@@ -32,7 +32,6 @@ export interface IDesignerCanvas extends IPlacementView, IUiCommandHandler {
32
32
  canvasOffset: IPoint;
33
33
  canvas: HTMLElement;
34
34
  additionalStyles: CSSStyleSheet[];
35
- eatEvents: Element;
36
35
  initialize(serviceContainer: ServiceContainer): any;
37
36
  getNormalizedEventCoordinates(event: MouseEvent): IPoint;
38
37
  getViewportCoordinates(event: MouseEvent): IPoint;
@@ -31,7 +31,6 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
31
31
  snapLines: Snaplines;
32
32
  overlayLayer: OverlayLayerView;
33
33
  rootDesignItem: IDesignItem;
34
- eatEvents: Element;
35
34
  private _currentPasteOffset;
36
35
  private _zoomFactor;
37
36
  private _scaleFactor;
@@ -58,7 +58,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
58
58
  snapLines;
59
59
  overlayLayer;
60
60
  rootDesignItem;
61
- eatEvents;
62
61
  _currentPasteOffset = this.pasteOffset;
63
62
  _zoomFactor = 1; //if scale or zoom css property is used this needs to be the value
64
63
  _scaleFactor = 1; //if scale css property is used this need to be the scale value
@@ -869,8 +868,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
869
868
  }
870
869
  }
871
870
  onKeyUp(event) {
872
- if (event.composedPath().indexOf(this.eatEvents) >= 0)
873
- return;
874
871
  if (this._moveGroup) {
875
872
  this._moveGroup.commit();
876
873
  this._moveGroup = null;
@@ -878,8 +875,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
878
875
  event.preventDefault();
879
876
  }
880
877
  onKeyDown(event) {
881
- if (event.composedPath().indexOf(this.eatEvents) >= 0)
882
- return;
883
878
  if ((event.ctrlKey || event.metaKey) && event.key === 'z' && !event.shiftKey)
884
879
  this.executeCommand({ type: CommandType.undo, ctrlKey: event.ctrlKey, altKey: event.altKey, shiftKey: event.shiftKey });
885
880
  else if ((event.ctrlKey || event.metaKey) && event.key === 'z' && event.shiftKey)
@@ -1040,8 +1035,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
1040
1035
  for (let pe of this._pointerextensions)
1041
1036
  pe.refresh(event);
1042
1037
  }
1043
- if (event.composedPath().indexOf(this.eatEvents) >= 0)
1044
- return;
1045
1038
  let currentElement;
1046
1039
  if (forceElement)
1047
1040
  currentElement = forceElement;
@@ -1072,8 +1065,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
1072
1065
  this.showHoverExtension(currentDesignItem.element, event);
1073
1066
  //TODO: needed ??
1074
1067
  if (currentElement && DomHelper.getHost(currentElement.parentNode) === this.overlayLayer) {
1075
- if (this.eatEvents)
1076
- return;
1077
1068
  currentElement = this.instanceServiceContainer.selectionService.primarySelection?.element ?? this._canvas;
1078
1069
  }
1079
1070
  let tool = this.serviceContainer.globalContext.tool ?? this.serviceContainer.designerTools.get(NamedTools.Pointer);
@@ -10,7 +10,7 @@ export class AltToEnterContainerExtension extends AbstractExtension {
10
10
  }
11
11
  refresh() {
12
12
  const itemRect = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element);
13
- this._text = this._drawText("Press ALT to enter container", itemRect.x + 5, itemRect.y + 12, 'svg-text-enter-container', this._text, OverlayLayer.Foreground);
13
+ this._text = this._drawText("Press ALT (or hold) to enter container", itemRect.x + 5, itemRect.y + 12, 'svg-text-enter-container', this._text, OverlayLayer.Foreground);
14
14
  this._text.style.fontSize = (14 / this.designerCanvas.scaleFactor) + 'px';
15
15
  this._text.setAttribute('x', '' + (itemRect.x + 5 / this.designerCanvas.scaleFactor));
16
16
  this._text.setAttribute('y', '' + (itemRect.y + 12 / this.designerCanvas.scaleFactor));
@@ -7,18 +7,12 @@ export type handlesPointerEvent = {
7
7
  };
8
8
  export declare class EditTextExtension extends AbstractExtension implements handlesPointerEvent {
9
9
  private static template;
10
- private _contentEditedBound;
11
- private _blurBound;
12
- private _blurTimeout;
13
10
  private _foreignObject;
14
- private _focusBound;
11
+ private _path;
15
12
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
16
13
  extend(): void;
17
14
  refresh(): void;
18
15
  dispose(): void;
19
16
  handlesPointerEvent(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): boolean;
20
- _contentEdited(): void;
21
- _blur(): void;
22
- _focus(): void;
23
- _formatSelection(type: string): void;
17
+ _formatSelection(type: string, value?: string): void;
24
18
  }
@@ -1,96 +1,103 @@
1
1
  import { html } from "@node-projects/base-custom-webcomponent";
2
2
  import { AbstractExtension } from "../AbstractExtension.js";
3
- import { ExtensionType } from "../ExtensionType.js";
4
3
  import { OverlayLayer } from "../OverlayLayer.js";
4
+ import { getDesignerCanvasNormalizedTransformedCornerDOMPoints } from "../../../../helper/TransformHelper.js";
5
+ import { shadowrootGetSelection, wrapSelectionInSpans } from "../../../../helper/SelectionHelper.js";
6
+ import { FontPropertyEditor } from "../../../../services/propertiesService/propertyEditors/FontPropertyEditor.js";
5
7
  export class EditTextExtension extends AbstractExtension {
6
8
  static template = html `
7
- <div style="height: 24px; display: flex;">
8
- <button data-command="bold" style="pointer-events: all; height: 24px; width: 24px; padding: 0; font-weight: 900;">b</button>
9
- <button data-command="italic" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><em>i</em></button>
10
- <button data-command="underline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><ins>u</ins></button>
11
- <button data-command="strikeThrough" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><del>s</del></button>
9
+ <div style="height: 24px; display: flex; gap: 2px;">
10
+ <button data-command="font-weight" data-command-parameter="800" style="pointer-events: all; height: 24px; width: 24px; padding: 0; font-weight: 900;">b</button>
11
+ <button data-command="font-style" data-command-parameter="italic" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><em>i</em></button>
12
+ <button data-command="text-decoration" data-command-parameter="underline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><ins>u</ins></button>
13
+ <button data-command="text-decoration" data-command-parameter="line-through" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><del>s</del></button>
14
+ <button data-command="text-decoration" data-command-parameter="overline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><span style="text-decoration: overline">o</span></button>
15
+ <select data-command="fontSize" style="pointer-events: all; height: 24px; width: 60px; padding: 0;">
16
+ <option>8px</option>
17
+ <option>9px</option>
18
+ <option>10px</option>
19
+ <option>11px</option>
20
+ <option>12px</option>
21
+ <option>14px</option>
22
+ <option>16px</option>
23
+ <option>18px</option>
24
+ <option>20px</option>
25
+ <option>24px</option>
26
+ <option>28px</option>
27
+ <option>32px</option>
28
+ <option>36px</option>
29
+ </select>
30
+ <select id="fontFamily" data-command="font-family" style="pointer-events: all; height: 24px; width: 90px; padding: 0;">
31
+
32
+ </select>
12
33
  </div>
13
34
  `;
14
- _contentEditedBound;
15
- _blurBound;
16
- _blurTimeout;
17
35
  _foreignObject;
18
- _focusBound;
36
+ _path;
19
37
  constructor(extensionManager, designerView, extendedItem) {
20
38
  super(extensionManager, designerView, extendedItem);
21
- this._contentEditedBound = this._contentEdited.bind(this);
22
- this._blurBound = this._blur.bind(this);
23
- this._focusBound = this._focus.bind(this);
24
39
  }
25
40
  extend() {
26
41
  //TODO: -> check what to do with extensions, do not loose edit on mouse click,...
27
42
  //maybe use a html edit framework
28
43
  this.extendedItem.instanceServiceContainer.selectionService.clearSelectedElements();
29
- //this.extensionManager.removeExtension(this.extendedItem, ExtensionType.PrimarySelection);
30
- //this.extensionManager.removeExtension(this.extendedItem, ExtensionType.PrimarySelectionAndCanBeEntered);
31
- //this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Selection);
44
+ this.extendedItem.removeDesignerAttributesAndStylesFromChildren();
32
45
  this.extendedItem.element.setAttribute('contenteditable', '');
33
- this.extendedItem.element.addEventListener('input', this._contentEditedBound);
34
46
  this.extendedItem.element.focus();
35
- this.designerCanvas.eatEvents = this.extendedItem.element;
36
47
  let itemRect = this.extendedItem.element.getBoundingClientRect();
37
48
  const elements = EditTextExtension.template.content.cloneNode(true);
38
- elements.querySelectorAll('button').forEach(x => x.onclick = () => this._formatSelection(x.dataset['command']));
49
+ FontPropertyEditor.addFontsToSelect(elements.querySelector('#fontFamily'));
50
+ elements.querySelectorAll('button').forEach(x => x.onpointerdown = () => this._formatSelection(x.dataset['command'], x.dataset['commandParameter']));
51
+ elements.querySelectorAll('select').forEach(x => x.onchange = () => this._formatSelection(x.dataset['command'], x.value));
52
+ //Button overlay
39
53
  const foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
40
54
  this._foreignObject = foreignObject;
41
55
  foreignObject.setAttribute('x', '' + (itemRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor);
42
56
  foreignObject.setAttribute('y', '' + ((itemRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 30));
43
- foreignObject.setAttribute('width', '96');
57
+ foreignObject.setAttribute('width', '300');
44
58
  foreignObject.setAttribute('height', '24');
45
59
  foreignObject.appendChild(elements);
46
60
  this._addOverlay(foreignObject, OverlayLayer.Foreground);
61
+ //TODO - nice way to disable click overlay
47
62
  this.designerCanvas.clickOverlay.style.pointerEvents = 'none';
48
- this.extendedItem.element.addEventListener('blur', this._blurBound);
49
- this.extendedItem.element.addEventListener('focus', this._focusBound);
63
+ //overlay to detect click outside
64
+ this._path = document.createElementNS("http://www.w3.org/2000/svg", "path");
65
+ this._path.setAttribute('class', 'svg-edit-text-clickoutside');
66
+ this._path.setAttribute('fill-rule', 'evenodd');
67
+ this._path.style.pointerEvents = 'auto';
68
+ this._path.onpointerdown = (e) => {
69
+ this.extensionManager.removeExtensionInstance(this.extendedItem, this);
70
+ };
71
+ this._addOverlay(this._path, OverlayLayer.Background);
72
+ let points = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
73
+ let outsideRect = { width: this.designerCanvas.containerBoundingRect.width / this.designerCanvas.scaleFactor, height: this.designerCanvas.containerBoundingRect.height / this.designerCanvas.scaleFactor };
74
+ let data = "M0 0 L" + outsideRect.width + " 0 L" + outsideRect.width + ' ' + outsideRect.height + " L0 " + outsideRect.height + " Z ";
75
+ data += "M" + points[0].x + " " + points[0].y + " L" + points[1].x + " " + points[1].y + " L" + points[3].x + " " + points[3].y + " L" + points[2].x + " " + points[2].y + " Z";
76
+ this._path.setAttribute("d", data);
50
77
  }
51
78
  refresh() {
52
- this.dispose();
79
+ let points = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
80
+ let outsideRect = { width: this.designerCanvas.containerBoundingRect.width / this.designerCanvas.scaleFactor, height: this.designerCanvas.containerBoundingRect.height / this.designerCanvas.scaleFactor };
81
+ let data = "M0 0 L" + outsideRect.width + " 0 L" + outsideRect.width + ' ' + outsideRect.height + " L0 " + outsideRect.height + " Z ";
82
+ data += "M" + points[0].x + " " + points[0].y + " L" + points[1].x + " " + points[1].y + " L" + points[3].x + " " + points[3].y + " L" + points[2].x + " " + points[2].y + " Z";
83
+ this._path.setAttribute("d", data);
53
84
  }
54
85
  dispose() {
55
86
  this._removeAllOverlays();
56
87
  this.extendedItem.element.removeAttribute('contenteditable');
57
- this.extendedItem.element.removeEventListener('input', this._contentEditedBound);
58
- this.extendedItem.element.removeEventListener('blur', this._blurBound);
59
- this.designerCanvas.eatEvents = null;
60
88
  this.extendedItem.updateChildrenFromNodesChildren();
61
89
  this.designerCanvas.clickOverlay.style.pointerEvents = 'auto';
62
90
  }
63
91
  handlesPointerEvent(designerCanvas, event, currentElement) {
64
- let p = event.composedPath();
92
+ const p = event.composedPath();
65
93
  const stylo = this._foreignObject.querySelector('stylo-editor');
66
94
  return p.indexOf(stylo) >= 0;
67
95
  }
68
- _contentEdited() {
69
- //TODO: -> save???
70
- //this.extendedItem.content = this.extendedItem.element.innerHTML;
71
- //console.log(this.extendedItem.element.innerHTML)
72
- }
73
- _blur() {
74
- if (!this._blurTimeout) {
75
- this._blurTimeout = setTimeout(() => {
76
- //TODO: don't remove doubleclick extension (another type could be used), remove extension itself
77
- //maybe also configureable when when to remove the extension
78
- this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Doubleclick);
79
- }, 150);
80
- }
81
- }
82
- _focus() {
83
- if (this._blurTimeout) {
84
- clearTimeout(this._blurTimeout);
85
- this._blurTimeout = null;
86
- }
87
- }
88
- _formatSelection(type) {
89
- if (this._blurTimeout)
90
- clearTimeout(this._blurTimeout);
91
- this._blurTimeout = null;
92
- //const selection = <Selection>(<any>this.designerView.shadowRoot).getSelection()
93
- document.execCommand(type, false, null);
96
+ _formatSelection(type, value) {
97
+ const selection = shadowrootGetSelection(this.designerCanvas.rootDesignItem.element.shadowRoot);
98
+ const spans = wrapSelectionInSpans(selection);
99
+ for (const span of spans)
100
+ span.style[type] = value;
94
101
  this.extendedItem.element.focus();
95
102
  }
96
103
  }
@@ -6,4 +6,5 @@ import { IExtensionManager } from '../IExtensionManger.js';
6
6
  export declare class EditTextExtensionProvider implements IDesignerExtensionProvider {
7
7
  shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
8
8
  getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
9
+ readonly style: CSSStyleSheet;
9
10
  }
@@ -1,11 +1,15 @@
1
1
  import { EditTextExtension } from "./EditTextExtension.js";
2
+ import { css } from '@node-projects/base-custom-webcomponent';
2
3
  export class EditTextExtensionProvider {
3
4
  shouldExtend(extensionManager, designerView, designItem) {
4
- if (designItem.name === 'button' || designItem.name === 'input')
5
+ if (designItem.name === 'input')
5
6
  return false;
6
7
  return true;
7
8
  }
8
9
  getExtension(extensionManager, designerView, designItem) {
9
10
  return new EditTextExtension(extensionManager, designerView, designItem);
10
11
  }
12
+ style = css `
13
+ .svg-edit-text-clickoutside { stroke: transparent; fill: lightgray; opacity: 0.7 }
14
+ `;
11
15
  }
@@ -19,7 +19,8 @@ export class ElementDragTitleExtension extends AbstractExtension {
19
19
  let text = this.extendedItem.name;
20
20
  this._width = Math.max(Math.min(elementWidth, w), extensionWidth);
21
21
  this._rect = this._drawRect(transformedCornerPoints[0].x, transformedCornerPoints[0].y - 16, this._width, 15, 'svg-primary-selection-move', this._rect);
22
- this._text = this._drawHTML('<span style="width: 100%; position: absolute; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">' + text + '</span>', (boundRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, transformedCornerPoints[0].y - 16, this._width, 15, 'svg-text-primary', this._text);
22
+ this._text = this._drawHTML('<div style="position:relative"><span style="width: 100%; position: absolute; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; transform-origin: 0 0;">' + text + '</span></div>', (boundRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, transformedCornerPoints[0].y - 16, this._width, 15, 'svg-text-primary', this._text);
23
+ this._text.style.overflow = 'visible';
23
24
  this._rect.addEventListener('pointerdown', (e) => this._pointerEvent(e));
24
25
  this._rect.addEventListener('pointermove', (e) => this._pointerEvent(e));
25
26
  this._rect.addEventListener('pointerup', (e) => this._pointerEvent(e));
@@ -47,8 +48,7 @@ export class ElementDragTitleExtension extends AbstractExtension {
47
48
  this._text.style.fontSize = (10 / this.designerCanvas.scaleFactor) + 'px';
48
49
  this._text.setAttribute('height', '' + h);
49
50
  this._text.setAttribute('width', '' + w);
50
- this._text.style.transformBox = 'fill-box';
51
- this._text.style.rotate = angle + 'deg';
51
+ this._text.children[0].children[0].style.rotate = angle + 'deg';
52
52
  }
53
53
  }
54
54
  }
@@ -15,6 +15,7 @@ export declare class ExtensionManager implements IExtensionManager {
15
15
  private _selectedElementsChanged;
16
16
  applyExtension(designItem: IDesignItem, extensionType: ExtensionType, event?: Event, recursive?: boolean): IDesignerExtension[];
17
17
  applyExtensions(designItems: IDesignItem[], extensionType: ExtensionType, event?: Event, recursive?: boolean): void;
18
+ applyExtensionInstance(designItem: IDesignItem, extension: IDesignerExtension): void;
18
19
  removeExtensionInstance(designItem: IDesignItem, extension: IDesignerExtension): void;
19
20
  removeExtension(designItem: IDesignItem, extensionType?: ExtensionType): void;
20
21
  removeExtensions(designItems: IDesignItem[], recursive: boolean, extensionType?: ExtensionType): void;
@@ -142,6 +142,20 @@ export class ExtensionManager {
142
142
  }
143
143
  this.designerCanvas.overlayLayer.endBatch();
144
144
  }
145
+ applyExtensionInstance(designItem, extension) {
146
+ let appE = designItem.appliedDesignerExtensions.get(ExtensionType.Directly);
147
+ if (!appE)
148
+ appE = [];
149
+ try {
150
+ extension.extend(null, null);
151
+ }
152
+ catch (err) {
153
+ console.error(err);
154
+ }
155
+ appE.push(extension);
156
+ designItem.appliedDesignerExtensions.set(ExtensionType.Directly, appE);
157
+ this.designItemsWithExtentions.add(designItem);
158
+ }
145
159
  removeExtensionInstance(designItem, extension) {
146
160
  for (let e of designItem.appliedDesignerExtensions) {
147
161
  const idx = e[1].indexOf(extension);
@@ -341,6 +355,7 @@ export class ExtensionManager {
341
355
  refreshAllExtensions(designItems, ignoredExtension) {
342
356
  this.designerCanvas.overlayLayer.startBatch();
343
357
  if (designItems) {
358
+ this.refreshExtensions(designItems, ExtensionType.Directly, null, ignoredExtension);
344
359
  this.refreshExtensions(designItems, ExtensionType.Permanent, null, ignoredExtension);
345
360
  this.refreshExtensions(designItems, ExtensionType.Selection, null, ignoredExtension);
346
361
  this.refreshExtensions(designItems, ExtensionType.PrimarySelection, null, ignoredExtension);
@@ -1,4 +1,5 @@
1
1
  export declare enum ExtensionType {
2
+ Directly = 0,//Extensions wich are applied directly, for example from Text Edit Tool
2
3
  Permanent = 1,
3
4
  Selection = 2,
4
5
  PrimarySelection = 3,
@@ -22,7 +23,7 @@ export declare enum ExtensionType {
22
23
  Placement = 12,
23
24
  /**
24
25
  * Extensions only when the container can be Entered.
25
- * So for Example on a custome webcomponent wich uses a grid layout for it's root, but can not show children,
26
+ * So for Example on a custom webcomponent wich uses a grid layout for it's root, but can not show children,
26
27
  * do not display grid extension.
27
28
  */
28
29
  PrimarySelectionAndCanBeEntered = 13,
@@ -1,5 +1,6 @@
1
1
  export var ExtensionType;
2
2
  (function (ExtensionType) {
3
+ ExtensionType[ExtensionType["Directly"] = 0] = "Directly";
3
4
  ExtensionType[ExtensionType["Permanent"] = 1] = "Permanent";
4
5
  ExtensionType[ExtensionType["Selection"] = 2] = "Selection";
5
6
  ExtensionType[ExtensionType["PrimarySelection"] = 3] = "PrimarySelection";
@@ -23,7 +24,7 @@ export var ExtensionType;
23
24
  ExtensionType[ExtensionType["Placement"] = 12] = "Placement";
24
25
  /**
25
26
  * Extensions only when the container can be Entered.
26
- * So for Example on a custome webcomponent wich uses a grid layout for it's root, but can not show children,
27
+ * So for Example on a custom webcomponent wich uses a grid layout for it's root, but can not show children,
27
28
  * do not display grid extension.
28
29
  */
29
30
  ExtensionType[ExtensionType["PrimarySelectionAndCanBeEntered"] = 13] = "PrimarySelectionAndCanBeEntered";
@@ -1,4 +1,3 @@
1
- import { IRect } from '../../../../interfaces/IRect.js';
2
1
  import { IDesignItem } from '../../../item/IDesignItem.js';
3
2
  import { IDesignerCanvas } from '../IDesignerCanvas.js';
4
3
  import { AbstractExtension } from './AbstractExtension.js';
@@ -8,6 +7,5 @@ export declare class GrayOutExtension extends AbstractExtension {
8
7
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
9
8
  extend(): void;
10
9
  refresh(): void;
11
- drawGrayOut(r: IRect): void;
12
10
  dispose(): void;
13
11
  }
@@ -1,3 +1,4 @@
1
+ import { getDesignerCanvasNormalizedTransformedCornerDOMPoints } from '../../../helper/TransformHelper.js';
1
2
  import { AbstractExtension } from './AbstractExtension.js';
2
3
  import { OverlayLayer } from "./OverlayLayer.js";
3
4
  export class GrayOutExtension extends AbstractExtension {
@@ -12,18 +13,14 @@ export class GrayOutExtension extends AbstractExtension {
12
13
  if (!this._path) {
13
14
  this._path = document.createElementNS("http://www.w3.org/2000/svg", "path");
14
15
  this._path.setAttribute('class', 'svg-gray-out');
16
+ this._path.setAttribute('fill-rule', 'evenodd');
15
17
  this._addOverlay(this._path, OverlayLayer.Background);
16
18
  }
17
- let normalizedRect = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element);
18
- this.drawGrayOut(normalizedRect);
19
- }
20
- drawGrayOut(r) {
19
+ let points = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
21
20
  let outsideRect = { width: this.designerCanvas.containerBoundingRect.width / this.designerCanvas.scaleFactor, height: this.designerCanvas.containerBoundingRect.height / this.designerCanvas.scaleFactor };
22
- const pathPoints = "M0 0 L0 " + outsideRect.height + "L" + r.x + " " + outsideRect.height + "L" + r.x + " 0" + " L0 0" +
23
- "M" + r.x + " 0 L" + r.x + " " + r.y + "L" + outsideRect.width + " " + r.y + "L" + outsideRect.width + " 0" + "L" + r.x + " 0" +
24
- "M" + r.x + " " + (r.y + r.height) + "L" + r.x + " " + outsideRect.height + "L" + outsideRect.width + " " + outsideRect.height + "L" + outsideRect.width + " " + (r.y + r.height) + "L" + r.x + " " + (r.y + r.height) +
25
- "M" + (r.x + r.width) + " " + r.y + "L" + (r.x + r.width) + " " + (r.y + r.height) + "L" + outsideRect.width + " " + (r.y + r.height) + "L" + outsideRect.width + " " + (r.y) + "L" + (r.x + r.width) + " " + r.y;
26
- this._path.setAttribute("d", pathPoints);
21
+ let data = "M0 0 L" + outsideRect.width + " 0 L" + outsideRect.width + ' ' + outsideRect.height + " L0 " + outsideRect.height + " Z ";
22
+ data += "M" + points[0].x + " " + points[0].y + " L" + points[1].x + " " + points[1].y + " L" + points[3].x + " " + points[3].y + " L" + points[2].x + " " + points[2].y + " Z";
23
+ this._path.setAttribute("d", data);
27
24
  }
28
25
  dispose() {
29
26
  this._removeAllOverlays();
@@ -4,6 +4,7 @@ import { IDesignerExtension } from './IDesignerExtension.js';
4
4
  export interface IExtensionManager {
5
5
  applyExtension(designItem: IDesignItem, extensionType: ExtensionType, event?: Event, recursive?: boolean): IDesignerExtension[];
6
6
  applyExtensions(designItems: IDesignItem[], extensionType: ExtensionType, event?: Event, recursive?: boolean): any;
7
+ applyExtensionInstance(designItem: IDesignItem, extension: IDesignerExtension): any;
7
8
  removeExtension(designItem: IDesignItem, extensionType?: ExtensionType): any;
8
9
  removeExtensions(designItems: IDesignItem[], recursive: boolean, extensionType?: ExtensionType): any;
9
10
  removeExtensionInstance(designItem: IDesignItem, extension: IDesignerExtension): any;
@@ -15,10 +15,11 @@ export declare class PointerTool implements ITool {
15
15
  private _copiedItemsInserted;
16
16
  private _previousEventName;
17
17
  private _dragOverExtensionItem;
18
- private _dragExtensionItem;
18
+ private _dragParentExtensionItem;
19
19
  private _moveItemsOffset;
20
20
  private _initialOffset;
21
21
  private _started;
22
+ private _holdTimeout;
22
23
  private _firstTimeInMove;
23
24
  private _secondTimeInMove;
24
25
  private _changeGroup;
@@ -14,11 +14,11 @@ export class PointerTool {
14
14
  _copiedItemsInserted = false;
15
15
  _previousEventName;
16
16
  _dragOverExtensionItem;
17
- _dragExtensionItem;
17
+ _dragParentExtensionItem;
18
18
  _moveItemsOffset = { x: 0, y: 0 };
19
19
  _initialOffset;
20
20
  _started = false;
21
- ;
21
+ _holdTimeout;
22
22
  _firstTimeInMove;
23
23
  _secondTimeInMove;
24
24
  _changeGroup;
@@ -154,7 +154,11 @@ export class PointerTool {
154
154
  drawSelectionTool.pointerEventHandler(designerView, event, currentElement);
155
155
  }
156
156
  }
157
- async _pointerActionTypeDragOrSelect(designerCanvas, event, currentDesignItem, currentPoint) {
157
+ async _pointerActionTypeDragOrSelect(designerCanvas, event, currentDesignItem, currentPoint, raisedFromHold = false) {
158
+ if (this._holdTimeout) {
159
+ clearTimeout(this._holdTimeout);
160
+ this._holdTimeout = null;
161
+ }
158
162
  if (event.altKey) {
159
163
  if (event.type == EventNames.PointerDown) {
160
164
  const currentSelection = designerCanvas.instanceServiceContainer.selectionService.primarySelection;
@@ -235,10 +239,10 @@ export class PointerTool {
235
239
  const currentContainerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(this._actionStartedDesignItem.parent, containerStyle));
236
240
  if (currentContainerService) {
237
241
  const dragItem = this._actionStartedDesignItem.parent;
238
- if (this._dragExtensionItem != dragItem) {
239
- designerCanvas.extensionManager.removeExtension(this._dragExtensionItem, ExtensionType.ContainerDrag);
242
+ if (this._dragParentExtensionItem != dragItem) {
243
+ designerCanvas.extensionManager.removeExtension(this._dragParentExtensionItem, ExtensionType.ContainerDrag);
240
244
  designerCanvas.extensionManager.applyExtension(dragItem, ExtensionType.ContainerDrag, event);
241
- this._dragExtensionItem = dragItem;
245
+ this._dragParentExtensionItem = dragItem;
242
246
  }
243
247
  else {
244
248
  designerCanvas.extensionManager.refreshExtension(dragItem, ExtensionType.ContainerDrag);
@@ -266,15 +270,26 @@ export class PointerTool {
266
270
  }
267
271
  }
268
272
  }
269
- if (newContainerService && event.altKey) {
273
+ if (newContainerService) {
274
+ this._holdTimeout = setTimeout(() => {
275
+ this._pointerActionTypeDragOrSelect(designerCanvas, event, currentDesignItem, currentPoint, true);
276
+ }, 1000);
277
+ }
278
+ if (newContainerService && (event.altKey || raisedFromHold)) {
270
279
  //TODO: all items, fix position
271
280
  const oldOffset = currentContainerService.getElementOffset(this._actionStartedDesignItem.parent, this._actionStartedDesignItem);
272
281
  const newOffset = newContainerService.getElementOffset(newContainerElementDesignItem, this._actionStartedDesignItem);
273
282
  this._moveItemsOffset = { x: newOffset.x - oldOffset.x + this._moveItemsOffset.x, y: newOffset.y - oldOffset.y + this._moveItemsOffset.y };
274
283
  currentContainerService.leaveContainer(this._actionStartedDesignItem.parent, this._actionStartedDesignItems);
275
284
  const cp = { x: currentPoint.x - this._moveItemsOffset.x, y: currentPoint.y - this._moveItemsOffset.y };
276
- newContainerService.enterContainer(newContainerElementDesignItem, this._actionStartedDesignItems);
285
+ newContainerService.enterContainer(newContainerElementDesignItem, this._actionStartedDesignItems, 'normal');
277
286
  newContainerService.place(event, designerCanvas, this._actionStartedDesignItem.parent, this._initialPoint, this._initialOffset, cp, this._actionStartedDesignItems);
287
+ designerCanvas.extensionManager.removeExtension(this._dragParentExtensionItem, ExtensionType.ContainerDrag);
288
+ designerCanvas.extensionManager.applyExtension(newContainerElementDesignItem, ExtensionType.ContainerDrag, event);
289
+ this._dragParentExtensionItem = newContainerElementDesignItem;
290
+ designerCanvas.extensionManager.removeExtension(this._dragOverExtensionItem, ExtensionType.ContainerDragOverAndCanBeEntered);
291
+ this._dragOverExtensionItem = null;
292
+ designerCanvas.extensionManager.refreshAllAppliedExtentions();
278
293
  }
279
294
  else {
280
295
  const cp = { x: currentPoint.x - this._moveItemsOffset.x, y: currentPoint.y - this._moveItemsOffset.y };
@@ -334,8 +349,8 @@ export class PointerTool {
334
349
  this._changeGroup.abort();
335
350
  this._changeGroup = null;
336
351
  }
337
- designerCanvas.extensionManager.removeExtension(this._dragExtensionItem, ExtensionType.ContainerDrag);
338
- this._dragExtensionItem = null;
352
+ designerCanvas.extensionManager.removeExtension(this._dragParentExtensionItem, ExtensionType.ContainerDrag);
353
+ this._dragParentExtensionItem = null;
339
354
  designerCanvas.extensionManager.removeExtension(this._dragOverExtensionItem, ExtensionType.ContainerDragOverAndCanBeEntered);
340
355
  this._dragOverExtensionItem = null;
341
356
  this._moveItemsOffset = { x: 0, y: 0 };
@@ -373,6 +388,7 @@ export class PointerTool {
373
388
  let newContainerService = null;
374
389
  const designerCanvas = designItem.instanceServiceContainer.designerCanvas;
375
390
  const elementsFromPoint = designerCanvas.elementsFromPoint(event.x, event.y);
391
+ elementsFromPoint.push(designerCanvas.rootDesignItem.element);
376
392
  for (let e of elementsFromPoint) {
377
393
  if (e == designItem.element) {
378
394
  continue;
@@ -1,7 +1,7 @@
1
1
  import { EventNames } from '../../../../enums/EventNames.js';
2
2
  import { DesignItem } from '../../../item/DesignItem.js';
3
3
  import { InsertAction } from '../../../services/undoService/transactionItems/InsertAction.js';
4
- import { ExtensionType } from '../extensions/ExtensionType.js';
4
+ import { EditTextExtension } from '../extensions/EditText/EditTextExtension.js';
5
5
  export class TextTool {
6
6
  _textEditExtensions;
7
7
  constructor(editExistingText) {
@@ -28,10 +28,8 @@ export class TextTool {
28
28
  di.setStyle('left', currentPoint.x + 'px');
29
29
  di.setStyle('top', currentPoint.y + 'px');
30
30
  designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
31
- //TODO: Maybe we could also remove the eatEvents property
32
- //TODO - don't apply doubleclick extension (maybe it is not the doubleclick one) - apply edit text extesion directly
33
- //should we configure the editTextExtension anywhere??
34
- this._textEditExtensions = designerCanvas.extensionManager.applyExtension(di, ExtensionType.Doubleclick, event);
31
+ designerCanvas.extensionManager.applyExtensionInstance(di, new EditTextExtension(designerCanvas.extensionManager, designerCanvas, di));
32
+ designerCanvas.serviceContainer.globalContext.finishedWithTool(this);
35
33
  setTimeout(() => { span.focus(); }, 50);
36
34
  }
37
35
  else {
@@ -1,7 +1,10 @@
1
1
  import { DesignerToolbarButton } from '../DesignerToolbarButton.js';
2
2
  import { assetsPath } from "../../../../../../Constants.js";
3
+ import { PointerToolPopup } from "../popups/PointerToolPopup.js";
3
4
  export class PointerToolButtonProvider {
4
5
  provideButton(designerCanvas) {
5
- return new DesignerToolbarButton(designerCanvas, { 'Pointer': { icon: assetsPath + 'images/tools/PointerTool.svg' } });
6
+ const button = new DesignerToolbarButton(designerCanvas, { 'Pointer': { icon: assetsPath + 'images/tools/PointerTool.svg' } });
7
+ button.popup = PointerToolPopup;
8
+ return button;
6
9
  }
7
10
  }
@@ -0,0 +1,5 @@
1
+ import { BaseCustomWebComponentConstructorAppend } from '@node-projects/base-custom-webcomponent';
2
+ export declare abstract class AbstractBaseToolPopup extends BaseCustomWebComponentConstructorAppend {
3
+ static style: CSSStyleSheet | CSSStyleSheet[];
4
+ constructor();
5
+ }