@node-projects/web-component-designer 0.0.238 → 0.0.239

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 (47) hide show
  1. package/assets/images/layout/TransformTool.svg +21 -0
  2. package/dist/elements/helper/ElementHelper.d.ts +4 -0
  3. package/dist/elements/helper/ElementHelper.js +29 -0
  4. package/dist/elements/services/DefaultServiceBootstrap.js +7 -2
  5. package/dist/elements/services/ServiceContainer.d.ts +6 -3
  6. package/dist/elements/services/ServiceContainer.js +5 -2
  7. package/dist/elements/services/dragDropService/DragDropService.d.ts +8 -2
  8. package/dist/elements/services/dragDropService/DragDropService.js +79 -21
  9. package/dist/elements/services/dragDropService/ExternalDragDropService copy.d.ts +6 -0
  10. package/dist/elements/services/dragDropService/ExternalDragDropService copy.js +28 -0
  11. package/dist/elements/services/dragDropService/ExternalDragDropService.d.ts +6 -0
  12. package/dist/elements/services/dragDropService/ExternalDragDropService.js +28 -0
  13. package/dist/elements/services/dragDropService/IDragDropService.d.ts +6 -1
  14. package/dist/elements/services/dragDropService/IExternalDragDropService copy.d.ts +5 -0
  15. package/dist/elements/services/dragDropService/IExternalDragDropService copy.js +1 -0
  16. package/dist/elements/services/dragDropService/IExternalDragDropService.d.ts +5 -0
  17. package/dist/elements/services/dragDropService/IExternalDragDropService.js +1 -0
  18. package/dist/elements/services/placementService/DefaultPlacementService.d.ts +1 -0
  19. package/dist/elements/services/placementService/DefaultPlacementService.js +11 -0
  20. package/dist/elements/services/placementService/FlexBoxPlacementService.d.ts +1 -0
  21. package/dist/elements/services/placementService/FlexBoxPlacementService.js +2 -0
  22. package/dist/elements/services/placementService/GridPlacementService.d.ts +1 -0
  23. package/dist/elements/services/placementService/GridPlacementService.js +2 -0
  24. package/dist/elements/services/placementService/IPlacementService.d.ts +5 -4
  25. package/dist/elements/widgets/designerView/designerCanvas.d.ts +0 -2
  26. package/dist/elements/widgets/designerView/designerCanvas.js +36 -95
  27. package/dist/elements/widgets/designerView/extensions/MultipleSelectionRectExtension.d.ts +15 -0
  28. package/dist/elements/widgets/designerView/extensions/MultipleSelectionRectExtension.js +34 -0
  29. package/dist/elements/widgets/designerView/extensions/MultipleSelectionRectExtensionProvider.d.ts +10 -0
  30. package/dist/elements/widgets/designerView/extensions/MultipleSelectionRectExtensionProvider.js +13 -0
  31. package/dist/elements/widgets/designerView/extensions/svg/EllipsisExtension.js +2 -2
  32. package/dist/elements/widgets/designerView/extensions/svg/LineExtension.js +2 -2
  33. package/dist/elements/widgets/designerView/extensions/svg/PathExtension.js +2 -2
  34. package/dist/elements/widgets/designerView/extensions/svg/RectExtension.js +2 -2
  35. package/dist/elements/widgets/designerView/tools/DrawEllipsisTool.js +2 -2
  36. package/dist/elements/widgets/designerView/tools/DrawLineTool.js +2 -2
  37. package/dist/elements/widgets/designerView/tools/DrawPathTool.js +2 -2
  38. package/dist/elements/widgets/designerView/tools/DrawRectTool.js +2 -2
  39. package/dist/elements/widgets/designerView/tools/toolBar/DesignerToolbar.d.ts +1 -1
  40. package/dist/elements/widgets/designerView/tools/toolBar/DesignerToolbar.js +6 -6
  41. package/dist/elements/widgets/designerView/tools/toolBar/buttons/TransformToolButtonProvider.d.ts +5 -0
  42. package/dist/elements/widgets/designerView/tools/toolBar/buttons/TransformToolButtonProvider.js +10 -0
  43. package/dist/elements/widgets/designerView/tools/toolBar/popups/TransformToolPopup.d.ts +31 -0
  44. package/dist/elements/widgets/designerView/tools/toolBar/popups/TransformToolPopup.js +293 -0
  45. package/dist/index.d.ts +2 -0
  46. package/dist/index.js +1 -0
  47. package/package.json +6 -6
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <svg width="100%" height="100%" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.5;">
4
+ <g transform="matrix(1.42857,0,0,0.416667,-14.2857,33.3333)">
5
+ <path d="M10,50.5L10,29.5L71.25,29.5L71.25,10L80,40L71.25,70L71.25,50.5L10,50.5Z"/>
6
+ </g>
7
+ <g transform="matrix(8.74748e-17,-1.42857,0.416667,2.55135e-17,33.3333,114.286)">
8
+ <path d="M10,50.5L10,29.5L71.25,29.5L71.25,10L80,40L71.25,70L71.25,50.5L10,50.5Z"/>
9
+ </g>
10
+ <g transform="matrix(1,0,0,1,4,-2)">
11
+ <g transform="matrix(1.17647,0,0,1,59.9412,-58)">
12
+ <path d="M6,79L23,79" style="fill:none;stroke:black;stroke-width:5.72px;"/>
13
+ </g>
14
+ <g transform="matrix(7.2038e-17,-1.17647,1,6.12323e-17,-2,38.0588)">
15
+ <path d="M6,79L23,79" style="fill:none;stroke:black;stroke-width:5.72px;"/>
16
+ </g>
17
+ </g>
18
+ <g transform="matrix(0.882353,0,0,0.75,6.20588,21.75)">
19
+ <path d="M6,79L23,79" style="fill:none;stroke:black;stroke-width:7.63px;"/>
20
+ </g>
21
+ </svg>
@@ -1,4 +1,7 @@
1
1
  import { IPoint } from '../../interfaces/IPoint.js';
2
+ import { IRect } from '../../interfaces/IRect.js';
3
+ import { IDesignItem } from '../item/IDesignItem.js';
4
+ import { IDesignerCanvas } from '../widgets/designerView/IDesignerCanvas.js';
2
5
  export declare function inDesigner(element: Element): boolean;
3
6
  export declare function newElementFromString(text: any): Element;
4
7
  export declare enum ElementDisplayType {
@@ -17,3 +20,4 @@ export declare function getElementsWindowOffsetWithoutSelfAndParentTransformatio
17
20
  offsetTop: number;
18
21
  };
19
22
  export declare function getContentBoxContentOffsets(element: any): IPoint;
23
+ export declare function calculateOuterRect(designItems: IDesignItem[], designerCanvas: IDesignerCanvas): IRect;
@@ -105,3 +105,32 @@ export function getContentBoxContentOffsets(element) {
105
105
  + parseInt(getComputedStyle(element).borderBottom.replace('px', ''));
106
106
  return { x: xOffset, y: yOffset };
107
107
  }
108
+ export function calculateOuterRect(designItems, designerCanvas) {
109
+ let min = { x: Number.MAX_VALUE, y: Number.MAX_VALUE };
110
+ let max = { x: Number.MIN_VALUE, y: Number.MIN_VALUE };
111
+ let elementRect;
112
+ for (let s of designItems) {
113
+ elementRect = {
114
+ x: designerCanvas.getNormalizedElementCoordinates(s.element).x,
115
+ y: designerCanvas.getNormalizedElementCoordinates(s.element).y,
116
+ width: designerCanvas.getNormalizedElementCoordinates(s.element).width,
117
+ height: designerCanvas.getNormalizedElementCoordinates(s.element).height
118
+ };
119
+ // calculate min and max of selection
120
+ if (elementRect.x < min.x)
121
+ min.x = elementRect.x;
122
+ if (elementRect.y < min.y)
123
+ min.y = elementRect.y;
124
+ if (elementRect.x + elementRect.width > max.x)
125
+ max.x = elementRect.x + elementRect.width;
126
+ if (elementRect.y + elementRect.height > max.y)
127
+ max.y = elementRect.y + elementRect.height;
128
+ }
129
+ // calculate reckt around selection
130
+ return {
131
+ x: min.x,
132
+ y: min.y,
133
+ width: max.x - min.x,
134
+ height: max.y - min.y
135
+ };
136
+ }
@@ -39,7 +39,7 @@ import { GridPlacementService } from './placementService/GridPlacementService.js
39
39
  import { ElementAtPointService } from './elementAtPointService/ElementAtPointService.js';
40
40
  import { FlexBoxPlacementService } from './placementService/FlexBoxPlacementService.js';
41
41
  import { SnaplinesProviderService } from './placementService/SnaplinesProviderService.js';
42
- import { DragDropService } from './dragDropService/DragDropService.js';
42
+ import { ExternalDragDropService } from './dragDropService/ExternalDragDropService.js';
43
43
  import { EditTextExtensionProvider } from '../widgets/designerView/extensions/EditText/EditTextExtensionProvider.js';
44
44
  import { CopyPasteService } from './copyPasteService/CopyPasteService.js';
45
45
  import { DefaultModelCommandService } from './modelCommandService/DefaultModelCommandService.js';
@@ -80,6 +80,9 @@ import { EditGridColumnRowSizesExtensionProvider } from '../widgets/designerView
80
80
  import { DisplayGridExtensionProvider } from '../widgets/designerView/extensions/grid/DisplayGridExtensionProvider.js';
81
81
  import { ApplyFirstMachingExtensionProvider } from '../widgets/designerView/extensions/logic/ApplyFirstMachingExtensionProvider.js';
82
82
  import { DesignItemDocumentPositionService } from './designItemDocumentPositionService/DesignItemDocumentPositionService.js';
83
+ import { TransformToolButtonProvider } from '../widgets/designerView/tools/toolBar/buttons/TransformToolButtonProvider.js';
84
+ import { MultipleSelectionRectExtensionProvider } from '../widgets/designerView/extensions/MultipleSelectionRectExtensionProvider.js';
85
+ import { DragDropService } from './dragDropService/DragDropService.js';
83
86
  export function createDefaultServiceContainer() {
84
87
  let serviceContainer = new ServiceContainer();
85
88
  serviceContainer.register("propertyService", new PolymerPropertiesService());
@@ -98,6 +101,7 @@ export function createDefaultServiceContainer() {
98
101
  serviceContainer.register("snaplinesProviderService", new SnaplinesProviderService());
99
102
  serviceContainer.register("htmlParserService", new DefaultHtmlParserService());
100
103
  serviceContainer.register("elementAtPointService", new ElementAtPointService());
104
+ serviceContainer.register("externalDragDropService", new ExternalDragDropService());
101
105
  serviceContainer.register("dragDropService", new DragDropService());
102
106
  serviceContainer.register("copyPasteService", new CopyPasteService());
103
107
  serviceContainer.register("modelCommandService", new DefaultModelCommandService());
@@ -126,6 +130,7 @@ export function createDefaultServiceContainer() {
126
130
  new RectExtentionProvider(),
127
131
  new ResizeExtensionProvider(true),
128
132
  new RotateExtensionProvider(),
133
+ new MultipleSelectionRectExtensionProvider(),
129
134
  ]);
130
135
  serviceContainer.designerExtensions.set(ExtensionType.Selection, [
131
136
  new SelectionDefaultExtensionProvider()
@@ -170,7 +175,7 @@ export function createDefaultServiceContainer() {
170
175
  //new CursorLinePointerExtensionProvider()
171
176
  );
172
177
  serviceContainer.designViewConfigButtons.push(new ButtonSeperatorProvider(20), new GridExtensionDesignViewConfigButtons(), new FlexboxExtensionDesignViewConfigButtons(), new ButtonSeperatorProvider(10), new InvisibleElementExtensionDesignViewConfigButtons(), new ButtonSeperatorProvider(10), new StylesheetServiceDesignViewConfigButtons());
173
- serviceContainer.designViewToolbarButtons.push(new PointerToolButtonProvider(), new SeperatorToolProvider(22), new SelectorToolButtonProvider(), new SeperatorToolProvider(22), new ZoomToolButtonProvider(), new SeperatorToolProvider(22), new DrawToolButtonProvider(), new SeperatorToolProvider(5), new TextToolButtonProvider());
178
+ serviceContainer.designViewToolbarButtons.push(new PointerToolButtonProvider(), new SeperatorToolProvider(22), new SelectorToolButtonProvider(), new SeperatorToolProvider(22), new ZoomToolButtonProvider(), new SeperatorToolProvider(22), new DrawToolButtonProvider(), new SeperatorToolProvider(22), new TextToolButtonProvider(), new SeperatorToolProvider(22), new TransformToolButtonProvider());
174
179
  serviceContainer.designerContextMenuExtensions = [
175
180
  new CopyPasteContextMenu(),
176
181
  new SeperatorContextMenu(),
@@ -18,7 +18,7 @@ import { GlobalContext } from './GlobalContext.js';
18
18
  import { IBindingService } from './bindingsService/IBindingService.js';
19
19
  import { IElementAtPointService } from './elementAtPointService/IElementAtPointService.js';
20
20
  import { ISnaplinesProviderService } from "./placementService/ISnaplinesProviderService.js";
21
- import { IDragDropService } from './dragDropService/IDragDropService.js';
21
+ import { IExternalDragDropService } from './dragDropService/IExternalDragDropService.js';
22
22
  import { ICopyPasteService } from "./copyPasteService/ICopyPasteService.js";
23
23
  import { IDesignerPointerExtensionProvider } from "../widgets/designerView/extensions/pointerExtensions/IDesignerPointerExtensionProvider.js";
24
24
  import { IModelCommandService } from "./modelCommandService/IModelCommandService.js";
@@ -39,6 +39,7 @@ import { IContentService } from './contentService/IContentService.js';
39
39
  import { IStylesheetService } from './stylesheetService/IStylesheetService.js';
40
40
  import { IDesignerCanvas } from '../widgets/designerView/IDesignerCanvas.js';
41
41
  import { IDesignItemDocumentPositionService } from './designItemDocumentPositionService/IDesignItemDocumentPositionService.js';
42
+ import { IDragDropService } from './dragDropService/IDragDropService.js';
42
43
  interface ServiceNameMap {
43
44
  "propertyService": IPropertiesService;
44
45
  "containerService": IPlacementService;
@@ -53,12 +54,13 @@ interface ServiceNameMap {
53
54
  "bindableObjectsService": IBindableObjectsService;
54
55
  "bindableObjectDragDropService": IBindableObjectDragDropService;
55
56
  "elementAtPointService": IElementAtPointService;
56
- "dragDropService": IDragDropService;
57
+ "externalDragDropService": IExternalDragDropService;
57
58
  "copyPasteService": ICopyPasteService;
58
59
  "modelCommandService": IModelCommandService;
59
60
  "demoProviderService": IDemoProviderService;
60
61
  "elementInteractionService": IElementInteractionService;
61
62
  "propertyGroupsService": IPropertyTabsService;
63
+ "dragDropService": IDragDropService;
62
64
  "undoService": (designerCanvas: IDesignerCanvas) => IUndoService;
63
65
  "selectionService": (designerCanvas: IDesignerCanvas) => ISelectionService;
64
66
  "contentService": (designerCanvas: IDesignerCanvas) => IContentService;
@@ -85,6 +87,7 @@ export declare class ServiceContainer extends BaseServiceContainer<ServiceNameMa
85
87
  get bindingService(): IBindingService;
86
88
  get bindableObjectsServices(): IBindableObjectsService[];
87
89
  get bindableObjectDragDropService(): IBindableObjectDragDropService;
90
+ get dragDropService(): IDragDropService;
88
91
  get elementInteractionServices(): IElementInteractionService[];
89
92
  get propertiesServices(): IPropertiesService[];
90
93
  get propertyGroupService(): IPropertyTabsService;
@@ -97,7 +100,7 @@ export declare class ServiceContainer extends BaseServiceContainer<ServiceNameMa
97
100
  get htmlParserService(): IHtmlParserService;
98
101
  get intializationService(): IIntializationService;
99
102
  get elementAtPointService(): IElementAtPointService;
100
- get dragDropService(): IDragDropService;
103
+ get externalDragDropService(): IExternalDragDropService;
101
104
  get copyPasteService(): ICopyPasteService;
102
105
  get modelCommandService(): IModelCommandService;
103
106
  get demoProviderService(): IDemoProviderService;
@@ -34,6 +34,9 @@ export class ServiceContainer extends BaseServiceContainer {
34
34
  get bindableObjectDragDropService() {
35
35
  return this.getLastService('bindableObjectDragDropService');
36
36
  }
37
+ get dragDropService() {
38
+ return this.getLastService('dragDropService');
39
+ }
37
40
  get elementInteractionServices() {
38
41
  return this.getServices('elementInteractionService');
39
42
  }
@@ -70,8 +73,8 @@ export class ServiceContainer extends BaseServiceContainer {
70
73
  get elementAtPointService() {
71
74
  return this.getLastService('elementAtPointService');
72
75
  }
73
- get dragDropService() {
74
- return this.getLastService('dragDropService');
76
+ get externalDragDropService() {
77
+ return this.getLastService('externalDragDropService');
75
78
  }
76
79
  get copyPasteService() {
77
80
  return this.getLastService('copyPasteService');
@@ -1,6 +1,12 @@
1
1
  import { IDesignerCanvas } from "../../widgets/designerView/IDesignerCanvas.js";
2
2
  import { IDragDropService } from "./IDragDropService.js";
3
+ import { IDesignItem } from "../../item/IDesignItem.js";
4
+ import { IPlacementService } from "../placementService/IPlacementService.js";
3
5
  export declare class DragDropService implements IDragDropService {
4
- dragOver(event: DragEvent): 'none' | 'copy' | 'link' | 'move';
5
- drop(designerView: IDesignerCanvas, event: DragEvent): void;
6
+ private _dragOverExtensionItem;
7
+ dragEnter(designerCanvas: IDesignerCanvas, event: DragEvent): void;
8
+ dragLeave(designerCanvas: IDesignerCanvas, event: DragEvent): void;
9
+ dragOver(designerCanvas: IDesignerCanvas, event: DragEvent): void;
10
+ drop(designerCanvas: IDesignerCanvas, event: DragEvent): Promise<void>;
11
+ getPossibleContainerForDragDrop(designerCanvas: IDesignerCanvas, event: DragEvent): [newContainerElementDesignItem: IDesignItem, newContainerService: IPlacementService];
6
12
  }
@@ -1,28 +1,86 @@
1
1
  import { DesignItem } from '../../item/DesignItem.js';
2
2
  import { InsertAction } from "../undoService/transactionItems/InsertAction.js";
3
+ import { ExtensionType } from "../../widgets/designerView/extensions/ExtensionType.js";
4
+ import { dragDropFormatNameElementDefinition } from "../../../Constants.js";
3
5
  export class DragDropService {
4
- dragOver(event) {
5
- if (event.dataTransfer.items[0].type.startsWith('image/'))
6
- return 'copy';
7
- return 'none';
6
+ _dragOverExtensionItem;
7
+ dragEnter(designerCanvas, event) {
8
8
  }
9
- drop(designerView, event) {
10
- if (event.dataTransfer.files[0].type.startsWith('image/')) {
11
- let reader = new FileReader();
12
- reader.onloadend = () => {
13
- const img = document.createElement('img');
14
- img.src = reader.result;
15
- const di = DesignItem.createDesignItemFromInstance(img, designerView.serviceContainer, designerView.instanceServiceContainer);
16
- let grp = di.openGroup("Insert of &lt;img&gt;");
17
- di.setStyle('position', 'absolute');
18
- const targetRect = event.target.getBoundingClientRect();
19
- di.setStyle('top', event.offsetY + targetRect.top - designerView.containerBoundingRect.y + 'px');
20
- di.setStyle('left', event.offsetX + targetRect.left - designerView.containerBoundingRect.x + 'px');
21
- designerView.instanceServiceContainer.undoService.execute(new InsertAction(designerView.rootDesignItem, designerView.rootDesignItem.childCount, di));
22
- grp.commit();
23
- requestAnimationFrame(() => designerView.instanceServiceContainer.selectionService.setSelectedElements([di]));
24
- };
25
- reader.readAsDataURL(event.dataTransfer.files[0]);
9
+ dragLeave(designerCanvas, event) {
10
+ if (this._dragOverExtensionItem) {
11
+ designerCanvas.extensionManager.removeExtension(this._dragOverExtensionItem, ExtensionType.ContainerExternalDragOver);
12
+ this._dragOverExtensionItem = null;
26
13
  }
27
14
  }
15
+ dragOver(designerCanvas, event) {
16
+ let [newContainer] = this.getPossibleContainerForDragDrop(designerCanvas, event);
17
+ if (this._dragOverExtensionItem != newContainer) {
18
+ designerCanvas.extensionManager.removeExtension(this._dragOverExtensionItem, ExtensionType.ContainerExternalDragOver);
19
+ designerCanvas.extensionManager.applyExtension(newContainer, ExtensionType.ContainerExternalDragOver, event);
20
+ this._dragOverExtensionItem = newContainer;
21
+ }
22
+ else {
23
+ designerCanvas.extensionManager.refreshExtension(newContainer, ExtensionType.ContainerExternalDragOver, event);
24
+ }
25
+ }
26
+ async drop(designerCanvas, event) {
27
+ if (this._dragOverExtensionItem) {
28
+ designerCanvas.extensionManager.removeExtension(this._dragOverExtensionItem, ExtensionType.ContainerExternalDragOver);
29
+ this._dragOverExtensionItem = null;
30
+ }
31
+ let [newContainer] = this.getPossibleContainerForDragDrop(designerCanvas, event);
32
+ if (!newContainer)
33
+ newContainer = designerCanvas.rootDesignItem;
34
+ //TODO : we need to use container service for adding to element, so also grid and flexbox work correct
35
+ const transferData = event.dataTransfer.getData(dragDropFormatNameElementDefinition);
36
+ const elementDefinition = JSON.parse(transferData);
37
+ const di = await designerCanvas.serviceContainer.forSomeServicesTillResult("instanceService", (service) => service.getElement(elementDefinition, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer));
38
+ const grp = di.openGroup("Insert of &lt;" + di.name + "&gt;");
39
+ di.setStyle('position', 'absolute');
40
+ const containerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(newContainer, getComputedStyle(newContainer.element)));
41
+ containerService.enterContainer(newContainer, [di]);
42
+ const containerPos = designerCanvas.getNormalizedElementCoordinates(newContainer.element);
43
+ const evCoord = designerCanvas.getNormalizedEventCoordinates(event);
44
+ const pos = { x: evCoord.x - containerPos.x, y: evCoord.y - containerPos.y };
45
+ containerService.place(event, designerCanvas, newContainer, { x: 0, y: 0 }, { x: 0, y: 0 }, pos, [di]);
46
+ containerService.finishPlace(event, designerCanvas, newContainer, { x: 0, y: 0 }, { x: 0, y: 0 }, pos, [di]);
47
+ designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(newContainer, newContainer.childCount, di));
48
+ requestAnimationFrame(() => {
49
+ designerCanvas.instanceServiceContainer.selectionService.setSelectedElements([di]);
50
+ grp.commit();
51
+ });
52
+ }
53
+ getPossibleContainerForDragDrop(designerCanvas, event) {
54
+ let newContainerElementDesignItem = null;
55
+ let newContainerService = null;
56
+ const elementsFromPoint = designerCanvas.elementsFromPoint(event.x, event.y);
57
+ for (let e of elementsFromPoint) {
58
+ if (e == designerCanvas.rootDesignItem.element) {
59
+ newContainerElementDesignItem = designerCanvas.rootDesignItem;
60
+ const containerStyle = getComputedStyle(newContainerElementDesignItem.element);
61
+ newContainerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(newContainerElementDesignItem, containerStyle));
62
+ break;
63
+ }
64
+ else if (false) {
65
+ //check we don't try to move a item over one of its children..
66
+ }
67
+ else {
68
+ newContainerElementDesignItem = DesignItem.GetOrCreateDesignItem(e, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
69
+ const containerStyle = getComputedStyle(newContainerElementDesignItem.element);
70
+ newContainerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(newContainerElementDesignItem, containerStyle));
71
+ if (newContainerService) {
72
+ //TODO: Maybe the check for SVG Elemnt should be in "canEnterByDrop"?
73
+ if (newContainerService.canEnterByDrop(newContainerElementDesignItem) && !(newContainerElementDesignItem.element instanceof SVGElement)) {
74
+ break;
75
+ }
76
+ else {
77
+ newContainerElementDesignItem = null;
78
+ newContainerService = null;
79
+ continue;
80
+ }
81
+ }
82
+ }
83
+ }
84
+ return [newContainerElementDesignItem, newContainerService];
85
+ }
28
86
  }
@@ -0,0 +1,6 @@
1
+ import { IDesignerCanvas } from "../../widgets/designerView/IDesignerCanvas.js";
2
+ import { IExternalDragDropService } from "./IExternalDragDropService.js";
3
+ export declare class ExternalDragDropService implements IExternalDragDropService {
4
+ dragOver(event: DragEvent): 'none' | 'copy' | 'link' | 'move';
5
+ drop(designerView: IDesignerCanvas, event: DragEvent): void;
6
+ }
@@ -0,0 +1,28 @@
1
+ import { DesignItem } from '../../item/DesignItem.js';
2
+ import { InsertAction } from "../undoService/transactionItems/InsertAction.js";
3
+ export class ExternalDragDropService {
4
+ dragOver(event) {
5
+ if (event.dataTransfer.items[0].type.startsWith('image/'))
6
+ return 'copy';
7
+ return 'none';
8
+ }
9
+ drop(designerView, event) {
10
+ if (event.dataTransfer.files[0].type.startsWith('image/')) {
11
+ let reader = new FileReader();
12
+ reader.onloadend = () => {
13
+ const img = document.createElement('img');
14
+ img.src = reader.result;
15
+ const di = DesignItem.createDesignItemFromInstance(img, designerView.serviceContainer, designerView.instanceServiceContainer);
16
+ let grp = di.openGroup("Insert of &lt;img&gt;");
17
+ di.setStyle('position', 'absolute');
18
+ const targetRect = event.target.getBoundingClientRect();
19
+ di.setStyle('top', event.offsetY + targetRect.top - designerView.containerBoundingRect.y + 'px');
20
+ di.setStyle('left', event.offsetX + targetRect.left - designerView.containerBoundingRect.x + 'px');
21
+ designerView.instanceServiceContainer.undoService.execute(new InsertAction(designerView.rootDesignItem, designerView.rootDesignItem.childCount, di));
22
+ grp.commit();
23
+ requestAnimationFrame(() => designerView.instanceServiceContainer.selectionService.setSelectedElements([di]));
24
+ };
25
+ reader.readAsDataURL(event.dataTransfer.files[0]);
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,6 @@
1
+ import { IDesignerCanvas } from "../../widgets/designerView/IDesignerCanvas.js";
2
+ import { IExternalDragDropService } from "./IExternalDragDropService.js";
3
+ export declare class ExternalDragDropService implements IExternalDragDropService {
4
+ dragOver(event: DragEvent): 'none' | 'copy' | 'link' | 'move';
5
+ drop(designerCanvas: IDesignerCanvas, event: DragEvent): void;
6
+ }
@@ -0,0 +1,28 @@
1
+ import { DesignItem } from '../../item/DesignItem.js';
2
+ import { InsertAction } from "../undoService/transactionItems/InsertAction.js";
3
+ export class ExternalDragDropService {
4
+ dragOver(event) {
5
+ if (event.dataTransfer.items[0].type.startsWith('image/'))
6
+ return 'copy';
7
+ return 'none';
8
+ }
9
+ drop(designerCanvas, event) {
10
+ if (event.dataTransfer.files[0].type.startsWith('image/')) {
11
+ let reader = new FileReader();
12
+ reader.onloadend = () => {
13
+ const img = document.createElement('img');
14
+ img.src = reader.result;
15
+ const di = DesignItem.createDesignItemFromInstance(img, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
16
+ let grp = di.openGroup("Insert of &lt;img&gt;");
17
+ di.setStyle('position', 'absolute');
18
+ const targetRect = event.target.getBoundingClientRect();
19
+ di.setStyle('top', event.offsetY + targetRect.top - designerCanvas.containerBoundingRect.y + 'px');
20
+ di.setStyle('left', event.offsetX + targetRect.left - designerCanvas.containerBoundingRect.x + 'px');
21
+ designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
22
+ grp.commit();
23
+ requestAnimationFrame(() => designerCanvas.instanceServiceContainer.selectionService.setSelectedElements([di]));
24
+ };
25
+ reader.readAsDataURL(event.dataTransfer.files[0]);
26
+ }
27
+ }
28
+ }
@@ -1,5 +1,10 @@
1
+ import { IDesignItem } from "../../item/IDesignItem.js";
1
2
  import { IDesignerCanvas } from "../../widgets/designerView/IDesignerCanvas.js";
3
+ import { IPlacementService } from "../placementService/IPlacementService.js";
2
4
  export interface IDragDropService {
3
- dragOver(event: DragEvent): 'none' | 'copy' | 'link' | 'move';
5
+ dragEnter(designerCanvas: IDesignerCanvas, event: DragEvent): any;
6
+ dragLeave(designerCanvas: IDesignerCanvas, event: DragEvent): any;
7
+ dragOver(designerCanvas: IDesignerCanvas, event: DragEvent): any;
4
8
  drop(designerCanvas: IDesignerCanvas, event: DragEvent): any;
9
+ getPossibleContainerForDragDrop(designerCanvas: IDesignerCanvas, event: DragEvent): [newContainerElementDesignItem: IDesignItem, newContainerService: IPlacementService];
5
10
  }
@@ -0,0 +1,5 @@
1
+ import { IDesignerCanvas } from "../../widgets/designerView/IDesignerCanvas.js";
2
+ export interface IExternalDragDropService {
3
+ dragOver(event: DragEvent): 'none' | 'copy' | 'link' | 'move';
4
+ drop(designerCanvas: IDesignerCanvas, event: DragEvent): any;
5
+ }
@@ -0,0 +1,5 @@
1
+ import { IDesignerCanvas } from "../../widgets/designerView/IDesignerCanvas.js";
2
+ export interface IExternalDragDropService {
3
+ dragOver(event: DragEvent): 'none' | 'copy' | 'link' | 'move';
4
+ drop(designerCanvas: IDesignerCanvas, event: DragEvent): any;
5
+ }
@@ -12,6 +12,7 @@ export declare class DefaultPlacementService implements IPlacementService {
12
12
  placePoint(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): IPoint;
13
13
  startPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
14
14
  place(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
15
+ moveElements(designItems: IDesignItem[], position: IPoint, absolute: boolean): void;
15
16
  enterContainer(container: IDesignItem, items: IDesignItem[]): void;
16
17
  leaveContainer(container: IDesignItem, items: IDesignItem[]): void;
17
18
  finishPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
@@ -109,6 +109,17 @@ export class DefaultPlacementService {
109
109
  combineTransforms(designItem.element, designItem.getStyle('transform'), translationMatrix.toString());
110
110
  }
111
111
  }
112
+ moveElements(designItems, position, absolute) {
113
+ //TODO: Check if we set left or right
114
+ //TODO: Use CSS units
115
+ for (let d of designItems) {
116
+ if (position.x)
117
+ d.setStyle('left', parseInt(d.element.style.left) - position.x + 'px');
118
+ if (position.y)
119
+ d.setStyle('top', parseInt(d.element.style.top) - position.y + 'px');
120
+ }
121
+ designItems[0].instanceServiceContainer.designerCanvas.extensionManager.refreshExtensions(designItems);
122
+ }
112
123
  enterContainer(container, items) {
113
124
  let filterdItems = filterChildPlaceItems(items);
114
125
  for (let i of filterdItems) {
@@ -14,4 +14,5 @@ export declare class FlexBoxPlacementService implements IPlacementService {
14
14
  startPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
15
15
  place(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
16
16
  finishPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
17
+ moveElements(designItems: IDesignItem[], position: IPoint, absolute: boolean): void;
17
18
  }
@@ -110,4 +110,6 @@ export class FlexBoxPlacementService {
110
110
  }
111
111
  finishPlace(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
112
112
  }
113
+ moveElements(designItems, position, absolute) {
114
+ }
113
115
  }
@@ -14,4 +14,5 @@ export declare class GridPlacementService implements IPlacementService {
14
14
  startPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
15
15
  place(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
16
16
  finishPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): void;
17
+ moveElements(designItems: IDesignItem[], position: IPoint, absolute: boolean): void;
17
18
  }
@@ -105,4 +105,6 @@ export class GridPlacementService {
105
105
  }
106
106
  placementView.extensionManager.refreshAllExtensions([container]);
107
107
  }
108
+ moveElements(designItems, position, absolute) {
109
+ }
108
110
  }
@@ -3,10 +3,10 @@ import { IDesignItem } from '../../item/IDesignItem.js';
3
3
  import { IPlacementView } from '../../widgets/designerView/IPlacementView.js';
4
4
  import { IPoint } from '../../../interfaces/IPoint.js';
5
5
  export interface IPlacementService extends IService {
6
- serviceForContainer(container: IDesignItem, containerStyle: CSSStyleDeclaration): any;
7
- canEnterByDrop(container: IDesignItem): any;
8
- canEnter(container: IDesignItem, items: IDesignItem[]): any;
9
- canLeave(container: IDesignItem, items: IDesignItem[]): any;
6
+ serviceForContainer(container: IDesignItem, containerStyle: CSSStyleDeclaration): boolean;
7
+ canEnterByDrop(container: IDesignItem): boolean;
8
+ canEnter(container: IDesignItem, items: IDesignItem[]): boolean;
9
+ canLeave(container: IDesignItem, items: IDesignItem[]): boolean;
10
10
  enterContainer(container: IDesignItem, items: IDesignItem[]): any;
11
11
  leaveContainer(container: IDesignItem, items: IDesignItem[]): any;
12
12
  getElementOffset(container: IDesignItem, designItem?: IDesignItem): IPoint;
@@ -14,4 +14,5 @@ export interface IPlacementService extends IService {
14
14
  startPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): any;
15
15
  place(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): any;
16
16
  finishPlace(event: MouseEvent, placementView: IPlacementView, container: IDesignItem, startPoint: IPoint, offsetInControl: IPoint, newPoint: IPoint, items: IDesignItem[]): any;
17
+ moveElements(designItems: IDesignItem[], position: IPoint, absolute: boolean): any;
17
18
  }
@@ -90,12 +90,10 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
90
90
  lazyTriggerReparseDocumentStylesheets(): void;
91
91
  private reparseDocumentStylesheets;
92
92
  addDesignItems(designItems: IDesignItem[]): void;
93
- _dragOverExtensionItem: IDesignItem;
94
93
  private _onDragEnter;
95
94
  private _onDragLeave;
96
95
  private _lastDdElement;
97
96
  private _onDragOver;
98
- private _getPossibleContainerForDrop;
99
97
  private _onDrop;
100
98
  showDesignItemContextMenu(designItem: IDesignItem, event: MouseEvent): ContextMenu;
101
99
  private _onDblClick;