@markerjs/markerjs3 3.0.0-alpha.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markerjs3.js","sources":["../../src/core/SvgHelper.ts","../../src/core/MarkerBase.ts","../../src/core/TransformMatrix.ts","../../src/core/RectangularBoxMarkerBase.ts","../../src/core/ShapeOutlineMarkerBase.ts","../../src/core/FrameMarker.ts","../../src/core/LinearMarkerBase.ts","../../src/core/PolygonMarker.ts","../../src/core/FreehandMarker.ts","../../src/core/TextBlock.ts","../../src/core/TextMarker.ts","../../src/core/LineMarker.ts","../../src/editor/MarkerBaseEditor.ts","../../src/editor/Grip.ts","../../src/editor/ResizeGrip.ts","../../src/editor/PolygonMarkerEditor.ts","../../src/editor/LinearMarkerEditor.ts","../../src/editor/RectangularBoxMarkerGrips.ts","../../src/editor/RotateGrip.ts","../../src/editor/RectangularBoxMarkerBaseEditor.ts","../../src/editor/ShapeOutlineMarkerEditor.ts","../../src/editor/UndoRedoManager.ts","../../src/editor/FreehandMarkerEditor.ts","../../src/editor/TextBlockEditor.ts","../../src/editor/TextMarkerEditor.ts","../../src/core/Activator.ts","../../src/MarkerArea.ts","../../src/editor.ts","../../src/MarkerView.ts","../../src/viewer.ts"],"sourcesContent":["import { IPoint } from \"./IPoint\";\r\n\r\n/**\r\n * Utility class to simplify SVG operations.\r\n */\r\nexport class SvgHelper {\r\n /**\r\n * Creates SVG \"defs\".\r\n */\r\n public static createDefs(): SVGDefsElement {\r\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\r\n\r\n return defs;\r\n }\r\n\r\n /**\r\n * Sets attributes on an arbitrary SVG element\r\n * @param el - target SVG element.\r\n * @param attributes - set of name-value attribute pairs.\r\n */\r\n public static setAttributes(\r\n el: SVGElement,\r\n attributes: Array<[string, string]>\r\n ): void {\r\n for (const [attr, value] of attributes) {\r\n el.setAttribute(attr, value);\r\n }\r\n }\r\n\r\n /**\r\n * Creates an SVG rectangle with the specified width and height.\r\n * @param width \r\n * @param height \r\n * @param attributes - additional attributes.\r\n */\r\n public static createRect(\r\n width: number | string,\r\n height: number | string,\r\n attributes?: Array<[string, string]>\r\n ): SVGRectElement {\r\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\r\n\r\n rect.setAttribute('width', width.toString());\r\n rect.setAttribute('height', height.toString());\r\n if (attributes) {\r\n SvgHelper.setAttributes(rect, attributes);\r\n }\r\n\r\n return rect;\r\n }\r\n\r\n /**\r\n * Creates an SVG line with specified end-point coordinates.\r\n * @param x1 \r\n * @param y1 \r\n * @param x2 \r\n * @param y2 \r\n * @param attributes - additional attributes.\r\n */\r\n public static createLine(\r\n x1: number | string,\r\n y1: number | string,\r\n x2: number | string,\r\n y2: number | string,\r\n attributes?: Array<[string, string]>\r\n ): SVGLineElement {\r\n const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');\r\n\r\n line.setAttribute('x1', x1.toString());\r\n line.setAttribute('y1', y1.toString());\r\n line.setAttribute('x2', x2.toString());\r\n line.setAttribute('y2', y2.toString());\r\n if (attributes) {\r\n SvgHelper.setAttributes(line, attributes);\r\n }\r\n\r\n return line;\r\n }\r\n\r\n /**\r\n * Creates an SVG polygon with specified points.\r\n * @param points - points as string.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createPolygon(\r\n points: string,\r\n attributes?: Array<[string, string]>\r\n ): SVGPolygonElement {\r\n const polygon = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'polygon'\r\n );\r\n\r\n polygon.setAttribute('points', points);\r\n if (attributes) {\r\n SvgHelper.setAttributes(polygon, attributes);\r\n }\r\n\r\n return polygon;\r\n }\r\n\r\n /**\r\n * Creates an SVG circle with the specified radius.\r\n * @param radius \r\n * @param attributes - additional attributes.\r\n */\r\n public static createCircle(\r\n radius: number,\r\n attributes?: Array<[string, string]>\r\n ): SVGCircleElement {\r\n const circle = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'circle'\r\n );\r\n\r\n circle.setAttribute('cx', (radius / 2).toString());\r\n circle.setAttribute('cy', (radius / 2).toString());\r\n circle.setAttribute('r', radius.toString());\r\n if (attributes) {\r\n SvgHelper.setAttributes(circle, attributes);\r\n }\r\n\r\n return circle;\r\n }\r\n\r\n /**\r\n * Creates an SVG ellipse with the specified horizontal and vertical radii.\r\n * @param rx \r\n * @param ry \r\n * @param attributes - additional attributes.\r\n */\r\n public static createEllipse(\r\n rx: number,\r\n ry: number,\r\n attributes?: Array<[string, string]>\r\n ): SVGEllipseElement {\r\n const ellipse = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'ellipse'\r\n );\r\n\r\n ellipse.setAttribute('cx', (rx / 2).toString());\r\n ellipse.setAttribute('cy', (ry / 2).toString());\r\n ellipse.setAttribute('rx', (rx / 2).toString());\r\n ellipse.setAttribute('ry', (ry / 2).toString());\r\n if (attributes) {\r\n SvgHelper.setAttributes(ellipse, attributes);\r\n }\r\n\r\n return ellipse;\r\n }\r\n\r\n /**\r\n * Creates an SVG group.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createGroup(attributes?: Array<[string, string]>): SVGGElement {\r\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');\r\n if (attributes) {\r\n SvgHelper.setAttributes(g, attributes);\r\n }\r\n return g;\r\n }\r\n\r\n /**\r\n * Creates an SVG transform.\r\n */\r\n public static createTransform(): SVGTransform {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n\r\n return svg.createSVGTransform();\r\n }\r\n\r\n /**\r\n * Creates an SVG marker.\r\n * @param id \r\n * @param orient \r\n * @param markerWidth \r\n * @param markerHeight \r\n * @param refX \r\n * @param refY \r\n * @param markerElement \r\n */\r\n public static createMarker(\r\n id: string,\r\n orient: string,\r\n markerWidth: number | string,\r\n markerHeight: number | string,\r\n refX: number | string,\r\n refY: number | string,\r\n markerElement: SVGGraphicsElement\r\n ): SVGMarkerElement {\r\n const marker = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'marker'\r\n );\r\n SvgHelper.setAttributes(marker, [\r\n ['id', id],\r\n ['orient', orient],\r\n ['markerWidth', markerWidth.toString()],\r\n ['markerHeight', markerHeight.toString()],\r\n ['refX', refX.toString()],\r\n ['refY', refY.toString()],\r\n ]);\r\n\r\n marker.appendChild(markerElement);\r\n\r\n return marker;\r\n }\r\n\r\n /**\r\n * Creates an SVG text element.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createText(\r\n attributes?: Array<[string, string]>\r\n ): SVGTextElement {\r\n const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\r\n text.setAttribute('x', '0');\r\n text.setAttribute('y', '0');\r\n\r\n if (attributes) {\r\n SvgHelper.setAttributes(text, attributes);\r\n }\r\n\r\n return text;\r\n }\r\n\r\n /**\r\n * Creates an SVG TSpan.\r\n * @param text - inner text.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createTSpan(\r\n text: string,\r\n attributes?: Array<[string, string]>\r\n ): SVGTSpanElement {\r\n const tspan = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'tspan'\r\n );\r\n tspan.textContent = text;\r\n\r\n if (attributes) {\r\n SvgHelper.setAttributes(tspan, attributes);\r\n }\r\n\r\n return tspan;\r\n }\r\n\r\n /**\r\n * Creates an SVG image element.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createImage(\r\n attributes?: Array<[string, string]>\r\n ): SVGImageElement {\r\n const image = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'image'\r\n );\r\n\r\n if (attributes) {\r\n SvgHelper.setAttributes(image, attributes);\r\n }\r\n\r\n return image;\r\n }\r\n\r\n /**\r\n * Creates an SVG point with the specified coordinates.\r\n * @param x \r\n * @param y \r\n */\r\n public static createPoint( \r\n x: number,\r\n y: number\r\n ): SVGPoint {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n const svgPoint = svg.createSVGPoint();\r\n svgPoint.x = x;\r\n svgPoint.y = y;\r\n \r\n return svgPoint;\r\n }\r\n\r\n /**\r\n * Creates an SVG path with the specified shape (d).\r\n * @param d - path shape\r\n * @param attributes - additional attributes.\r\n */\r\n public static createPath(\r\n d: string,\r\n attributes?: Array<[string, string]>\r\n ): SVGPathElement {\r\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n\r\n path.setAttribute('d', d);\r\n if (attributes) {\r\n SvgHelper.setAttributes(path, attributes);\r\n }\r\n\r\n return path;\r\n }\r\n\r\n /**\r\n * Creates an SVG text element.\r\n * @param attributes - additional attributes.\r\n */\r\n public static createForeignObject(\r\n attributes?: Array<[string, string]>\r\n ): SVGForeignObjectElement {\r\n const obj = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');\r\n obj.setAttribute('x', '0');\r\n obj.setAttribute('y', '0');\r\n\r\n if (attributes) {\r\n SvgHelper.setAttributes(obj, attributes);\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * Returns local coordinates relative to the provided `localRoot` of a client (screen) point.\r\n * @param localRoot relative coordinate root\r\n * @param x horizontal client coordinate\r\n * @param y vertical client coordinate\r\n * @param zoomLevel zoom level\r\n * @returns local coordinates relative to `localRoot`\r\n */\r\n public static clientToLocalCoordinates(localRoot: SVGElement | undefined, x: number, y: number, zoomLevel = 1): IPoint {\r\n if (localRoot) {\r\n const clientRect = localRoot.getBoundingClientRect();\r\n return {\r\n x: (x - clientRect.left) / zoomLevel,\r\n y: (y - clientRect.top) / zoomLevel,\r\n };\r\n } else {\r\n return { x: x, y: y };\r\n }\r\n } \r\n\r\n /**\r\n * Creates an SVG image element from a supplied inner SVG markup string.\r\n * @param stringSvg SVG markup (without the root svg tags)\r\n * @returns SVG image element\r\n */\r\n public static createSvgFromString(stringSvg: string): SVGSVGElement {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.innerHTML = stringSvg;\r\n\r\n return svg;\r\n }\r\n}\r\n","import { ISize } from './ISize';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\n\r\nexport type MarkerStage = 'creating' | 'normal';\r\n\r\nexport class MarkerBase {\r\n public static typeName = 'MarkerBase';\r\n\r\n public get typeName(): string {\r\n return Object.getPrototypeOf(this).constructor.typeName;\r\n }\r\n\r\n protected _container: SVGGElement;\r\n /**\r\n * SVG container object holding the marker's visual.\r\n */\r\n public get container(): SVGGElement {\r\n return this._container;\r\n }\r\n\r\n /**\r\n * Additional information about the marker\r\n */\r\n public notes?: string;\r\n\r\n /**\r\n * The default marker size when the marker is created with a click (without dragging).\r\n */\r\n public defaultSize: ISize = { width: 50, height: 20 };\r\n\r\n /**\r\n * Marker type title (display name) used for accessibility and other attributes.\r\n */\r\n public static title: string;\r\n\r\n public stage: MarkerStage = 'normal';\r\n\r\n protected _strokeColor = 'transparent';\r\n public get strokeColor() {\r\n return this._strokeColor;\r\n }\r\n public set strokeColor(color: string) {\r\n this._strokeColor = color;\r\n this.applyStrokeColor();\r\n }\r\n protected applyStrokeColor() {}\r\n\r\n protected _fillColor = 'transparent';\r\n public get fillColor() {\r\n return this._fillColor;\r\n }\r\n public set fillColor(color: string) {\r\n this._fillColor = color;\r\n this.applyFillColor();\r\n }\r\n protected applyFillColor() {}\r\n\r\n protected _strokeWidth = 0;\r\n public get strokeWidth() {\r\n return this._strokeWidth;\r\n }\r\n public set strokeWidth(value) {\r\n this._strokeWidth = value;\r\n this.applyStrokeWidth();\r\n }\r\n protected applyStrokeWidth() {}\r\n\r\n protected _strokeDasharray = '';\r\n public get strokeDasharray() {\r\n return this._strokeDasharray;\r\n }\r\n public set strokeDasharray(value) {\r\n this._strokeDasharray = value;\r\n this.applyStrokeDasharray();\r\n }\r\n protected applyStrokeDasharray() {}\r\n\r\n protected _opacity = 1;\r\n public get opacity() {\r\n return this._opacity;\r\n }\r\n public set opacity(value) {\r\n this._opacity = value;\r\n this.applyOpacity();\r\n }\r\n protected applyOpacity() {}\r\n\r\n constructor(container: SVGGElement) {\r\n this._container = container;\r\n\r\n this.applyFillColor = this.applyFillColor.bind(this);\r\n this.applyStrokeColor = this.applyStrokeColor.bind(this);\r\n this.applyStrokeWidth = this.applyStrokeWidth.bind(this);\r\n this.applyStrokeDasharray = this.applyStrokeDasharray.bind(this);\r\n this.applyOpacity = this.applyOpacity.bind(this);\r\n }\r\n\r\n /**\r\n * Returns true if passed SVG element belongs to the marker. False otherwise.\r\n *\r\n * @param el - target element.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public ownsTarget(el: EventTarget): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes the marker and clean's up.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n public dispose(): void {}\r\n\r\n protected addMarkerVisualToContainer(element: SVGElement): void {\r\n if (this.container.childNodes.length > 0) {\r\n this.container.insertBefore(element, this.container.childNodes[0]);\r\n } else {\r\n this.container.appendChild(element);\r\n }\r\n }\r\n\r\n public getOutline(): string {\r\n return '';\r\n }\r\n\r\n /**\r\n * Returns current marker state that can be restored in the future.\r\n */\r\n public getState(): MarkerBaseState {\r\n return {\r\n typeName: MarkerBase.typeName,\r\n notes: this.notes,\r\n strokeColor: this._strokeColor,\r\n strokeWidth: this._strokeWidth,\r\n strokeDasharray: this._strokeDasharray,\r\n opacity: this._opacity,\r\n };\r\n }\r\n\r\n /**\r\n * Restores previously saved marker state.\r\n *\r\n * @param state - previously saved state.\r\n */\r\n public restoreState(state: MarkerBaseState): void {\r\n this.notes = state.notes;\r\n this._strokeColor = state.strokeColor ?? this._strokeColor;\r\n this._strokeWidth = state.strokeWidth ?? this._strokeWidth;\r\n this._strokeDasharray = state.strokeDasharray ?? this._strokeDasharray;\r\n this._opacity = state.opacity ?? this._opacity;\r\n }\r\n\r\n /**\r\n * Scales marker. Used after the image resize.\r\n *\r\n * @param scaleX - horizontal scale\r\n * @param scaleY - vertical scale\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars\r\n public scale(scaleX: number, scaleY: number): void {}\r\n}\r\n","/**\r\n * Represents a simplified version of the SVGMatrix.\r\n */\r\nexport interface ITransformMatrix {\r\n a: number;\r\n b: number;\r\n c: number;\r\n d: number;\r\n e: number;\r\n f: number;\r\n}\r\n\r\n/**\r\n * A utility class to transform between SVGMatrix and its simplified representation.\r\n */\r\nexport class TransformMatrix {\r\n public static toITransformMatrix(matrix: SVGMatrix): ITransformMatrix {\r\n return {\r\n a: matrix.a,\r\n b: matrix.b,\r\n c: matrix.c,\r\n d: matrix.d,\r\n e: matrix.e,\r\n f: matrix.f\r\n }\r\n }\r\n public static toSVGMatrix(currentMatrix: SVGMatrix, newMatrix: ITransformMatrix): SVGMatrix {\r\n currentMatrix.a = newMatrix.a;\r\n currentMatrix.b = newMatrix.b;\r\n currentMatrix.c = newMatrix.c;\r\n currentMatrix.d = newMatrix.d;\r\n currentMatrix.e = newMatrix.e;\r\n currentMatrix.f = newMatrix.f;\r\n return currentMatrix;\r\n }\r\n}","import { IPoint } from './IPoint';\r\nimport { MarkerBase } from './MarkerBase';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { RectangularBoxMarkerBaseState } from './RectangularBoxMarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\nimport { TransformMatrix } from './TransformMatrix';\r\n\r\n/**\r\n * RectangularBoxMarkerBase is a base class for all marker's that conceptually fit into a rectangle\r\n * such as all rectangle markers, ellipse, text and callout markers.\r\n */\r\nexport class RectangularBoxMarkerBase extends MarkerBase {\r\n /**\r\n * x coordinate of the top-left corner.\r\n */\r\n public left = 0;\r\n /**\r\n * y coordinate of the top-left corner.\r\n */\r\n public top = 0;\r\n /**\r\n * Marker width.\r\n */\r\n public width = 0;\r\n /**\r\n * Marker height.\r\n */\r\n public height = 0;\r\n\r\n /**\r\n * Marker's rotation angle.\r\n */\r\n public rotationAngle = 0;\r\n\r\n /**\r\n * x coordinate of the marker's center.\r\n */\r\n public get centerX(): number {\r\n return this.left + this.width / 2;\r\n }\r\n /**\r\n * y coordinate of the marker's center.\r\n */\r\n public get centerY(): number {\r\n return this.top + this.height / 2;\r\n }\r\n\r\n private _visual?: SVGGraphicsElement;\r\n /**\r\n * Container for the marker's visual.\r\n */\r\n protected get visual(): SVGGraphicsElement | undefined {\r\n return this._visual;\r\n }\r\n protected set visual(value: SVGGraphicsElement) {\r\n this._visual = value;\r\n const translate = SvgHelper.createTransform();\r\n this._visual.transform.baseVal.appendItem(translate);\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.rotatePoint = this.rotatePoint.bind(this);\r\n this.unrotatePoint = this.unrotatePoint.bind(this);\r\n\r\n // add rotation transform\r\n this.container.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n }\r\n\r\n /**\r\n * Moves visual to the specified coordinates.\r\n * @param point - coordinates of the new top-left corner of the visual.\r\n */\r\n public moveVisual(point: IPoint): void {\r\n if (this.visual) {\r\n this.visual.style.transform = `translate(${point.x}px, ${point.y}px)`;\r\n }\r\n }\r\n\r\n public setSize(): void {\r\n this.moveVisual({ x: this.left, y: this.top });\r\n }\r\n\r\n public rotate(point: IPoint) {\r\n // avoid glitch when crossing the 0 rotation point\r\n if (Math.abs(point.x - this.centerX) > 0.1) {\r\n const sign = Math.sign(point.x - this.centerX);\r\n this.rotationAngle =\r\n (Math.atan((point.y - this.centerY) / (point.x - this.centerX)) * 180) /\r\n Math.PI +\r\n 90 * sign;\r\n this.applyRotation();\r\n }\r\n }\r\n\r\n private applyRotation() {\r\n const rotate = this.container.transform.baseVal.getItem(0);\r\n rotate.setRotate(this.rotationAngle, this.centerX, this.centerY);\r\n this.container.transform.baseVal.replaceItem(rotate, 0);\r\n }\r\n\r\n /**\r\n * Returns point coordinates based on the actual screen coordinates and marker's rotation.\r\n * @param point - original pointer coordinates\r\n */\r\n public rotatePoint(point: IPoint): IPoint {\r\n if (this.rotationAngle === 0) {\r\n return point;\r\n }\r\n\r\n const matrix = this.container.getCTM();\r\n if (matrix === null) {\r\n return point;\r\n }\r\n let svgPoint = SvgHelper.createPoint(point.x, point.y);\r\n svgPoint = svgPoint.matrixTransform(matrix);\r\n\r\n const result = { x: svgPoint.x, y: svgPoint.y };\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns original point coordinates based on coordinates with rotation applied.\r\n * @param point - rotated point coordinates.\r\n */\r\n public unrotatePoint(point: IPoint): IPoint {\r\n if (this.rotationAngle === 0) {\r\n return point;\r\n }\r\n\r\n let matrix = this.container.getCTM();\r\n if (matrix === null) {\r\n return point;\r\n }\r\n matrix = matrix.inverse();\r\n let svgPoint = SvgHelper.createPoint(point.x, point.y);\r\n svgPoint = svgPoint.matrixTransform(matrix);\r\n\r\n const result = { x: svgPoint.x, y: svgPoint.y };\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns marker's outline path for use while creating, etc.\r\n * @returns SVG path `d` attribute.\r\n */\r\n public getOutline(): string {\r\n const result = `M 0 0 \r\n H ${this.defaultSize} \r\n V ${this.defaultSize} \r\n H 0 \r\n V 0 Z`;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns marker's state.\r\n */\r\n public getState(): RectangularBoxMarkerBaseState {\r\n const result: RectangularBoxMarkerBaseState = Object.assign(\r\n {\r\n left: this.left,\r\n top: this.top,\r\n width: this.width,\r\n height: this.height,\r\n rotationAngle: this.rotationAngle,\r\n visualTransformMatrix: TransformMatrix.toITransformMatrix(\r\n this.visual!.transform.baseVal.getItem(0).matrix,\r\n ),\r\n containerTransformMatrix: TransformMatrix.toITransformMatrix(\r\n this.container.transform.baseVal.getItem(0).matrix,\r\n ),\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Restores marker's state to the previously saved one.\r\n * @param state - previously saved state.\r\n */\r\n public restoreState(state: MarkerBaseState): void {\r\n super.restoreState(state);\r\n const rbmState = state as RectangularBoxMarkerBaseState;\r\n this.left = rbmState.left;\r\n this.top = rbmState.top;\r\n this.width = rbmState.width;\r\n this.height = rbmState.height;\r\n this.rotationAngle = rbmState.rotationAngle;\r\n\r\n this.moveVisual({ x: this.left, y: this.top });\r\n\r\n if (rbmState.visualTransformMatrix && rbmState.containerTransformMatrix) {\r\n this.visual!.transform.baseVal.getItem(0).setMatrix(\r\n TransformMatrix.toSVGMatrix(\r\n this.visual!.transform.baseVal.getItem(0).matrix,\r\n rbmState.visualTransformMatrix,\r\n ),\r\n );\r\n this.container.transform.baseVal\r\n .getItem(0)\r\n .setMatrix(\r\n TransformMatrix.toSVGMatrix(\r\n this.container.transform.baseVal.getItem(0).matrix,\r\n rbmState.containerTransformMatrix,\r\n ),\r\n );\r\n } else {\r\n this.applyRotation();\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Scales marker. Used after the image resize.\r\n *\r\n * @param scaleX - horizontal scale\r\n * @param scaleY - vertical scale\r\n */\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n const rPoint = this.rotatePoint({ x: this.left, y: this.top });\r\n const point = this.unrotatePoint({\r\n x: rPoint.x * scaleX,\r\n y: rPoint.y * scaleY,\r\n });\r\n\r\n this.left = point.x;\r\n this.top = point.y;\r\n this.width = this.width * scaleX;\r\n this.height = this.height * scaleY;\r\n }\r\n}\r\n","import { MarkerBaseState } from './MarkerBaseState';\r\nimport { RectangularBoxMarkerBase } from './RectangularBoxMarkerBase';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\nexport class ShapeOutlineMarkerBase extends RectangularBoxMarkerBase {\r\n public static title = 'Shape outline marker';\r\n\r\n protected applyStrokeColor() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['stroke', this._strokeColor]]);\r\n }\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || el === this.visual) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n protected getPath(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n width: number = this.width,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n height: number = this.height,\r\n ): string {\r\n return 'M0,0';\r\n }\r\n\r\n public getOutline(): string {\r\n return this.getPath(this.defaultSize.width, this.defaultSize.height);\r\n }\r\n\r\n public createVisual(): void {\r\n this.visual = SvgHelper.createPath(this.getPath(), [\r\n ['fill', 'transparent'],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n this.addMarkerVisualToContainer(this.visual);\r\n }\r\n\r\n public adjustVisual(): void {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['d', this.getPath()],\r\n ['fill', 'transparent'],\r\n ['stroke', this._strokeColor],\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n public setSize(): void {\r\n super.setSize();\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['d', this.getPath()]]);\r\n }\r\n }\r\n\r\n /**\r\n * Restores previously saved marker state.\r\n *\r\n * @param state - previously saved state.\r\n */\r\n public restoreState(state: MarkerBaseState): void {\r\n this.createVisual();\r\n super.restoreState(state);\r\n this.adjustVisual();\r\n }\r\n\r\n /**\r\n * Scales marker. Used after the image resize.\r\n *\r\n * @param scaleX - horizontal scale\r\n * @param scaleY - vertical scale\r\n */\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.setSize();\r\n }\r\n}\r\n","import { ShapeOutlineMarkerBase } from './ShapeOutlineMarkerBase';\r\nimport { ShapeOutlineMarkerBaseState } from './ShapeOutlineMarkerBaseState';\r\n\r\nexport class FrameMarker extends ShapeOutlineMarkerBase {\r\n /**\r\n * String type name of the marker type.\r\n */\r\n public static typeName = 'FrameMarker';\r\n\r\n /**\r\n * Marker type title (display name) used for accessibility and other attributes.\r\n */\r\n public static title = 'Frame marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n }\r\n\r\n protected getPath(\r\n width: number = this.width,\r\n height: number = this.height,\r\n ): string {\r\n const result = `M 0 0 \r\n H ${width} \r\n V ${height} \r\n H 0 \r\n V 0 Z`;\r\n\r\n return result;\r\n }\r\n\r\n public getState(): ShapeOutlineMarkerBaseState {\r\n const result = super.getState();\r\n result.typeName = FrameMarker.typeName;\r\n return result;\r\n }\r\n}\r\n","import { LinearMarkerBaseState } from './LinearMarkerBaseState';\r\nimport { MarkerBase } from './MarkerBase';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\nexport class LinearMarkerBase extends MarkerBase {\r\n /**\r\n * x coordinate of the first end-point\r\n */\r\n public x1 = 0;\r\n /**\r\n * y coordinate of the first end-point\r\n */\r\n public y1 = 0;\r\n /**\r\n * x coordinate of the second end-point\r\n */\r\n public x2 = 0;\r\n /**\r\n * y coordinate of the second end-point\r\n */\r\n public y2 = 0;\r\n\r\n /**\r\n * Marker's main visual.\r\n */\r\n protected visual: SVGGraphicsElement | undefined;\r\n\r\n protected selectorVisual: SVGGraphicsElement | undefined;\r\n protected visibleVisual: SVGGraphicsElement | undefined;\r\n\r\n protected applyStrokeColor() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke', this._strokeColor],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n if (this.selectorVisual) {\r\n SvgHelper.setAttributes(this.selectorVisual, [\r\n ['stroke-width', Math.max(this._strokeWidth, 8).toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.getState = this.getState.bind(this);\r\n this.restoreState = this.restoreState.bind(this);\r\n this.scale = this.scale.bind(this);\r\n }\r\n\r\n /**\r\n * Returns true if passed SVG element belongs to the marker. False otherwise.\r\n *\r\n * @param el - target element.\r\n */\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n el === this.visual ||\r\n el === this.selectorVisual ||\r\n el === this.visibleVisual\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n protected getPath(): string {\r\n return 'M0,0';\r\n }\r\n\r\n public createVisual(): void {\r\n this.visual = SvgHelper.createGroup();\r\n this.selectorVisual = SvgHelper.createPath(\r\n this.getPath(),\r\n [\r\n ['stroke', 'transparent'],\r\n ['stroke-width', Math.max(this.strokeWidth, 8).toString()],\r\n ]\r\n );\r\n this.visibleVisual = SvgHelper.createPath(\r\n this.getPath(),\r\n [\r\n ['stroke', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ]\r\n );\r\n this.visual.appendChild(this.selectorVisual);\r\n this.visual.appendChild(this.visibleVisual);\r\n\r\n this.addMarkerVisualToContainer(this.visual);\r\n }\r\n\r\n /**\r\n * When implemented adjusts marker visual after manipulation when needed.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n public adjustVisual(): void {\r\n if (this.selectorVisual && this.visibleVisual) {\r\n SvgHelper.setAttributes(this.selectorVisual, [['d', this.getPath()]]);\r\n SvgHelper.setAttributes(this.visibleVisual, [['d', this.getPath()]]);\r\n\r\n SvgHelper.setAttributes(this.visibleVisual, [['stroke', this.strokeColor]]);\r\n SvgHelper.setAttributes(this.visibleVisual, [['stroke-width', this.strokeWidth.toString()]]);\r\n SvgHelper.setAttributes(this.visibleVisual, [['stroke-dasharray', this.strokeDasharray.toString()]]);\r\n }\r\n }\r\n\r\n /**\r\n * Returns marker's state.\r\n */\r\n public getState(): LinearMarkerBaseState {\r\n const result: LinearMarkerBaseState = Object.assign(\r\n {\r\n x1: this.x1,\r\n y1: this.y1,\r\n x2: this.x2,\r\n y2: this.y2,\r\n },\r\n super.getState(),\r\n );\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Restores marker's state to the previously saved one.\r\n * @param state - previously saved state.\r\n */\r\n public restoreState(state: MarkerBaseState): void {\r\n super.restoreState(state);\r\n\r\n const lmbState = state as LinearMarkerBaseState;\r\n this.x1 = lmbState.x1;\r\n this.y1 = lmbState.y1;\r\n this.x2 = lmbState.x2;\r\n this.y2 = lmbState.y2;\r\n\r\n this.createVisual();\r\n this.adjustVisual();\r\n }\r\n\r\n /**\r\n * Scales marker. Used after the image resize.\r\n *\r\n * @param scaleX - horizontal scale\r\n * @param scaleY - vertical scale\r\n */\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.x1 = this.x1 * scaleX;\r\n this.y1 = this.y1 * scaleY;\r\n this.x2 = this.x2 * scaleX;\r\n this.y2 = this.y2 * scaleY;\r\n\r\n this.adjustVisual();\r\n }\r\n}\r\n","import { IPoint } from './IPoint';\r\nimport { MarkerBase } from './MarkerBase';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { PolygonMarkerState } from './PolygonMarkerState';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\nexport class PolygonMarker extends MarkerBase {\r\n public static typeName = 'PolygonMarker';\r\n public static title = 'Polygon marker';\r\n\r\n public points: IPoint[] = [];\r\n\r\n /**\r\n * Marker's main visual.\r\n */\r\n public visual: SVGGraphicsElement | undefined;\r\n\r\n public selectorVisual: SVGGElement | undefined;\r\n public selectorVisualLines: SVGLineElement[] = [];\r\n public visibleVisual: SVGGraphicsElement | undefined;\r\n\r\n protected applyStrokeColor() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke', this._strokeColor],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n if (this.selectorVisual) {\r\n SvgHelper.setAttributes(this.selectorVisual, [\r\n ['stroke-width', Math.max(this._strokeWidth, 8).toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.getState = this.getState.bind(this);\r\n this.restoreState = this.restoreState.bind(this);\r\n this.scale = this.scale.bind(this);\r\n }\r\n\r\n /**\r\n * Returns true if passed SVG element belongs to the marker. False otherwise.\r\n *\r\n * @param el - target element.\r\n */\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n el === this.visual ||\r\n el === this.selectorVisual ||\r\n el === this.visibleVisual ||\r\n this.selectorVisualLines.some((l) => l === el)\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n protected getPath(): string {\r\n if (this.points.length > 1) {\r\n return (\r\n this.points\r\n .map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x},${p.y}`)\r\n .join(' ') + (this.stage !== 'creating' ? ' Z' : '')\r\n );\r\n }\r\n return 'M0,0';\r\n }\r\n\r\n public createVisual(): void {\r\n this.visual = SvgHelper.createGroup();\r\n this.visibleVisual = SvgHelper.createPath(this.getPath(), [\r\n ['stroke', this.strokeColor],\r\n ['fill', 'transparent'],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ]);\r\n this.visual.appendChild(this.visibleVisual);\r\n\r\n this.createSelectorVisual();\r\n\r\n this.addMarkerVisualToContainer(this.visual);\r\n }\r\n\r\n private createSelectorVisual() {\r\n if (this.visual) {\r\n this.selectorVisual = SvgHelper.createGroup();\r\n this.visual.appendChild(this.selectorVisual);\r\n\r\n this.points.forEach(() => {\r\n this.addSelectorLine();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * When implemented adjusts marker visual after manipulation when needed.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n public adjustVisual(): void {\r\n if (this.selectorVisual && this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [['d', this.getPath()]]);\r\n\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke', this.strokeColor],\r\n ]);\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ]);\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-dasharray', this.strokeDasharray.toString()],\r\n ]);\r\n\r\n this.adjustSelectorVisual();\r\n }\r\n }\r\n\r\n private adjustSelectorVisual() {\r\n if (this.selectorVisual) {\r\n // adjust number of lines\r\n const missingLines = this.points.length - this.selectorVisualLines.length;\r\n if (missingLines > 0) {\r\n for (let i = 0; i < missingLines; i++) {\r\n this.addSelectorLine();\r\n }\r\n } else if (missingLines < 0) {\r\n for (let i = 0; i < -missingLines; i++) {\r\n this.selectorVisual!.removeChild(this.selectorVisualLines.pop()!);\r\n }\r\n }\r\n\r\n // adjust line coordinates\r\n this.selectorVisualLines.forEach((line, i) => {\r\n SvgHelper.setAttributes(line, [\r\n ['x1', this.points[i].x.toString()],\r\n ['y1', this.points[i].y.toString()],\r\n ['x2', this.points[(i + 1) % this.points.length].x.toString()],\r\n ['y2', this.points[(i + 1) % this.points.length].y.toString()],\r\n ]);\r\n });\r\n }\r\n }\r\n\r\n private addSelectorLine() {\r\n const line = SvgHelper.createLine(0, 0, 0, 0, [\r\n ['stroke', 'transparent'],\r\n ['stroke-width', Math.max(this.strokeWidth, 8).toString()],\r\n ]);\r\n this.selectorVisual!.appendChild(line);\r\n this.selectorVisualLines.push(line);\r\n }\r\n\r\n /**\r\n * Returns marker's state.\r\n */\r\n public getState(): PolygonMarkerState {\r\n const result: PolygonMarkerState = Object.assign(\r\n {\r\n points: this.points,\r\n },\r\n super.getState(),\r\n );\r\n result.typeName = PolygonMarker.typeName;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Restores marker's state to the previously saved one.\r\n * @param state - previously saved state.\r\n */\r\n public restoreState(state: MarkerBaseState): void {\r\n super.restoreState(state);\r\n\r\n const pmState = state as PolygonMarkerState;\r\n this.points = pmState.points;\r\n\r\n this.createVisual();\r\n this.adjustVisual();\r\n }\r\n\r\n /**\r\n * Scales marker. Used after the image resize.\r\n *\r\n * @param scaleX - horizontal scale\r\n * @param scaleY - vertical scale\r\n */\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.points.forEach((p) => {\r\n p.x = p.x * scaleX;\r\n p.y = p.y * scaleY;\r\n });\r\n\r\n this.adjustVisual();\r\n }\r\n}\r\n","import { FreehandMarkerState } from './FreehandMarkerState';\r\nimport { IPoint } from './IPoint';\r\nimport { MarkerBase } from './MarkerBase';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\nexport class FreehandMarker extends MarkerBase {\r\n public static typeName = 'FreehandMarker';\r\n public static title = 'Freehand marker';\r\n\r\n public points: IPoint[] = [];\r\n\r\n /**\r\n * Marker's main visual.\r\n */\r\n public visual: SVGGraphicsElement | undefined;\r\n\r\n protected selectorVisual: SVGGraphicsElement | undefined;\r\n public visibleVisual: SVGGraphicsElement | undefined;\r\n\r\n protected applyStrokeColor() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke', this._strokeColor],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n if (this.selectorVisual) {\r\n SvgHelper.setAttributes(this.selectorVisual, [\r\n ['stroke-width', Math.max(this._strokeWidth, 8).toString()],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n if (this.visibleVisual) {\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n }\r\n\r\n protected applyOpacity() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.getState = this.getState.bind(this);\r\n this.restoreState = this.restoreState.bind(this);\r\n this.scale = this.scale.bind(this);\r\n }\r\n\r\n /**\r\n * Returns true if passed SVG element belongs to the marker. False otherwise.\r\n *\r\n * @param el - target element.\r\n */\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n el === this.visual ||\r\n el === this.selectorVisual ||\r\n el === this.visibleVisual\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n protected getPath(): string {\r\n if (this.points.length > 1) {\r\n return (\r\n this.points\r\n .map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x},${p.y}`)\r\n .join(' ')\r\n );\r\n }\r\n return 'M0,0';\r\n }\r\n\r\n public createVisual(): void {\r\n this.visual = SvgHelper.createGroup();\r\n this.selectorVisual = SvgHelper.createPath(\r\n this.getPath(),\r\n [\r\n ['stroke', 'transparent'],\r\n ['fill', 'transparent'],\r\n ['stroke-width', Math.max(this.strokeWidth, 8).toString()],\r\n ]\r\n );\r\n this.visibleVisual = SvgHelper.createPath(this.getPath(), [\r\n ['stroke', this.strokeColor],\r\n ['fill', 'transparent'],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ]);\r\n this.visual.appendChild(this.selectorVisual);\r\n this.visual.appendChild(this.visibleVisual);\r\n\r\n this.addMarkerVisualToContainer(this.visual);\r\n }\r\n\r\n /**\r\n * When implemented adjusts marker visual after manipulation when needed.\r\n */\r\n public adjustVisual(): void {\r\n if (this.selectorVisual && this.visibleVisual) {\r\n const path = this.getPath();\r\n SvgHelper.setAttributes(this.selectorVisual, [['d', path]]);\r\n SvgHelper.setAttributes(this.visibleVisual, [['d', path]]);\r\n\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke', this.strokeColor],\r\n ]);\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ]);\r\n SvgHelper.setAttributes(this.visibleVisual, [\r\n ['stroke-dasharray', this.strokeDasharray.toString()],\r\n ]);\r\n }\r\n }\r\n\r\n /**\r\n * Returns marker's state.\r\n */\r\n public getState(): FreehandMarkerState {\r\n const result: FreehandMarkerState = Object.assign(\r\n {\r\n points: this.points,\r\n },\r\n super.getState(),\r\n );\r\n result.typeName = FreehandMarker.typeName;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Restores marker's state to the previously saved one.\r\n * @param state - previously saved state.\r\n */\r\n public restoreState(state: MarkerBaseState): void {\r\n super.restoreState(state);\r\n\r\n const pmState = state as FreehandMarkerState;\r\n this.points = pmState.points;\r\n\r\n this.createVisual();\r\n this.adjustVisual();\r\n }\r\n\r\n /**\r\n * Scales marker. Used after the image resize.\r\n *\r\n * @param scaleX - horizontal scale\r\n * @param scaleY - vertical scale\r\n */\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n this.points.forEach((p) => {\r\n p.x = p.x * scaleX;\r\n p.y = p.y * scaleY;\r\n });\r\n\r\n this.adjustVisual();\r\n }\r\n}\r\n","import { FontSize } from './FontSize';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\n/**\r\n * TextBlock represents a block of text used across all text-based stencils and connector labels.\r\n */\r\nexport class TextBlock {\r\n /**\r\n * Fired when text size changes.\r\n *\r\n * @group Events\r\n */\r\n public onTextSizeChanged?: (textBlock: TextBlock) => void;\r\n\r\n private _text = '';\r\n /**\r\n * Returns the text block's text\r\n */\r\n public get text() {\r\n return this._text;\r\n }\r\n /**\r\n * Sets the text block's text.\r\n */\r\n public set text(value) {\r\n this._text = value;\r\n this.renderText();\r\n }\r\n\r\n /**\r\n * Text block's horizontal offset from the automatically calculated position.\r\n */\r\n public offsetX = 0;\r\n /**\r\n * Text block's vertical offset from the automatically calculated position.\r\n */\r\n public offsetY = 0;\r\n\r\n private _boundingBox: DOMRect = new DOMRect();\r\n /**\r\n * Returns the bounding box where text should fit and/or be anchored.\r\n */\r\n public get boundingBox(): DOMRect {\r\n return this._boundingBox;\r\n }\r\n /**\r\n * Sets the bounding box where text should fit and/or be anchored.\r\n */\r\n public set boundingBox(value: DOMRect) {\r\n this._boundingBox = value;\r\n this.renderText();\r\n //this.positionText();\r\n }\r\n\r\n private _labelBackground: SVGRectElement = SvgHelper.createRect(10, 10, [\r\n ['fill', 'white'],\r\n ]);\r\n /**\r\n * Returns the background rectangle (behind the text).\r\n */\r\n public get labelBackground(): SVGRectElement {\r\n return this._labelBackground;\r\n }\r\n\r\n private _textElement: SVGTextElement = SvgHelper.createText();\r\n /**\r\n * Returns the text block's text element.\r\n */\r\n public get textElement(): SVGTextElement {\r\n return this._textElement;\r\n }\r\n\r\n private _color = 'transparent';\r\n /**\r\n * Sets the text color.\r\n */\r\n public set color(value: string) {\r\n if (this.textElement) {\r\n SvgHelper.setAttributes(this._textElement, [['fill', value]]);\r\n }\r\n this._color = value;\r\n }\r\n /**\r\n * Returns the text color.\r\n */\r\n public get color(): string {\r\n return this._color;\r\n }\r\n\r\n private _fontFamily = '';\r\n /**\r\n * Returns the text's font family.\r\n */\r\n public get fontFamily() {\r\n return this._fontFamily;\r\n }\r\n /**\r\n * Sets the text's font family.\r\n */\r\n public set fontFamily(value) {\r\n if (this._textElement) {\r\n this._textElement.style.fontFamily = value;\r\n }\r\n this._fontFamily = value;\r\n this.positionText();\r\n }\r\n\r\n private _fontSize: FontSize = {\r\n value: 1,\r\n units: 'rem',\r\n step: 0.1,\r\n };\r\n /**\r\n * Returns the text's font size.\r\n */\r\n public get fontSize() {\r\n return this._fontSize;\r\n }\r\n /**\r\n * Sets the text's font size.\r\n */\r\n public set fontSize(value: FontSize) {\r\n if (this._textElement) {\r\n this._textElement.style.fontSize = `${value.value}${value.units}`;\r\n }\r\n this._fontSize = value;\r\n this.positionText();\r\n }\r\n\r\n /**\r\n * Creates a text block\r\n * @param text initial text\r\n */\r\n constructor(text?: string) {\r\n this.setupTextElement();\r\n\r\n if (text !== undefined) {\r\n this.text = text;\r\n }\r\n\r\n this.setupTextElement = this.setupTextElement.bind(this);\r\n this.renderText = this.renderText.bind(this);\r\n this.positionText = this.positionText.bind(this);\r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n this.show = this.show.bind(this);\r\n this.hide = this.hide.bind(this);\r\n this.showControlBox = this.showControlBox.bind(this);\r\n this.hideControlBox = this.hideControlBox.bind(this);\r\n this.applyFontStyles = this.applyFontStyles.bind(this);\r\n this.wrapText = this.wrapText.bind(this);\r\n }\r\n\r\n /**\r\n * Returns true if the text block contains the supplied element.\r\n * @param el element to test.\r\n * @returns true if the element belongs to the text block, false otherwise.\r\n */\r\n public ownsTarget(el: EventTarget) {\r\n if (el === this._textElement) {\r\n return true;\r\n } else {\r\n let found = false;\r\n this._textElement.childNodes.forEach((span) => {\r\n if (span === el) {\r\n found = true;\r\n }\r\n });\r\n return found;\r\n }\r\n }\r\n\r\n private setupTextElement() {\r\n this._textElement.style.fontSize = `${this.fontSize.value}${this.fontSize.units}`;\r\n this._textElement.style.textAnchor = 'middle';\r\n\r\n this._labelBackground.style.stroke = '#aaa';\r\n this._labelBackground.style.strokeDasharray = '2 2';\r\n this._labelBackground.style.strokeWidth = '1';\r\n this._labelBackground.style.strokeOpacity = '0';\r\n }\r\n\r\n private wrapText(): string {\r\n function getTextAspectRatio(textLines: string[]): number {\r\n const charsLinesAspectRatio = 0.35;\r\n\r\n let longestLineChars = textLines[0].length;\r\n textLines.forEach(line => {\r\n if (line.length > longestLineChars) {\r\n longestLineChars = line.length;\r\n }\r\n });\r\n\r\n return longestLineChars * charsLinesAspectRatio / textLines.length;\r\n }\r\n\r\n if (this.text !== '') {\r\n const lines = this.text.split(/\\r\\n|[\\n\\v\\f\\r\\x85\\u2028\\u2029]/);\r\n const boxAspectRatio = this.boundingBox.width * 1.0 / this.boundingBox.height;\r\n let processedLines = new Array<string>(...lines);\r\n \r\n let textAspectRatio = getTextAspectRatio(processedLines);\r\n\r\n let maxLineLength = Number.MAX_VALUE;\r\n while (textAspectRatio > boxAspectRatio) {\r\n let longestLine = processedLines[0];\r\n processedLines.forEach(line => {\r\n if (line.length > longestLine.length) {\r\n longestLine = line;\r\n }\r\n });\r\n maxLineLength = longestLine.lastIndexOf(' ', maxLineLength - 1);\r\n\r\n if (maxLineLength > 0) {\r\n processedLines = [];\r\n lines.forEach(line => {\r\n let reminderLine = line;\r\n while (reminderLine.length > maxLineLength) {\r\n let maxEnd = reminderLine.lastIndexOf(' ', maxLineLength);\r\n if (maxEnd < 0) {\r\n // if the first word is longer than max, at least wrap after it\r\n maxEnd = reminderLine.indexOf(' ');\r\n }\r\n if (maxEnd > 0) {\r\n processedLines.push(reminderLine.substring(0, maxEnd));\r\n reminderLine = reminderLine.substring(maxEnd).trim();\r\n } else {\r\n processedLines.push(reminderLine);\r\n reminderLine = '';\r\n }\r\n }\r\n processedLines.push(reminderLine);\r\n });\r\n textAspectRatio = getTextAspectRatio(processedLines);\r\n } else {\r\n // can't wrap no more\r\n textAspectRatio = -1;\r\n }\r\n }\r\n\r\n return processedLines.join(`\\r\\n`);\r\n } else {\r\n return this.text;\r\n }\r\n }\r\n\r\n public wordWrap = false;\r\n private prevWrappedText = '';\r\n /**\r\n * Renders text within the text block according to its settings.\r\n */\r\n public renderText() {\r\n const LINE_SIZE = '1em'; // `${this.fontSize.value}${this.fontSize.units}`;\r\n\r\n if (this._textElement) {\r\n const processedText = this.wordWrap ? this.wrapText() : this.text;\r\n if (this.prevWrappedText === processedText) {\r\n this.positionText();\r\n return;\r\n }\r\n this.prevWrappedText = processedText;\r\n\r\n while (this._textElement.lastChild) {\r\n this._textElement.removeChild(this._textElement.lastChild);\r\n }\r\n\r\n const lines = processedText.split(/\\r\\n|[\\n\\v\\f\\r\\x85\\u2028\\u2029]/);\r\n lines.forEach((line, lineno) => {\r\n this._textElement.appendChild(\r\n SvgHelper.createTSpan(\r\n // workaround for swallowed empty lines\r\n line.trim() === '' ? ' ' : line.trim(),\r\n [\r\n // ['x', '0'],\r\n ['dy', lineno > 0 ? LINE_SIZE : '0'],\r\n ]\r\n )\r\n );\r\n });\r\n\r\n // hide to prevent jerky movements during layout\r\n this.textElement.style.opacity = '0';\r\n\r\n setTimeout(() => {\r\n this.positionText(this);\r\n }, 100);\r\n }\r\n }\r\n\r\n private applyFontStyles() {\r\n this._textElement.childNodes.forEach((ts) => {\r\n const tspan = <SVGTSpanElement>ts;\r\n tspan.style.fontFamily = this._textElement.style.fontFamily;\r\n tspan.style.fontSize = this._textElement.style.fontSize;\r\n });\r\n }\r\n\r\n private _textSize?: DOMRect;\r\n /**\r\n * Returns the size of the rectangle containing the text block's text.\r\n */\r\n public get textSize(): DOMRect | undefined {\r\n return this._textSize;\r\n }\r\n\r\n /**\r\n * Positions the text within the text block.\r\n * @param textBlock\r\n */\r\n public positionText(textBlock?: TextBlock) {\r\n const self = textBlock === undefined ? this : textBlock;\r\n const LINE_SIZE = '1em'; //`${this.fontSize.value}${this.fontSize.units}`;\r\n\r\n self.applyFontStyles();\r\n\r\n self._textSize = self._textElement.getBBox();\r\n const centerX =\r\n self.boundingBox.x + self._textSize.width / 2 + self.offsetX;\r\n\r\n const noOfLines = self._textElement.childNodes.length;\r\n const lineHeight = self._textSize.height / noOfLines;\r\n // arbitrary approximation for correct vertical alignment\r\n const autoOffset =\r\n noOfLines > 1 ? -(lineHeight * (noOfLines - 2)) / 2 : lineHeight / 3;\r\n\r\n const centerY =\r\n self.boundingBox.y +\r\n self._textSize.height / 2 +\r\n // - self._textSize.height / 2\r\n autoOffset +\r\n self.offsetY;\r\n\r\n self._textElement.childNodes.forEach((ts, lineno) => {\r\n const tspan = <SVGTSpanElement>ts;\r\n SvgHelper.setAttributes(tspan, [\r\n ['x', `${centerX}`],\r\n ['dy', lineno > 0 ? LINE_SIZE : '0'],\r\n ]);\r\n });\r\n SvgHelper.setAttributes(self._textElement, [['x', `${centerX}`]]);\r\n SvgHelper.setAttributes(self._textElement, [['y', `${centerY}`]]);\r\n\r\n self._textSize = self._textElement.getBBox();\r\n const bgPadding = 1.2;\r\n SvgHelper.setAttributes(self.labelBackground, [\r\n ['width', (self._textSize.width * bgPadding).toString()],\r\n ['height', (self._textSize.height * bgPadding).toString()],\r\n ['x', (centerX - (self._textSize.width * bgPadding) / 2).toString()],\r\n [\r\n 'y',\r\n (\r\n self._textSize.y - bgPadding\r\n // centerY -\r\n // (self._textSize.height / 2) * (bgPadding - 1) * 2\r\n // - lineHeight / 2\r\n ).toString(),\r\n ],\r\n ]);\r\n\r\n if (self.onTextSizeChanged) {\r\n self.onTextSizeChanged(self);\r\n }\r\n\r\n // restore visibility\r\n this.textElement.style.opacity = '1';\r\n }\r\n\r\n /**\r\n * Makes the text block content visible.\r\n */\r\n public show() {\r\n this._textElement.style.display = '';\r\n this._labelBackground.style.display = '';\r\n }\r\n /**\r\n * Hides the text block content.\r\n */\r\n public hide() {\r\n this._textElement.style.display = 'none';\r\n this._labelBackground.style.display = 'none';\r\n }\r\n\r\n /**\r\n * Shows the text block's dashed outline.\r\n */\r\n public showControlBox() {\r\n this.labelBackground.style.strokeOpacity = '1';\r\n }\r\n /**\r\n * Hides the text block's dashed outline.\r\n */\r\n public hideControlBox() {\r\n this.labelBackground.style.strokeOpacity = '0';\r\n }\r\n}\r\n","import { FontSize } from './FontSize';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { RectangularBoxMarkerBase } from './RectangularBoxMarkerBase';\r\nimport { TextBlock } from './TextBlock';\r\nimport { TextMarkerState } from './TextMarkerState';\r\n\r\nexport class TextMarker extends RectangularBoxMarkerBase {\r\n public static typeName = 'TextMarker';\r\n\r\n public static title = 'Text marker';\r\n\r\n protected static DEFAULT_TEXT = 'Text';\r\n // protected static DEFAULT_TEXT =\r\n // 'Longer text to see what happens when it is too long to fit the bounding box.';\r\n\r\n public onSizeChanged?: (textMarker: TextMarker) => void;\r\n\r\n private _color = 'black';\r\n /**\r\n * Returns stencil's text color.\r\n */\r\n public get color() {\r\n return this._color;\r\n }\r\n /**\r\n * Sets the stencil's text color.\r\n */\r\n public set color(value) {\r\n this._color = value;\r\n this.textBlock.color = value;\r\n }\r\n\r\n private _fontFamily = 'Helvetica, Arial, sans-serif';\r\n /**\r\n * Returns the stencil's font family.\r\n */\r\n public get fontFamily() {\r\n return this._fontFamily;\r\n }\r\n /**\r\n * Sets the stencil's font family.\r\n */\r\n public set fontFamily(value) {\r\n this._fontFamily = value;\r\n this.textBlock.fontFamily = value;\r\n }\r\n\r\n private _fontSize: FontSize = {\r\n value: 1,\r\n units: 'rem',\r\n step: 0.1,\r\n };\r\n /**\r\n * Returns the stencil's font size.\r\n */\r\n public get fontSize(): FontSize {\r\n return this._fontSize;\r\n }\r\n /**\r\n * Sets the stencil's font size.\r\n */\r\n public set fontSize(value: FontSize) {\r\n this._fontSize = value;\r\n this.textBlock.fontSize = value;\r\n }\r\n\r\n /**\r\n * Returns the default text for the stencil type.\r\n * @returns stencil type's default text.\r\n */\r\n protected getDefaultText(): string {\r\n return Object.getPrototypeOf(this).constructor.DEFAULT_TEXT;\r\n }\r\n private _text: string = this.getDefaultText();\r\n /**\r\n * Returns the stencil's text.\r\n */\r\n public get text(): string {\r\n return this.textBlock.text;\r\n }\r\n /**\r\n * Sets the stencil's text.\r\n */\r\n public set text(value: string) {\r\n this._text = value;\r\n this.textBlock.text = this._text;\r\n }\r\n\r\n /**\r\n * Text padding from the bounding box.\r\n */\r\n protected padding = 2;\r\n\r\n /**\r\n * Text's bounding box where text should fit and/or be anchored to.\r\n */\r\n public textBoundingBox: DOMRect;\r\n\r\n /**\r\n * Text block handling the text rendering.\r\n */\r\n public textBlock: TextBlock = new TextBlock(this.getDefaultText());\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.setColor = this.setColor.bind(this);\r\n this.setFont = this.setFont.bind(this);\r\n this.setFontSize = this.setFontSize.bind(this);\r\n this.setSize = this.setSize.bind(this);\r\n this.textSizeChanged = this.textSizeChanged.bind(this);\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n\r\n this.textBoundingBox = new DOMRect();\r\n }\r\n\r\n public createVisual(): void {\r\n this.textBlock.fontFamily = this.fontFamily;\r\n this.textBlock.fontSize = this.fontSize;\r\n this.textBlock.color = this.color;\r\n this.textBlock.onTextSizeChanged = this.textSizeChanged;\r\n\r\n this.visual = this.textBlock.textElement;\r\n this.addMarkerVisualToContainer(this.visual);\r\n\r\n this.textBlock.text = this._text;\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n el === this.visual ||\r\n this.textBlock.ownsTarget(el)\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n protected setTextBoundingBox() {\r\n this.textBoundingBox.x = this.padding;\r\n this.textBoundingBox.y = this.padding;\r\n this.textBoundingBox.width = Number.MAX_VALUE; // this.width - this.padding * 2;\r\n this.textBoundingBox.height = Number.MAX_VALUE; // this.height - this.padding * 2;\r\n //this.textBlock.boundingBox = this.textBoundingBox;\r\n }\r\n\r\n /**\r\n * Sets (adjusts) the stencil's size.\r\n */\r\n public setSize(): void {\r\n super.setSize();\r\n\r\n const [prevWidth, prevHeight] = [this.width, this.height];\r\n\r\n if (this.textBlock.textSize) {\r\n this.width = this.textBlock.textSize.width + this.padding * 2;\r\n this.height = this.textBlock.textSize.height + this.padding * 2;\r\n }\r\n\r\n if (\r\n (prevWidth !== this.width || prevHeight !== this.height) &&\r\n this.onSizeChanged\r\n ) {\r\n this.onSizeChanged(this);\r\n }\r\n\r\n this.setTextBoundingBox();\r\n }\r\n\r\n private textSizeChanged(): void {\r\n this.setSize();\r\n }\r\n\r\n /**\r\n * Sets the text color.\r\n * @param color text color\r\n */\r\n public setColor(color: string): void {\r\n this.color = color;\r\n }\r\n\r\n /**\r\n * Sets the font family.\r\n * @param font font family string\r\n */\r\n public setFont(font: string): void {\r\n this.fontFamily = font;\r\n }\r\n\r\n /**\r\n * Sets the font size.\r\n * @param fontSize font size\r\n */\r\n public setFontSize(fontSize: FontSize): void {\r\n this.fontSize = fontSize;\r\n }\r\n\r\n public hideVisual(): void {\r\n if (this.visual) {\r\n this.visual.style.visibility = 'hidden';\r\n }\r\n }\r\n public showVisual() {\r\n if (this.visual) {\r\n this.visual.style.visibility = 'visible';\r\n this.textBlock.renderText();\r\n }\r\n }\r\n\r\n public getState(): TextMarkerState {\r\n const result: TextMarkerState = Object.assign(\r\n {\r\n color: this.color,\r\n fontFamily: this.fontFamily,\r\n fontSize: this.fontSize,\r\n text: this.text,\r\n },\r\n super.getState(),\r\n );\r\n\r\n result.typeName = TextMarker.typeName;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Restores previously saved marker state.\r\n *\r\n * @param state - previously saved state.\r\n */\r\n public restoreState(state: MarkerBaseState): void {\r\n const textState = state as TextMarkerState;\r\n this.color = textState.color;\r\n this.fontFamily = textState.fontFamily;\r\n this.fontSize = textState.fontSize;\r\n this.text = textState.text;\r\n\r\n this.createVisual();\r\n \r\n super.restoreState(state);\r\n this.setSize();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n const newFontSize = {\r\n ...this.fontSize,\r\n value: this.fontSize.value * Math.min(scaleX, scaleY),\r\n };\r\n this.fontSize = newFontSize;\r\n\r\n this.setSize();\r\n } \r\n\r\n}\r\n","import { LinearMarkerBase } from './LinearMarkerBase';\r\nimport { LinearMarkerBaseState } from './LinearMarkerBaseState';\r\n\r\nexport class LineMarker extends LinearMarkerBase {\r\n public static typeName = 'LineMarker';\r\n public static title = 'Line marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.strokeColor = '#ff0000';\r\n this.strokeWidth = 3;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n }\r\n\r\n protected getPath(): string {\r\n // svg path for line\r\n const result = `M ${this.x1} ${this.y1} L ${this.x2} ${this.y2}`;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns current marker state that can be restored in the future.\r\n */\r\n public getState(): LinearMarkerBaseState {\r\n const result: LinearMarkerBaseState = super.getState();\r\n result.typeName = LineMarker.typeName;\r\n\r\n return result;\r\n }\r\n}\r\n","import { IPoint, MarkerBase, MarkerBaseState, SvgHelper } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\n\r\n/**\r\n * Represents marker's state (status) in time.\r\n */\r\nexport type MarkerEditorState =\r\n | 'new'\r\n | 'creating'\r\n | 'select'\r\n | 'move'\r\n | 'resize'\r\n | 'rotate'\r\n | 'edit';\r\n\r\nexport type MarkerCreationStyle = 'draw' | 'drop';\r\n\r\nexport class MarkerBaseEditor<TMarkerType extends MarkerBase = MarkerBase> {\r\n \r\n protected _markerType: new (container: SVGGElement) => TMarkerType;\r\n \r\n protected _creationStyle: MarkerCreationStyle = 'draw';\r\n public get creationStyle(): MarkerCreationStyle {\r\n return this._creationStyle;\r\n }\r\n\r\n /**\r\n * Type guard for specific marker editor types.\r\n * @param cls \r\n * @returns \r\n */\r\n public is<T>(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n cls: new (...args: any[]) => T,\r\n ): this is T {\r\n return this instanceof cls;\r\n }\r\n \r\n\r\n protected _marker: TMarkerType;\r\n\r\n public get marker(): TMarkerType {\r\n return this._marker;\r\n }\r\n\r\n protected _container: SVGGElement;\r\n /**\r\n * Returns the SVG container for the marker's and editor's visual elements.\r\n */\r\n public get container(): SVGGElement {\r\n return this._container;\r\n }\r\n\r\n /**\r\n * Overlay container for HTML elements like text editors, etc.\r\n */\r\n protected _overlayContainer: HTMLDivElement;\r\n /**\r\n * Overlay container for HTML elements like text editors, etc.\r\n */\r\n public get overlayContainer(): HTMLDivElement {\r\n return this._overlayContainer;\r\n }\r\n\r\n /**\r\n * Editor's state.\r\n */\r\n protected _state: MarkerEditorState = 'new';\r\n /**\r\n * Gets editor's state.\r\n */\r\n public get state(): MarkerEditorState {\r\n return this._state;\r\n }\r\n /**\r\n * Sets editor's state.\r\n */\r\n public set state(value: MarkerEditorState) {\r\n this._state = value;\r\n }\r\n\r\n /**\r\n * SVG group holding editor's control box.\r\n */\r\n protected _controlBox = SvgHelper.createGroup();\r\n\r\n /**\r\n * Method called when marker creation is finished.\r\n */\r\n public onMarkerCreated?: <T extends MarkerBaseEditor<MarkerBase>>(\r\n editor: T,\r\n ) => void;\r\n\r\n /**\r\n * Method to call when marker state changes.\r\n */\r\n public onStateChanged?: <T extends MarkerBaseEditor<MarkerBase>>(\r\n editor: T,\r\n ) => void;\r\n\r\n /**\r\n * Marker's state when it is selected\r\n */\r\n protected manipulationStartState?: string;\r\n\r\n /**\r\n * Is this marker selected?\r\n */\r\n protected _isSelected = false;\r\n\r\n /**\r\n * Returns true if the marker is currently selected\r\n */\r\n public get isSelected(): boolean {\r\n return this._isSelected;\r\n }\r\n\r\n protected _continuousCreation = false;\r\n public get continuousCreation() {\r\n return this._continuousCreation;\r\n }\r\n\r\n /**\r\n * Sets rectangle's border stroke color.\r\n * @param color - color as string\r\n */\r\n public set strokeColor(color: string) {\r\n this.marker.strokeColor = color;\r\n }\r\n\r\n public get strokeColor(): string {\r\n return this.marker.strokeColor;\r\n }\r\n\r\n /**\r\n * Sets rectangle's border stroke (line) width.\r\n * @param color - color as string\r\n */\r\n public set strokeWidth(width: number) {\r\n this.marker.strokeWidth = width;\r\n this.adjustControlBox();\r\n this.stateChanged();\r\n }\r\n\r\n public get strokeWidth(): number {\r\n return this.marker.strokeWidth;\r\n }\r\n\r\n /**\r\n * Sets rectangle's border stroke dash array.\r\n * @param color - color as string\r\n */\r\n public set strokeDasharray(dashes: string) {\r\n this.marker.strokeDasharray = dashes;\r\n this.stateChanged();\r\n }\r\n\r\n public get strokeDasharray(): string {\r\n return this.marker.strokeDasharray;\r\n }\r\n\r\n public set fillColor(color: string) {\r\n this.marker.fillColor = color;\r\n }\r\n\r\n public get fillColor(): string {\r\n return this.marker.fillColor;\r\n }\r\n\r\n public set opacity(value: number) {\r\n this.marker.opacity = value;\r\n }\r\n\r\n public get opacity(): number {\r\n return this.marker.opacity;\r\n }\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n this._container = properties.container;\r\n this._overlayContainer = properties.overlayContainer;\r\n this._markerType = properties.markerType;\r\n this._marker =\r\n properties.marker ?? new properties.markerType(properties.container);\r\n\r\n this.select = this.select.bind(this);\r\n this.deselect = this.deselect.bind(this);\r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n this.adjustControlBox = this.adjustControlBox.bind(this);\r\n this.stateChanged = this.stateChanged.bind(this);\r\n this.scale = this.scale.bind(this);\r\n this.dispose = this.dispose.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n this.manipulate = this.manipulate.bind(this);\r\n this.dblClick = this.dblClick.bind(this);\r\n }\r\n\r\n public ownsTarget(el: EventTarget | null): boolean {\r\n let found = false;\r\n if (el !== null) {\r\n if (this._marker?.ownsTarget(el)) {\r\n found = true;\r\n }\r\n }\r\n return found;\r\n }\r\n\r\n /**\r\n * Selects this marker and displays appropriate selected marker UI.\r\n */\r\n public select(): void {\r\n this.container.style.cursor = 'move';\r\n this._isSelected = true;\r\n this.manipulationStartState = JSON.stringify(this._marker.getState());\r\n console.log('manipulationStartState', this.manipulationStartState);\r\n }\r\n\r\n /**\r\n * Deselects this marker and hides selected marker UI.\r\n */\r\n public deselect(): void {\r\n this.container.style.cursor = 'default';\r\n this._isSelected = false;\r\n this.stateChanged();\r\n }\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) down event.\r\n *\r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function\r\n public pointerDown(point: IPoint, target?: EventTarget): void {}\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) double click event.\r\n *\r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function\r\n public dblClick(point: IPoint, target?: EventTarget): void {}\r\n\r\n /**\r\n * Handles marker manipulation (move, resize, rotate, etc.).\r\n *\r\n * @param point - event coordinates.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function\r\n public manipulate(point: IPoint): void {}\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) up event.\r\n *\r\n * @param point - event coordinates.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function\r\n public pointerUp(point: IPoint): void {}\r\n\r\n /**\r\n * Disposes the marker and clean's up.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n public dispose(): void {}\r\n\r\n protected adjustControlBox() {}\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n this._marker.scale(scaleX, scaleY);\r\n\r\n this.adjustControlBox();\r\n }\r\n\r\n /**\r\n * Called by a marker when its state could have changed.\r\n * Does a check if the state has indeed changed before firing the handler.\r\n */\r\n protected stateChanged(): void {\r\n if (\r\n this.onStateChanged &&\r\n this.state !== 'creating' &&\r\n this.state !== 'new'\r\n ) {\r\n const currentState = JSON.stringify(this._marker.getState());\r\n console.log('currentState', currentState);\r\n // @todo - check if this is needed\r\n // avoid reacting to state (mode) differences\r\n // if (this.manipulationStartState !== undefined) {\r\n // this.manipulationStartState.state = 'select';\r\n // }\r\n // currentState.state = 'select';\r\n if (\r\n this.manipulationStartState !=\r\n currentState\r\n ) {\r\n this.manipulationStartState = currentState;\r\n this.onStateChanged(this);\r\n }\r\n }\r\n }\r\n\r\n public getState(): MarkerBaseState {\r\n return this.marker.getState();\r\n }\r\n\r\n /**\r\n * Restores previously saved marker state.\r\n *\r\n * @param state - previously saved state.\r\n */\r\n public restoreState(state: MarkerBaseState): void {\r\n this._state = 'select';\r\n this.marker.restoreState(state);\r\n this.adjustControlBox();\r\n }\r\n\r\n}\r\n","import { SvgHelper } from '../core/SvgHelper';\r\n\r\nexport type GripLocation =\r\n | 'topleft'\r\n | 'topcenter'\r\n | 'topright'\r\n | 'leftcenter'\r\n | 'rightcenter'\r\n | 'bottomleft'\r\n | 'bottomcenter'\r\n | 'bottomright';\r\n\r\n/**\r\n * Represents a single resize-manipulation grip used in marker's manipulation controls.\r\n */\r\nexport class Grip {\r\n /**\r\n * Grip's visual element.\r\n */\r\n protected _visual?: SVGGraphicsElement;\r\n public get visual(): SVGGraphicsElement {\r\n if (!this._visual) {\r\n this.createVisual();\r\n }\r\n return this._visual!;\r\n }\r\n\r\n /**\r\n * Grip's size (radius).\r\n */\r\n public gripSize = 5;\r\n\r\n public fillColor = 'rgba(255,255,255,0.9)';\r\n public strokeColor = '#0ea5e9';\r\n\r\n /**\r\n * Creates a new grip.\r\n */\r\n constructor() {\r\n this.createVisual = this.createVisual.bind(this);\r\n }\r\n\r\n protected createVisual() {\r\n this._visual = SvgHelper.createGroup();\r\n this._visual.appendChild(\r\n SvgHelper.createCircle(this.gripSize * 4, [\r\n ['fill', 'transparent'],\r\n ['cx', (this.gripSize / 2).toString()],\r\n ['cy', (this.gripSize / 2).toString()],\r\n ]),\r\n );\r\n const visual = SvgHelper.createCircle(this.gripSize, [\r\n ['fill-opacity', '1'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '1'],\r\n ]);\r\n visual.style.fill = `var(--mjs-grip-fill, ${this.fillColor})`;\r\n visual.style.stroke = `var(--mjs-grip-stroke, ${this.strokeColor})`;\r\n visual.style.filter = 'drop-shadow(0px 0px 2px rgba(0, 0, 0, .7))';\r\n this._visual.appendChild(visual);\r\n }\r\n\r\n /**\r\n * Returns true if passed SVG element belongs to the grip. False otherwise.\r\n *\r\n * @param el - target element.\r\n */\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (el === this._visual) {\r\n return true;\r\n } else {\r\n let found = false;\r\n this._visual?.childNodes.forEach((child) => {\r\n if (child === el) {\r\n found = true;\r\n }\r\n });\r\n return found;\r\n }\r\n }\r\n}\r\n","import { Grip } from './Grip';\r\n\r\nexport class ResizeGrip extends Grip {}\r\n","import { IPoint, PolygonMarker, SvgHelper } from '../core';\r\nimport { MarkerBaseEditor } from './MarkerBaseEditor';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { ResizeGrip } from './ResizeGrip';\r\n\r\nexport class PolygonMarkerEditor<\r\n TMarkerType extends PolygonMarker = PolygonMarker,\r\n> extends MarkerBaseEditor<TMarkerType> {\r\n /**\r\n * Default line length when marker is created with a simple click (without dragging).\r\n */\r\n protected defaultLength = 50;\r\n\r\n /**\r\n * Pointer coordinates at the start of move or resize.\r\n */\r\n protected manipulationStartX = 0;\r\n protected manipulationStartY = 0;\r\n\r\n /**\r\n * Container for control elements.\r\n */\r\n protected controlBox: SVGGElement = SvgHelper.createGroup();\r\n\r\n protected grips: ResizeGrip[] = [];\r\n /**\r\n * Active manipulation grip.\r\n */\r\n protected activeGrip?: ResizeGrip;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n\r\n this.setupControlBox = this.setupControlBox.bind(this);\r\n this.adjustControlBox = this.adjustControlBox.bind(this);\r\n\r\n this.adjustControlGrips = this.adjustControlGrips.bind(this);\r\n this.createGrip = this.createGrip.bind(this);\r\n this.positionGrip = this.positionGrip.bind(this);\r\n this.positionGrips = this.positionGrips.bind(this);\r\n\r\n this.resize = this.resize.bind(this);\r\n\r\n this.manipulate = this.manipulate.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n\r\n this.setupControlBox();\r\n }\r\n\r\n /**\r\n * Returns true if passed SVG element belongs to the marker. False otherwise.\r\n *\r\n * @param el - target element.\r\n */\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this.marker.ownsTarget(el)) {\r\n return true;\r\n } else if (this.grips.some((grip) => grip.ownsTarget(el))) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) down event.\r\n *\r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n */\r\n public pointerDown(point: IPoint, target?: EventTarget): void {\r\n super.pointerDown(point, target);\r\n\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n\r\n if (this.state === 'new') {\r\n this.startCreation(point);\r\n } else if (this._state === 'creating') {\r\n if (this.grips.length > 0 && target && this.grips[0].ownsTarget(target)) {\r\n this.finishCreation();\r\n } else {\r\n this.addNewPointWhileCreating(point);\r\n }\r\n } else {\r\n this.select();\r\n this.activeGrip =\r\n target && this.grips.find((grip) => grip.ownsTarget(target));\r\n\r\n if (this.activeGrip) {\r\n this._state = 'resize';\r\n } else {\r\n this._state = 'move';\r\n }\r\n }\r\n }\r\n\r\n private startCreation(point: IPoint) {\r\n this.marker.stage = 'creating';\r\n this.marker.points.push(point);\r\n this.marker.points.push(point);\r\n this.marker.createVisual();\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n\r\n this.activeGrip = this.grips.at(-1);\r\n if (this.activeGrip) {\r\n this.activeGrip.visual.style.pointerEvents = 'none';\r\n }\r\n\r\n this._state = 'creating';\r\n }\r\n\r\n private addNewPointWhileCreating(point: IPoint) {\r\n this.marker.points.push(point);\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n this.activeGrip = this.grips.at(-1);\r\n if (this.activeGrip) {\r\n this.activeGrip.visual.style.pointerEvents = 'none';\r\n }\r\n }\r\n\r\n private finishCreation() {\r\n this.marker.stage = 'normal';\r\n // connected the last point with the first one\r\n // remove the last point and adjust grips\r\n this.marker.points.pop();\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n this.grips.forEach((grip) => {\r\n grip.visual.style.pointerEvents = '';\r\n });\r\n\r\n this._state = 'select';\r\n if (this.onMarkerCreated) {\r\n this.onMarkerCreated(this);\r\n }\r\n }\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) up event.\r\n *\r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n */\r\n public pointerUp(point: IPoint): void {\r\n super.pointerUp(point);\r\n this.manipulate(point);\r\n if (this._state !== 'creating') {\r\n this._state = 'select';\r\n }\r\n this.stateChanged();\r\n }\r\n\r\n /**\r\n * Handles marker manipulation (move, resize, rotate, etc.).\r\n *\r\n * @param point - event coordinates.\r\n */\r\n public manipulate(point: IPoint): void {\r\n if (this.state === 'creating') {\r\n this.resize(point);\r\n } else if (this.state === 'move') {\r\n this.marker.points.forEach((p) => {\r\n p.x += point.x - this.manipulationStartX;\r\n p.y += point.y - this.manipulationStartY;\r\n });\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n } else if (this.state === 'resize') {\r\n this.resize(point);\r\n }\r\n }\r\n\r\n /**\r\n * Resizes the line marker.\r\n * @param point - current manipulation coordinates.\r\n */\r\n protected resize(point: IPoint): void {\r\n const activeGripIndex = this.activeGrip\r\n ? this.grips.indexOf(this.activeGrip)\r\n : -1;\r\n if (activeGripIndex >= 0) {\r\n this.marker.points[activeGripIndex] = point;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n }\r\n }\r\n\r\n public dblClick(point: IPoint, target?: EventTarget | undefined): void {\r\n if (target && this.state === 'select') {\r\n const selectorLineIndex = this.marker.selectorVisualLines.findIndex((l) => l === target);\r\n if (selectorLineIndex > -1) {\r\n this.marker.points.splice(selectorLineIndex + 1, 0, point);\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n } else {\r\n const gripIndex = this.grips.findIndex((g) => g.ownsTarget(target));\r\n if (gripIndex > -1) {\r\n this.marker.points.splice(gripIndex, 1);\r\n this.marker.adjustVisual();\r\n this.adjustControlGrips();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates control box for manipulation controls.\r\n */\r\n protected setupControlBox(): void {\r\n this.controlBox = SvgHelper.createGroup();\r\n this.container.appendChild(this.controlBox);\r\n\r\n this.adjustControlGrips();\r\n\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n protected adjustControlBox() {\r\n // this.positionGrips();\r\n this.adjustControlGrips();\r\n }\r\n\r\n /**\r\n * Adds control grips to control box.\r\n */\r\n protected adjustControlGrips(): void {\r\n const noOfMissingGrips = this.marker.points.length - this.grips.length;\r\n if (noOfMissingGrips > 0) {\r\n for (let i = 0; i < noOfMissingGrips; i++) {\r\n this.grips.push(this.createGrip());\r\n }\r\n } else if (noOfMissingGrips < 0) {\r\n for (let i = 0; i < -noOfMissingGrips; i++) {\r\n const grip = this.grips.pop();\r\n if (grip) {\r\n this.controlBox.removeChild(grip.visual);\r\n }\r\n }\r\n }\r\n\r\n this.positionGrips();\r\n }\r\n\r\n /**\r\n * Creates manipulation grip.\r\n * @returns - manipulation grip.\r\n */\r\n protected createGrip(): ResizeGrip {\r\n const grip = new ResizeGrip();\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.controlBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n /**\r\n * Updates manipulation grip layout.\r\n */\r\n protected positionGrips(): void {\r\n this.grips.forEach((grip, i) => {\r\n const point = this.marker.points[i];\r\n this.positionGrip(\r\n grip.visual,\r\n point.x - grip.gripSize / 2,\r\n point.y - grip.gripSize / 2,\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Positions manipulation grip.\r\n * @param grip - grip to position\r\n * @param x - new X coordinate\r\n * @param y - new Y coordinate\r\n */\r\n protected positionGrip(grip: SVGGraphicsElement, x: number, y: number): void {\r\n const translate = grip.transform.baseVal.getItem(0);\r\n translate.setTranslate(x, y);\r\n grip.transform.baseVal.replaceItem(translate, 0);\r\n }\r\n\r\n /**\r\n * Displays marker's controls.\r\n */\r\n public select(): void {\r\n super.select();\r\n this.adjustControlBox();\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n /**\r\n * Hides marker's controls.\r\n */\r\n public deselect(): void {\r\n super.deselect();\r\n this.controlBox.style.display = 'none';\r\n if (this.state === 'creating') {\r\n this.finishCreation();\r\n }\r\n }\r\n}\r\n","import { IPoint, LinearMarkerBase, SvgHelper } from '../core';\r\nimport { MarkerBaseEditor } from './MarkerBaseEditor';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { ResizeGrip } from './ResizeGrip';\r\n\r\nexport class LinearMarkerEditor<\r\n TMarkerType extends LinearMarkerBase = LinearMarkerBase,\r\n> extends MarkerBaseEditor<TMarkerType> {\r\n /**\r\n * Default line length when marker is created with a simple click (without dragging).\r\n */\r\n protected defaultLength = 50;\r\n\r\n /**\r\n * Pointer coordinates at the start of move or resize.\r\n */\r\n protected manipulationStartX = 0;\r\n protected manipulationStartY = 0;\r\n\r\n private manipulationStartX1 = 0;\r\n private manipulationStartY1 = 0;\r\n private manipulationStartX2 = 0;\r\n private manipulationStartY2 = 0;\r\n\r\n /**\r\n * Container for control elements.\r\n */\r\n protected controlBox: SVGGElement = SvgHelper.createGroup();\r\n\r\n /**\r\n * First manipulation grip\r\n */\r\n protected grip1?: ResizeGrip;\r\n /**\r\n * Second manipulation grip.\r\n */\r\n protected grip2?: ResizeGrip;\r\n /**\r\n * Active manipulation grip.\r\n */\r\n protected activeGrip?: ResizeGrip;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n \r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n\r\n this.setupControlBox = this.setupControlBox.bind(this);\r\n this.adjustControlBox = this.adjustControlBox.bind(this);\r\n \r\n this.addControlGrips = this.addControlGrips.bind(this);\r\n this.createGrip = this.createGrip.bind(this);\r\n this.positionGrip = this.positionGrip.bind(this);\r\n this.positionGrips = this.positionGrips.bind(this);\r\n\r\n this.resize = this.resize.bind(this);\r\n\r\n this.manipulate = this.manipulate.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n\r\n this.setupControlBox();\r\n }\r\n\r\n /**\r\n * Returns true if passed SVG element belongs to the marker. False otherwise.\r\n * \r\n * @param el - target element.\r\n */\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this.marker.ownsTarget(el)) {\r\n return true;\r\n } else if (\r\n this.grip1?.ownsTarget(el) || this.grip2?.ownsTarget(el)\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } \r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) down event.\r\n * \r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n */\r\n public pointerDown(point: IPoint, target?: EventTarget): void {\r\n super.pointerDown(point, target);\r\n\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n\r\n if (this.state === 'new') {\r\n this.marker.x1 = point.x;\r\n this.marker.y1 = point.y;\r\n this.marker.x2 = point.x;\r\n this.marker.y2 = point.y;\r\n }\r\n\r\n this.manipulationStartX1 = this.marker.x1;\r\n this.manipulationStartY1 = this.marker.y1;\r\n this.manipulationStartX2 = this.marker.x2;\r\n this.manipulationStartY2 = this.marker.y2;\r\n\r\n if (this.state === 'new') {\r\n this.marker.createVisual();\r\n this.marker.adjustVisual();\r\n\r\n this._state = 'creating';\r\n } else {\r\n this.select();\r\n if (target && this.grip1?.ownsTarget(target)) {\r\n this.activeGrip = this.grip1;\r\n } else if (target && this.grip2?.ownsTarget(target)) {\r\n this.activeGrip = this.grip2;\r\n } else {\r\n this.activeGrip = undefined;\r\n }\r\n\r\n if (this.activeGrip) {\r\n this._state = 'resize';\r\n } else {\r\n this._state = 'move';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) up event.\r\n * \r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n */\r\n public pointerUp(point: IPoint): void {\r\n const inState = this.state;\r\n super.pointerUp(point);\r\n if (this.state === 'creating' && Math.abs(this.marker.x1 - this.marker.x2) < 10 \r\n && Math.abs(this.marker.y1 - this.marker.y2) < 10) {\r\n this.marker.x2 = this.marker.x1 + this.defaultLength;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox()\r\n } else {\r\n this.manipulate(point);\r\n }\r\n this._state = 'select';\r\n if (inState === 'creating' && this.onMarkerCreated) {\r\n this.onMarkerCreated(this);\r\n }\r\n }\r\n \r\n /**\r\n * Handles marker manipulation (move, resize, rotate, etc.).\r\n * \r\n * @param point - event coordinates.\r\n */\r\n public manipulate(point: IPoint): void {\r\n if (this.state === 'creating') {\r\n this.resize(point);\r\n } else if (this.state === 'move') {\r\n this.marker.x1 = this.manipulationStartX1 + point.x - this.manipulationStartX;\r\n this.marker.y1 = this.manipulationStartY1 + point.y - this.manipulationStartY;\r\n this.marker.x2 = this.manipulationStartX2 + point.x - this.manipulationStartX;\r\n this.marker.y2 = this.manipulationStartY2 + point.y - this.manipulationStartY;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n } else if (this.state === 'resize') {\r\n this.resize(point);\r\n }\r\n } \r\n\r\n /**\r\n * Resizes the line marker.\r\n * @param point - current manipulation coordinates.\r\n */\r\n protected resize(point: IPoint): void {\r\n switch(this.activeGrip) {\r\n case this.grip1:\r\n this.marker.x1 = point.x;\r\n this.marker.y1 = point.y;\r\n break; \r\n case this.grip2:\r\n case undefined:\r\n this.marker.x2 = point.x;\r\n this.marker.y2 = point.y;\r\n break; \r\n }\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n }\r\n\r\n /**\r\n * Creates control box for manipulation controls.\r\n */\r\n protected setupControlBox(): void {\r\n this.controlBox = SvgHelper.createGroup();\r\n this.container.appendChild(this.controlBox);\r\n\r\n this.addControlGrips();\r\n\r\n this.controlBox.style.display = 'none';\r\n }\r\n\r\n protected adjustControlBox() {\r\n this.positionGrips();\r\n }\r\n\r\n /**\r\n * Adds control grips to control box.\r\n */\r\n protected addControlGrips(): void {\r\n this.grip1 = this.createGrip();\r\n this.grip2 = this.createGrip();\r\n\r\n this.positionGrips();\r\n }\r\n\r\n /**\r\n * Creates manipulation grip.\r\n * @returns - manipulation grip.\r\n */\r\n protected createGrip(): ResizeGrip {\r\n const grip = new ResizeGrip();\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.controlBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n /**\r\n * Updates manipulation grip layout.\r\n */\r\n protected positionGrips(): void {\r\n if (this.grip1 && this.grip2) {\r\n const gripSize = this.grip1.gripSize;\r\n\r\n this.positionGrip(this.grip1.visual, this.marker.x1 - gripSize / 2, this.marker.y1 - gripSize / 2);\r\n this.positionGrip(this.grip2.visual, this.marker.x2 - gripSize / 2, this.marker.y2 - gripSize / 2);\r\n }\r\n }\r\n\r\n /**\r\n * Positions manipulation grip.\r\n * @param grip - grip to position\r\n * @param x - new X coordinate\r\n * @param y - new Y coordinate\r\n */\r\n protected positionGrip(grip: SVGGraphicsElement, x: number, y: number): void {\r\n const translate = grip.transform.baseVal.getItem(0);\r\n translate.setTranslate(x, y);\r\n grip.transform.baseVal.replaceItem(translate, 0);\r\n }\r\n\r\n /**\r\n * Displays marker's controls.\r\n */\r\n public select(): void {\r\n super.select();\r\n this.adjustControlBox();\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n /**\r\n * Hides marker's controls.\r\n */\r\n public deselect(): void {\r\n super.deselect();\r\n this.controlBox.style.display = 'none';\r\n }\r\n}\r\n","import { GripLocation } from './Grip';\r\nimport { ResizeGrip } from './ResizeGrip';\r\n\r\n/**\r\n * RectangularBoxMarkerGrips is a set of resize/rotation grips for a rectangular marker.\r\n */\r\nexport class RectangularBoxMarkerGrips {\r\n public grips = new Map<GripLocation, ResizeGrip>([\r\n ['topleft', new ResizeGrip()],\r\n ['topcenter', new ResizeGrip()],\r\n ['topright', new ResizeGrip()],\r\n ['leftcenter', new ResizeGrip()],\r\n ['rightcenter', new ResizeGrip()],\r\n ['bottomleft', new ResizeGrip()],\r\n ['bottomcenter', new ResizeGrip()],\r\n ['bottomright', new ResizeGrip()],\r\n ]);\r\n /**\r\n * Creates a new marker grip set.\r\n */\r\n constructor() {\r\n this.findGripByVisual = this.findGripByVisual.bind(this);\r\n }\r\n\r\n /**\r\n * Returns a marker grip owning the specified visual.\r\n * @param gripVisual - visual for owner to be determined.\r\n */\r\n public findGripByVisual(\r\n gripVisual: EventTarget\r\n ): ResizeGrip | undefined {\r\n for (const grip of this.grips.values()) {\r\n if (grip.ownsTarget(gripVisual)) {\r\n return grip;\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n public getGrip(location: GripLocation): ResizeGrip {\r\n return this.grips.get(location)!;\r\n }\r\n}\r\n","import { Grip } from './Grip';\r\n\r\nexport class RotateGrip extends Grip {\r\n\r\n constructor() {\r\n super();\r\n // swap fill and stroke colors\r\n const oldFill = this.fillColor;\r\n this.fillColor = this.strokeColor;\r\n this.strokeColor = oldFill;\r\n }\r\n}\r\n","import { IPoint, RectangularBoxMarkerBase, SvgHelper } from '../core';\r\nimport { Grip, GripLocation } from './Grip';\r\nimport { MarkerBaseEditor } from './MarkerBaseEditor';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { RectangularBoxMarkerGrips } from './RectangularBoxMarkerGrips';\r\nimport { RotateGrip } from './RotateGrip';\r\n\r\nexport class RectangularBoxMarkerBaseEditor<\r\n TMarkerType extends RectangularBoxMarkerBase = RectangularBoxMarkerBase,\r\n> extends MarkerBaseEditor<TMarkerType> {\r\n /**\r\n * x coordinate of the top-left corner at the start of manipulation.\r\n */\r\n protected manipulationStartLeft = 0;\r\n /**\r\n * y coordinate of the top-left corner at the start of manipulation.\r\n */\r\n protected manipulationStartTop = 0;\r\n /**\r\n * Width at the start of manipulation.\r\n */\r\n protected manipulationStartWidth = 0;\r\n /**\r\n * Height at the start of manipulation.\r\n */\r\n protected manipulationStartHeight = 0;\r\n\r\n /**\r\n * x coordinate of the pointer at the start of manipulation.\r\n */\r\n protected manipulationStartX = 0;\r\n /**\r\n * y coordinate of the pointer at the start of manipulation.\r\n */\r\n protected manipulationStartY = 0;\r\n\r\n /**\r\n * Pointer's horizontal distance from the top left corner.\r\n */\r\n protected offsetX = 0;\r\n /**\r\n * Pointer's vertical distance from the top left corner.\r\n */\r\n protected offsetY = 0;\r\n\r\n /**\r\n * Container for the marker's editing controls.\r\n */\r\n protected controlBox = SvgHelper.createGroup();\r\n private readonly CB_DISTANCE: number = 0;\r\n private controlRect?: SVGRectElement;\r\n private rotatorGripLine?: SVGLineElement;\r\n\r\n private controlGrips: RectangularBoxMarkerGrips = new RectangularBoxMarkerGrips();\r\n protected disabledResizeGrips: GripLocation[] = [];\r\n private rotatorGrip?: RotateGrip;\r\n private activeGrip?: Grip;\r\n private disableRotation = false;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this.setupControlBox();\r\n }\r\n\r\n /**\r\n * Returns true if passed SVG element belongs to the marker. False otherwise.\r\n *\r\n * @param el - target element.\r\n */\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this._marker.ownsTarget(el)) {\r\n return true;\r\n } else if (\r\n this.controlGrips?.findGripByVisual(el) !== undefined ||\r\n (this.rotatorGrip !== undefined && this.rotatorGrip.ownsTarget(el))\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) down event.\r\n *\r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n */\r\n public pointerDown(point: IPoint, target?: EventTarget): void {\r\n console.log(point);\r\n super.pointerDown(point, target);\r\n\r\n if (this.state === 'new') {\r\n this.marker.left = point.x;\r\n this.marker.top = point.y;\r\n }\r\n\r\n this.manipulationStartLeft = this.marker.left;\r\n this.manipulationStartTop = this.marker.top;\r\n this.manipulationStartWidth = this.marker.width;\r\n this.manipulationStartHeight = this.marker.height;\r\n\r\n const rotatedPoint = this.marker.unrotatePoint(point);\r\n this.manipulationStartX = rotatedPoint.x;\r\n this.manipulationStartY = rotatedPoint.y;\r\n\r\n this.offsetX = rotatedPoint.x - this.marker.left;\r\n this.offsetY = rotatedPoint.y - this.marker.top;\r\n\r\n if (this.state !== 'new') {\r\n this.select();\r\n this.activeGrip = this.controlGrips?.findGripByVisual(\r\n target as SVGGraphicsElement,\r\n );\r\n if (this.activeGrip !== undefined) {\r\n this._state = 'resize';\r\n } else if (\r\n this.rotatorGrip !== undefined &&\r\n target !== undefined &&\r\n this.rotatorGrip.ownsTarget(target)\r\n ) {\r\n this.activeGrip = this.rotatorGrip;\r\n\r\n const rotatedCenter = this.marker.rotatePoint({\r\n x: this.marker.centerX,\r\n y: this.marker.centerY,\r\n });\r\n this.marker.left = rotatedCenter.x - this.marker.width / 2;\r\n this.marker.top = rotatedCenter.y - this.marker.height / 2;\r\n this.marker.moveVisual({ x: this.marker.left, y: this.marker.top });\r\n\r\n const rotate = this.container.transform.baseVal.getItem(0);\r\n rotate.setRotate(\r\n this.marker.rotationAngle,\r\n this.marker.centerX,\r\n this.marker.centerY,\r\n );\r\n this.container.transform.baseVal.replaceItem(rotate, 0);\r\n\r\n this.adjustControlBox();\r\n\r\n this._state = 'rotate';\r\n } else {\r\n this._state = 'move';\r\n }\r\n }\r\n }\r\n\r\n protected _suppressMarkerCreateEvent = false;\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) up event.\r\n *\r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n */\r\n public pointerUp(point: IPoint): void {\r\n const inState = this.state;\r\n super.pointerUp(point);\r\n if (\r\n this.state === 'creating' &&\r\n this.marker.width < 10 &&\r\n this.marker.height < 10\r\n ) {\r\n this.marker.width = this.marker.defaultSize.width;\r\n this.marker.height = this.marker.defaultSize.height;\r\n } else {\r\n this.manipulate(point);\r\n }\r\n this._state = 'select';\r\n if (\r\n inState === 'creating' &&\r\n this.onMarkerCreated &&\r\n this._suppressMarkerCreateEvent === false\r\n ) {\r\n this.onMarkerCreated(this);\r\n }\r\n this.stateChanged();\r\n }\r\n\r\n /**\r\n * Handles marker manipulation (move, resize, rotate, etc.).\r\n *\r\n * @param point - event coordinates.\r\n */\r\n public manipulate(point: IPoint): void {\r\n const rotatedPoint = this.marker.unrotatePoint(point);\r\n\r\n if (this.state === 'creating') {\r\n this.resize(point);\r\n } else if (this.state === 'move') {\r\n this.marker.left =\r\n this.manipulationStartLeft +\r\n (rotatedPoint.x - this.manipulationStartLeft) -\r\n this.offsetX;\r\n this.marker.top =\r\n this.manipulationStartTop +\r\n (rotatedPoint.y - this.manipulationStartTop) -\r\n this.offsetY;\r\n this.marker.moveVisual({ x: this.marker.left, y: this.marker.top });\r\n this.adjustControlBox();\r\n } else if (this.state === 'resize') {\r\n this.resize(rotatedPoint);\r\n } else if (this.state === 'rotate') {\r\n this.marker.rotate(point);\r\n }\r\n }\r\n\r\n /**\r\n * Resizes the marker based on pointer coordinates and context.\r\n * @param point - pointer coordinates.\r\n */\r\n protected resize(point: IPoint): void {\r\n let newX = this.manipulationStartLeft;\r\n let newWidth = this.manipulationStartWidth;\r\n let newY = this.manipulationStartTop;\r\n let newHeight = this.manipulationStartHeight;\r\n\r\n switch (this.activeGrip) {\r\n case this.controlGrips.getGrip(\"bottomleft\"):\r\n case this.controlGrips.getGrip(\"leftcenter\"):\r\n case this.controlGrips.getGrip(\"topleft\"):\r\n newX = this.manipulationStartLeft + point.x - this.manipulationStartX;\r\n newWidth =\r\n this.manipulationStartWidth + this.manipulationStartLeft - newX;\r\n break;\r\n case this.controlGrips.getGrip(\"bottomright\"):\r\n case this.controlGrips.getGrip(\"rightcenter\"):\r\n case this.controlGrips.getGrip(\"topright\"):\r\n case undefined:\r\n newWidth =\r\n this.manipulationStartWidth + point.x - this.manipulationStartX;\r\n break;\r\n }\r\n\r\n switch (this.activeGrip) {\r\n case this.controlGrips.getGrip(\"topcenter\"):\r\n case this.controlGrips.getGrip(\"topleft\"):\r\n case this.controlGrips.getGrip(\"topright\"):\r\n newY = this.manipulationStartTop + point.y - this.manipulationStartY;\r\n newHeight =\r\n this.manipulationStartHeight + this.manipulationStartTop - newY;\r\n break;\r\n case this.controlGrips.getGrip(\"bottomcenter\"):\r\n case this.controlGrips.getGrip(\"bottomleft\"):\r\n case this.controlGrips.getGrip(\"bottomright\"):\r\n case undefined:\r\n newHeight =\r\n this.manipulationStartHeight + point.y - this.manipulationStartY;\r\n break;\r\n }\r\n\r\n if (newWidth >= 0) {\r\n this.marker.left = newX;\r\n this.marker.width = newWidth;\r\n } else {\r\n this.marker.left = newX + newWidth;\r\n this.marker.width = -newWidth;\r\n }\r\n if (newHeight >= 0) {\r\n this.marker.top = newY;\r\n this.marker.height = newHeight;\r\n } else {\r\n this.marker.top = newY + newHeight;\r\n this.marker.height = -newHeight;\r\n }\r\n\r\n this.setSize();\r\n }\r\n\r\n /**\r\n * Sets control box size and location.\r\n */\r\n protected setSize(): void {\r\n this.marker.setSize();\r\n this.adjustControlBox();\r\n }\r\n\r\n /**\r\n * Displays marker's controls.\r\n */\r\n public select(): void {\r\n super.select();\r\n this.adjustControlBox();\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n /**\r\n * Hides marker's controls.\r\n */\r\n public deselect(): void {\r\n super.deselect();\r\n this.controlBox.style.display = 'none';\r\n }\r\n\r\n private setupControlBox() {\r\n this.controlBox = SvgHelper.createGroup();\r\n const translate = SvgHelper.createTransform();\r\n translate.setTranslate(-this.CB_DISTANCE / 2, -this.CB_DISTANCE / 2);\r\n this.controlBox.transform.baseVal.appendItem(translate);\r\n\r\n this.container.appendChild(this.controlBox);\r\n\r\n this.controlRect = SvgHelper.createRect(\r\n this.marker.width + this.CB_DISTANCE,\r\n this.marker.height + this.CB_DISTANCE,\r\n [\r\n ['stroke', 'black'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '0.5'],\r\n ['stroke-dasharray', '3, 2'],\r\n ['fill', 'transparent'],\r\n ['pointer-events', 'none'],\r\n ],\r\n );\r\n\r\n this.controlBox.appendChild(this.controlRect);\r\n\r\n if (this.disableRotation !== true) {\r\n this.rotatorGripLine = SvgHelper.createLine(\r\n (this.marker.width + this.CB_DISTANCE * 2) / 2,\r\n this.marker.top - this.CB_DISTANCE,\r\n (this.marker.width + this.CB_DISTANCE * 2) / 2,\r\n this.marker.top - this.CB_DISTANCE * 3,\r\n [\r\n ['stroke', 'black'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '0.5'],\r\n ['stroke-dasharray', '3, 2'],\r\n ],\r\n );\r\n this.rotatorGripLine.style.filter = 'drop-shadow(rgba(255, 255, 255, 0.7) 0px 2px 0px)';\r\n\r\n\r\n this.controlBox.appendChild(this.rotatorGripLine);\r\n }\r\n\r\n this.controlGrips = new RectangularBoxMarkerGrips();\r\n this.addControlGrips();\r\n\r\n this.controlBox.style.display = 'none';\r\n }\r\n\r\n protected adjustControlBox() {\r\n const translate = this.controlBox.transform.baseVal.getItem(0);\r\n translate.setTranslate(\r\n this.marker.left - this.CB_DISTANCE / 2,\r\n this.marker.top - this.CB_DISTANCE / 2,\r\n );\r\n this.controlBox.transform.baseVal.replaceItem(translate, 0);\r\n this.controlRect?.setAttribute(\r\n 'width',\r\n (this.marker.width + this.CB_DISTANCE).toString(),\r\n );\r\n this.controlRect?.setAttribute(\r\n 'height',\r\n (this.marker.height + this.CB_DISTANCE).toString(),\r\n );\r\n\r\n if (this.rotatorGripLine !== undefined) {\r\n this.rotatorGripLine.setAttribute(\r\n 'x1',\r\n ((this.marker.width + this.CB_DISTANCE) / 2).toString(),\r\n );\r\n this.rotatorGripLine.setAttribute(\r\n 'y1',\r\n (-this.CB_DISTANCE / 2).toString(),\r\n );\r\n this.rotatorGripLine.setAttribute(\r\n 'x2',\r\n ((this.marker.width + this.CB_DISTANCE) / 2).toString(),\r\n );\r\n this.rotatorGripLine.setAttribute(\r\n 'y2',\r\n (-Math.max(this.CB_DISTANCE * 3, 30)).toString(),\r\n );\r\n }\r\n\r\n this.positionGrips();\r\n }\r\n\r\n private addControlGrips() {\r\n for (const grip of this.controlGrips.grips.values()) {\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.controlBox.appendChild(grip.visual);\r\n \r\n this.controlBox.appendChild(grip.visual);\r\n }\r\n\r\n if (this.disableRotation !== true) {\r\n this.rotatorGrip = this.createRotateGrip();\r\n }\r\n\r\n this.positionGrips();\r\n }\r\n\r\n // private createResizeGrip(): ResizeGrip {\r\n // const grip = new ResizeGrip();\r\n // grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n // this.controlBox.appendChild(grip.visual);\r\n\r\n // return grip;\r\n // }\r\n\r\n private createRotateGrip(): RotateGrip {\r\n const grip = new RotateGrip();\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.controlBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n private positionGrips() {\r\n if (this.controlGrips !== undefined) {\r\n const gripSize = this.controlGrips.getGrip('topleft').gripSize ?? 0;\r\n\r\n const left = -gripSize / 2;\r\n const top = left;\r\n const cx = (this.marker.width + this.CB_DISTANCE) / 2 - gripSize / 2;\r\n const cy = (this.marker.height + this.CB_DISTANCE) / 2 - gripSize / 2;\r\n const bottom = this.marker.height + this.CB_DISTANCE - gripSize / 2;\r\n const right = this.marker.width + this.CB_DISTANCE - gripSize / 2;\r\n\r\n this.positionGrip(this.controlGrips.getGrip('topleft').visual, left, top);\r\n this.positionGrip(this.controlGrips.getGrip('topcenter').visual, cx, top);\r\n this.positionGrip(this.controlGrips.getGrip('topright').visual, right, top);\r\n this.positionGrip(this.controlGrips.getGrip('leftcenter').visual, left, cy);\r\n this.positionGrip(this.controlGrips.getGrip('rightcenter').visual, right, cy);\r\n this.positionGrip(this.controlGrips.getGrip('bottomleft').visual, left, bottom);\r\n this.positionGrip(this.controlGrips.getGrip('bottomcenter').visual, cx, bottom);\r\n this.positionGrip(this.controlGrips.getGrip('bottomright').visual, right, bottom);\r\n\r\n if (this.rotatorGrip !== undefined) {\r\n const rotatorGripSize = this.rotatorGrip.gripSize ?? 0;\r\n const rtop = -rotatorGripSize / 2;\r\n const rcx =\r\n (this.marker.width + this.CB_DISTANCE) / 2 - rotatorGripSize / 2;\r\n\r\n this.positionGrip(\r\n this.rotatorGrip.visual,\r\n rcx,\r\n rtop - Math.max(this.CB_DISTANCE * 3, 30),\r\n );\r\n }\r\n }\r\n this.adjustGripVisibility();\r\n }\r\n\r\n private positionGrip(\r\n grip: SVGGraphicsElement | undefined,\r\n x: number,\r\n y: number,\r\n ) {\r\n if (grip !== undefined) {\r\n const translate = grip.transform.baseVal.getItem(0);\r\n translate.setTranslate(x, y);\r\n grip.transform.baseVal.replaceItem(translate, 0);\r\n }\r\n }\r\n\r\n /**\r\n * Hides marker's editing controls.\r\n */\r\n protected hideControlBox(): void {\r\n this.controlBox.style.display = 'none';\r\n }\r\n /**\r\n * Shows marker's editing controls.\r\n */\r\n protected showControlBox(): void {\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n protected adjustGripVisibility() {\r\n for (const location of this.disabledResizeGrips) {\r\n const grip = this.controlGrips.getGrip(location);\r\n if (grip !== undefined) {\r\n grip.visual.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Scales marker. Used after the image resize.\r\n *\r\n * @param scaleX - horizontal scale\r\n * @param scaleY - vertical scale\r\n */\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n\r\n const rPoint = this.marker.rotatePoint({\r\n x: this.marker.left,\r\n y: this.marker.top,\r\n });\r\n const point = this.marker.unrotatePoint({\r\n x: rPoint.x * scaleX,\r\n y: rPoint.y * scaleY,\r\n });\r\n\r\n this.marker.left = point.x;\r\n this.marker.top = point.y;\r\n this.marker.width = this.marker.width * scaleX;\r\n this.marker.height = this.marker.height * scaleY;\r\n\r\n this.adjustControlBox();\r\n }\r\n}\r\n","import { IPoint, ShapeOutlineMarkerBase } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { RectangularBoxMarkerBaseEditor } from './RectangularBoxMarkerBaseEditor';\r\n\r\nexport class ShapeOutlineMarkerEditor<\r\n TMarkerType extends ShapeOutlineMarkerBase = ShapeOutlineMarkerBase,\r\n> extends RectangularBoxMarkerBaseEditor<TMarkerType> {\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this._creationStyle = 'draw';\r\n }\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) down event.\r\n * \r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n */\r\n public pointerDown(point: IPoint, target?: EventTarget): void {\r\n super.pointerDown(point, target);\r\n if (this.state === 'new') {\r\n this.marker.createVisual();\r\n\r\n this.marker.moveVisual(point);\r\n\r\n this._state = 'creating';\r\n }\r\n }\r\n\r\n /**\r\n * Resizes the marker based on the pointer coordinates.\r\n * @param point - current pointer coordinates.\r\n */\r\n protected resize(point: IPoint): void {\r\n super.resize(point);\r\n this.setSize();\r\n }\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) up event.\r\n * \r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n */\r\n public pointerUp(point: IPoint): void {\r\n super.pointerUp(point);\r\n this.setSize();\r\n }\r\n}\r\n","/**\r\n * Manages undo and redo stacks.\r\n */\r\nexport class UndoRedoManager<T> {\r\n private undoStack: T[] = [];\r\n private redoStack: T[] = [];\r\n\r\n private lastRedoStep?: T;\r\n\r\n /**\r\n * Returns true if there are items in the undo stack.\r\n */\r\n public get isUndoPossible(): boolean {\r\n return this.undoStack.length > 0;\r\n }\r\n\r\n /**\r\n * Returns true if there are items in the redo stack.\r\n */\r\n public get isRedoPossible(): boolean {\r\n return this.redoStack.length > 0;\r\n }\r\n\r\n /**\r\n * Returns the number of items in the undo stack\r\n */\r\n public get undoStepCount(): number {\r\n return this.undoStack.length;\r\n }\r\n\r\n /**\r\n * Returns the number of items in the redo stack\r\n */\r\n public get redoStepCount(): number {\r\n return this.redoStack.length;\r\n }\r\n\r\n /**\r\n * Adds a step to the undo stack.\r\n * @param stepData data representing a state.\r\n */\r\n public addUndoStep(stepData: T): boolean {\r\n if (\r\n this.undoStack.length === 0 ||\r\n JSON.stringify(this.undoStack[this.undoStack.length - 1]) !==\r\n JSON.stringify(stepData)\r\n ) {\r\n this.undoStack.push(JSON.parse(JSON.stringify(stepData)));\r\n if (JSON.stringify(this.lastRedoStep) !== JSON.stringify(stepData)) {\r\n this.redoStack.splice(0, this.redoStack.length);\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Replaces the last undo step with step data provided\r\n * @param stepData data representing a state.\r\n */\r\n public replaceLastUndoStep(stepData: T): void {\r\n if (this.undoStack.length > 0) {\r\n this.undoStack[this.undoStack.length - 1] = JSON.parse(JSON.stringify(stepData));\r\n }\r\n }\r\n\r\n /**\r\n * Returns the last step in the undo log\r\n */\r\n public getLastUndoStep(): T | undefined {\r\n if (this.undoStack.length > 0) {\r\n return this.undoStack[this.undoStack.length - 1];\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Returns data for the previous step in the undo stack and adds last step to the redo stack.\r\n * @returns \r\n */\r\n public undo(): T | undefined {\r\n if (this.undoStack.length > 1) {\r\n const lastStep = this.undoStack.pop();\r\n if (lastStep !== undefined) {\r\n this.redoStack.push(lastStep);\r\n }\r\n return this.undoStack.length > 0 ? this.undoStack[this.undoStack.length - 1] : undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Returns most recent item in the redo stack.\r\n * @returns \r\n */\r\n public redo(): T | undefined {\r\n this.lastRedoStep = this.redoStack.pop();\r\n return this.lastRedoStep;\r\n }\r\n}\r\n","import { FreehandMarker, IPoint, SvgHelper } from '../core';\r\nimport { MarkerBaseEditor } from './MarkerBaseEditor';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\n\r\nexport class FreehandMarkerEditor<\r\n TMarkerType extends FreehandMarker = FreehandMarker,\r\n> extends MarkerBaseEditor<TMarkerType> {\r\n /**\r\n * Pointer coordinates at the start of move or resize.\r\n */\r\n protected manipulationStartX = 0;\r\n protected manipulationStartY = 0;\r\n\r\n /**\r\n * Container for control elements.\r\n */\r\n protected controlBox: SVGGElement = SvgHelper.createGroup();\r\n private controlRect?: SVGRectElement;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this._continuousCreation = true;\r\n\r\n this.ownsTarget = this.ownsTarget.bind(this);\r\n\r\n this.setupControlBox = this.setupControlBox.bind(this);\r\n this.adjustControlBox = this.adjustControlBox.bind(this);\r\n\r\n this.manipulate = this.manipulate.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n\r\n this.setupControlBox();\r\n }\r\n\r\n /**\r\n * Returns true if passed SVG element belongs to the marker. False otherwise.\r\n *\r\n * @param el - target element.\r\n */\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (\r\n super.ownsTarget(el) ||\r\n this.marker.ownsTarget(el) ||\r\n el === this.controlRect\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) down event.\r\n *\r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n */\r\n public pointerDown(point: IPoint, target?: EventTarget): void {\r\n super.pointerDown(point, target);\r\n\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n\r\n if (this.state === 'new') {\r\n this.startCreation(point);\r\n } else if (this.state !== 'move') {\r\n this.select();\r\n this._state = 'move';\r\n }\r\n }\r\n\r\n private startCreation(point: IPoint) {\r\n this.marker.stage = 'creating';\r\n this.marker.points.push(point);\r\n this.marker.createVisual();\r\n this.marker.adjustVisual();\r\n this._state = 'creating';\r\n }\r\n\r\n private addNewPointWhileCreating(point: IPoint) {\r\n this.marker.points.push(point);\r\n this.marker.adjustVisual();\r\n }\r\n\r\n private finishCreation() {\r\n this.marker.stage = 'normal';\r\n this.marker.adjustVisual();\r\n this._state = 'select';\r\n if (this.onMarkerCreated) {\r\n this.onMarkerCreated(this);\r\n }\r\n }\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) up event.\r\n *\r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n */\r\n public pointerUp(point: IPoint): void {\r\n super.pointerUp(point);\r\n this.manipulate(point);\r\n if (this._state === 'creating') {\r\n this.finishCreation();\r\n }\r\n this.state = 'select';\r\n this.stateChanged();\r\n }\r\n\r\n /**\r\n * Handles marker manipulation (move, resize, rotate, etc.).\r\n *\r\n * @param point - event coordinates.\r\n */\r\n public manipulate(point: IPoint): void {\r\n if (this.state === 'creating') {\r\n this.addNewPointWhileCreating(point);\r\n } else if (this.state === 'move') {\r\n this.marker.points.forEach((p) => {\r\n p.x += point.x - this.manipulationStartX;\r\n p.y += point.y - this.manipulationStartY;\r\n });\r\n this.manipulationStartX = point.x;\r\n this.manipulationStartY = point.y;\r\n this.marker.adjustVisual();\r\n this.adjustControlBox();\r\n }\r\n }\r\n\r\n /**\r\n * Creates control box for manipulation controls.\r\n */\r\n protected setupControlBox(): void {\r\n this.controlBox = SvgHelper.createGroup();\r\n this.container.appendChild(this.controlBox);\r\n\r\n this.controlRect = SvgHelper.createRect(0, 0, [\r\n ['stroke', 'black'],\r\n ['stroke-width', '1'],\r\n ['stroke-opacity', '0.5'],\r\n ['stroke-dasharray', '3, 2'],\r\n ['fill', 'transparent'],\r\n ]);\r\n\r\n this.controlBox.appendChild(this.controlRect);\r\n\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n protected adjustControlBox() {\r\n const left = Math.min(...this.marker.points.map((p) => p.x));\r\n const top = Math.min(...this.marker.points.map((p) => p.y));\r\n const right = Math.max(...this.marker.points.map((p) => p.x));\r\n const bottom = Math.max(...this.marker.points.map((p) => p.y));\r\n\r\n if (this.controlRect) {\r\n SvgHelper.setAttributes(this.controlRect, [\r\n ['x', (left - this.strokeWidth).toString()],\r\n ['y', (top - this.strokeWidth).toString()],\r\n ['width', (right - left + this.strokeWidth * 2).toString()],\r\n ['height', (bottom - top + this.strokeWidth * 2).toString()],\r\n ]);\r\n }\r\n }\r\n\r\n /**\r\n * Displays marker's controls.\r\n */\r\n public select(): void {\r\n super.select();\r\n this.adjustControlBox();\r\n this.controlBox.style.display = '';\r\n }\r\n\r\n /**\r\n * Hides marker's controls.\r\n */\r\n public deselect(): void {\r\n super.deselect();\r\n this.controlBox.style.display = 'none';\r\n }\r\n}\r\n","/**\r\n * Text changed event handler type.\r\n */\r\nexport type TextChangedHandler = (text: string) => void;\r\n\r\nexport type BlurHandler = () => void;\r\n\r\n/**\r\n * Represents a text block editor element.\r\n */\r\nexport class TextBlockEditor {\r\n private textEditor: HTMLDivElement;\r\n private isInFocus = false;\r\n\r\n private _width = 0;\r\n /**\r\n * Returns editor width in pixels.\r\n */\r\n public get width() {\r\n return this._width;\r\n }\r\n /**\r\n * Sets editor width in pixels.\r\n */\r\n public set width(value) {\r\n this._width = value;\r\n this.textEditor.style.width = `${this.width}px`;\r\n }\r\n \r\n private _height = 0;\r\n /**\r\n * Returns editor height in pixels.\r\n */\r\n public get height() {\r\n return this._height;\r\n }\r\n /**\r\n * Sets editor height in pixels.\r\n */\r\n public set height(value) {\r\n this._height = value;\r\n this.textEditor.style.height = `${this.height}px`;\r\n }\r\n\r\n private _left = 0;\r\n /**\r\n * Returns the horizontal (X) location of the editor's left corner (in pixels).\r\n */\r\n public get left() {\r\n return this._left;\r\n }\r\n /**\r\n * Sets the horizontal (X) location of the editor's left corner (in pixels).\r\n */\r\n public set left(value) {\r\n this._left = value;\r\n this.textEditor.style.left = `${this.left}px`;\r\n }\r\n\r\n private _top = 0;\r\n /**\r\n * Returns the vertical (Y) location of the editor's top left corner (in pixels).\r\n */\r\n public get top() {\r\n return this._top;\r\n }\r\n /**\r\n * Sets the vertical (Y) location of the editor's top left corner (in pixels).\r\n */\r\n public set top(value) {\r\n this._top = value;\r\n this.textEditor.style.top = `${this.top}px`;\r\n }\r\n\r\n private _text = '';\r\n /**\r\n * Returns the text block text.\r\n */\r\n public get text() {\r\n return this._text;\r\n }\r\n /**\r\n * Sets the text block text.\r\n */\r\n public set text(value) {\r\n this._text = value;\r\n }\r\n\r\n private _fontFamily = 'sans-serif';\r\n /**\r\n * Returns text block's font family.\r\n */\r\n public get fontFamily() {\r\n return this._fontFamily;\r\n }\r\n /**\r\n * Sets the text block's font family.\r\n */\r\n public set fontFamily(value) {\r\n this._fontFamily = value;\r\n this.textEditor.style.fontFamily = this._fontFamily;\r\n }\r\n\r\n private _fontSize = '1rem';\r\n /**\r\n * Returns text block's font size.\r\n */\r\n public get fontSize() {\r\n return this._fontSize;\r\n }\r\n /**\r\n * Sets text block's font size.\r\n */\r\n public set fontSize(value) {\r\n this._fontSize = value;\r\n this.textEditor.style.fontSize = this._fontSize;\r\n }\r\n\r\n private _textColor = '#000';\r\n /**\r\n * Returns text block's font color.\r\n */\r\n public get textColor() {\r\n return this._textColor;\r\n }\r\n /**\r\n * Returns text block's font color.\r\n */\r\n public set textColor(value) {\r\n this._textColor = value;\r\n this.textEditor.style.color = this.textColor;\r\n }\r\n\r\n /**\r\n * Text changed event handler.\r\n */\r\n public onTextChanged?: TextChangedHandler;\r\n\r\n public onBlur?: BlurHandler;\r\n\r\n /**\r\n * Creates a new text block editor instance.\r\n */\r\n constructor() {\r\n this.textEditor = document.createElement('div');\r\n\r\n this.getEditorUi = this.getEditorUi.bind(this);\r\n this.focus = this.focus.bind(this);\r\n this.setup = this.setup.bind(this);\r\n }\r\n\r\n private isSetupCompleted = false;\r\n private setup() {\r\n // this.textEditor.style.position = 'absolute';\r\n this.textEditor.style.pointerEvents = 'auto';\r\n this.textEditor.style.display = 'flex';\r\n this.textEditor.style.flexDirection = 'column';\r\n this.textEditor.style.alignItems = 'center';\r\n this.textEditor.style.justifyContent = 'center';\r\n this.textEditor.style.width = `${this._width}px`;\r\n this.textEditor.style.height = `${this._height}px`;\r\n this.textEditor.style.overflow = 'hidden';\r\n this.textEditor.style.textAlign = 'center';\r\n this.textEditor.style.fontFamily = this._fontFamily;\r\n this.textEditor.style.fontSize = this._fontSize;\r\n this.textEditor.style.lineHeight = '1em';\r\n if (this._text !== '') {\r\n this.textEditor.innerText = this._text;\r\n } else {\r\n this.textEditor.innerHTML = '&nbsp;';\r\n }\r\n this.textEditor.contentEditable = 'true';\r\n this.textEditor.style.outline = 'none';\r\n this.textEditor.style.color = this._textColor;\r\n this.textEditor.style.whiteSpace = 'pre';\r\n this.textEditor.addEventListener('pointerdown', (ev) => {\r\n ev.stopPropagation();\r\n });\r\n this.textEditor.addEventListener('pointerup', (ev) => {\r\n ev.stopPropagation();\r\n });\r\n this.textEditor.addEventListener('keydown', (ev) => {\r\n if (ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.textEditor.blur();\r\n }\r\n });\r\n this.textEditor.addEventListener('keyup', (ev) => {\r\n ev.cancelBubble = true;\r\n this._text = this.textEditor.innerText;\r\n if (this.onTextChanged !== undefined) {\r\n this.onTextChanged(this._text);\r\n }\r\n });\r\n this.textEditor.addEventListener('blur', () => {\r\n this._text = this.textEditor.innerText;\r\n if (this.onTextChanged !== undefined) {\r\n this.onTextChanged(this._text);\r\n }\r\n if (this.onBlur !== undefined) {\r\n this.onBlur();\r\n }\r\n });\r\n this.textEditor.addEventListener('paste', (ev) => {\r\n if (ev.clipboardData) {\r\n // paste plain text\r\n const content = ev.clipboardData.getData('text');\r\n const selection = window.getSelection();\r\n if (!selection || !selection.rangeCount) return false;\r\n selection.deleteFromDocument();\r\n selection.getRangeAt(0).insertNode(document.createTextNode(content));\r\n ev.preventDefault();\r\n }\r\n });\r\n\r\n this.isSetupCompleted = true;\r\n }\r\n\r\n /**\r\n * Returns editor's UI,\r\n * @returns UI in a div element.\r\n */\r\n public getEditorUi(): HTMLDivElement {\r\n if (!this.isSetupCompleted) {\r\n this.setup();\r\n }\r\n\r\n return this.textEditor;\r\n }\r\n\r\n /**\r\n * Focuses text editing in the editor.\r\n */\r\n public focus() {\r\n this.textEditor.focus();\r\n\r\n // position cursor at the end of the text\r\n const range = document.createRange();\r\n range.selectNodeContents(this.textEditor);\r\n range.collapse(false);\r\n const selection = window.getSelection();\r\n selection?.removeAllRanges();\r\n selection?.addRange(range); \r\n }\r\n /**\r\n * Unfocuses the editor.\r\n */\r\n public blur() {\r\n this.textEditor.blur();\r\n }\r\n}\r\n","import { IPoint, SvgHelper } from '../core';\r\nimport { TextMarker } from '../core/TextMarker';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { RectangularBoxMarkerBaseEditor } from './RectangularBoxMarkerBaseEditor';\r\nimport { TextBlockEditor } from './TextBlockEditor';\r\n\r\nexport class TextMarkerEditor<\r\n TMarkerType extends TextMarker = TextMarker,\r\n> extends RectangularBoxMarkerBaseEditor<TMarkerType> {\r\n private textBlockEditorContainer: SVGForeignObjectElement =\r\n SvgHelper.createForeignObject();\r\n private textBlockEditor: TextBlockEditor;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n\r\n this.disabledResizeGrips = [\r\n 'topleft',\r\n 'topcenter',\r\n 'topright',\r\n 'bottomleft',\r\n 'bottomcenter',\r\n 'bottomright',\r\n 'leftcenter',\r\n 'rightcenter',\r\n ];\r\n\r\n this._creationStyle = 'drop';\r\n\r\n this.textBlockEditor = new TextBlockEditor();\r\n this.marker.onSizeChanged = this.markerSizeChanged;\r\n\r\n this.showEditor = this.showEditor.bind(this);\r\n this.hideEditor = this.hideEditor.bind(this);\r\n this.pointerDown = this.pointerDown.bind(this);\r\n this.pointerUp = this.pointerUp.bind(this);\r\n this.resize = this.resize.bind(this);\r\n this.markerSizeChanged = this.markerSizeChanged.bind(this);\r\n }\r\n\r\n private _pointerDownTime: number = Number.MAX_VALUE;\r\n private _pointerDownPoint: IPoint = { x: 0, y: 0 };\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) down event.\r\n *\r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n */\r\n public pointerDown(point: IPoint, target?: EventTarget): void {\r\n super.pointerDown(point, target);\r\n\r\n this._pointerDownTime = Date.now();\r\n this._pointerDownPoint = point;\r\n\r\n if (this.state === 'new') {\r\n this.marker.createVisual();\r\n\r\n this.marker.moveVisual(point);\r\n\r\n this._state = 'creating';\r\n }\r\n }\r\n\r\n public dblClick(point: IPoint, target?: EventTarget): void {\r\n super.dblClick(point, target);\r\n if (this.state !== 'edit') {\r\n this.showEditor();\r\n }\r\n }\r\n\r\n protected setSize(): void {\r\n super.setSize();\r\n this.textBlockEditorContainer.style.transform = `translate(${this.marker.left}px, ${this.marker.top}px)`;\r\n this.textBlockEditorContainer.style.width = `${this.marker.width}px`;\r\n this.textBlockEditorContainer.style.height = `${this.marker.height}px`;\r\n this.textBlockEditor.width = this.marker.width;\r\n this.textBlockEditor.height = this.marker.height;\r\n }\r\n\r\n /**\r\n * Resizes the marker based on the pointer coordinates.\r\n * @param point - current pointer coordinates.\r\n */\r\n protected resize(point: IPoint): void {\r\n super.resize(point);\r\n this.setSize();\r\n }\r\n\r\n /**\r\n * Handles pointer (mouse, touch, stylus, etc.) up event.\r\n *\r\n * @param point - event coordinates.\r\n * @param target - direct event target element.\r\n */\r\n public pointerUp(point: IPoint): void {\r\n const inState = this.state;\r\n super.pointerUp(point);\r\n this.setSize();\r\n\r\n if (\r\n inState === 'creating' ||\r\n (Date.now() - this._pointerDownTime > 500 &&\r\n Math.abs(this._pointerDownPoint.x - point.x) < 5 &&\r\n Math.abs(this._pointerDownPoint.y - point.y) < 5)\r\n ) {\r\n this.showEditor();\r\n }\r\n\r\n this.adjustControlBox();\r\n }\r\n\r\n private showEditor(): void {\r\n this.textBlockEditor.text = this.marker.text;\r\n\r\n if (this.textBlockEditor.onTextChanged === undefined) {\r\n this.textBlockEditor.onTextChanged = (text: string) => {\r\n this.marker.text = text;\r\n };\r\n }\r\n if (this.textBlockEditor.onBlur === undefined) {\r\n this.textBlockEditor.onBlur = () => {\r\n this.hideEditor();\r\n };\r\n }\r\n this.textBlockEditorContainer.appendChild(\r\n this.textBlockEditor.getEditorUi(),\r\n );\r\n this.container.appendChild(this.textBlockEditorContainer);\r\n\r\n this.marker.hideVisual();\r\n this.hideControlBox();\r\n\r\n this.textBlockEditor.focus();\r\n }\r\n\r\n private hideEditor(): void {\r\n this.marker.text = this.textBlockEditor.text;\r\n this.marker.showVisual();\r\n this.showControlBox();\r\n this.state = 'select';\r\n this.container.removeChild(this.textBlockEditorContainer);\r\n }\r\n\r\n private markerSizeChanged = () => {\r\n this.setSize();\r\n };\r\n}\r\n","/**\r\n * Manages commercial licenses.\r\n * @ignore\r\n */\r\nexport class Activator {\r\n private static keys: Map<string, string> = new Map<string, string>();\r\n private static keyAddListeners: Array<() => void> = new Array<() => void>();\r\n\r\n /**\r\n * Add a license key\r\n * @param product product identifier.\r\n * @param key license key sent to you after purchase.\r\n */\r\n public static addKey(product: string, key: string): void {\r\n Activator.keys.set(product, key);\r\n Activator.keyAddListeners.forEach(listener => {\r\n listener();\r\n });\r\n }\r\n\r\n /**\r\n * Add a function to be called when license key is added.\r\n * @param listener \r\n */\r\n public static addKeyAddListener(listener: () => void) {\r\n Activator.keyAddListeners.push(listener);\r\n }\r\n\r\n /**\r\n * Remove a function called when key is added.\r\n * @param listener \r\n */\r\n public static removeKeyAddListener(listener: () => void) {\r\n const li = Activator.keyAddListeners.indexOf(listener);\r\n if (li > -1) {\r\n Activator.keyAddListeners.splice(li, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if the product is commercially licensed.\r\n * @param product product identifier.\r\n */\r\n public static isLicensed(product: string): boolean {\r\n // NOTE:\r\n // before removing or modifying this please consider supporting MJS Diagram development\r\n // by visiting https://markerjs.com/ for details\r\n // thank you!\r\n if (Activator.keys.has(product)) {\r\n const keyRegex = new RegExp(`${product}-[A-Z][0-9]{3}-[A-Z][0-9]{3}-[0-9]{4}`, 'i');\r\n const key = Activator.keys.get(product);\r\n return key === undefined ? false : keyRegex.test(key);\r\n } else {\r\n return false;\r\n }\r\n }\r\n}\r\n","import {\r\n AnnotationState,\r\n FrameMarker,\r\n FreehandMarker,\r\n IPoint,\r\n MarkerBase,\r\n PolygonMarker,\r\n} from './core';\r\nimport { LineMarker } from './core/LineMarker';\r\nimport { SvgHelper } from './core/SvgHelper';\r\nimport { PolygonMarkerEditor } from './editor/PolygonMarkerEditor';\r\nimport { LinearMarkerEditor } from './editor/LinearMarkerEditor';\r\nimport { MarkerBaseEditor } from './editor/MarkerBaseEditor';\r\nimport { ShapeOutlineMarkerEditor } from './editor/ShapeOutlineMarkerEditor';\r\nimport { UndoRedoManager } from './editor/UndoRedoManager';\r\nimport { FreehandMarkerEditor } from './editor/FreehandMarkerEditor';\r\nimport { TextMarker } from './core/TextMarker';\r\nimport { TextMarkerEditor } from './editor/TextMarkerEditor';\r\nimport { Activator } from './core/Activator';\r\n\r\nimport Logo from './assets/markerjs-logo-m.svg';\r\n\r\nexport interface MarkerAreaEventMap {\r\n /**\r\n * Marker area initialized.\r\n */\r\n areainit: CustomEvent<MarkerAreaEventData>;\r\n areashow: CustomEvent<MarkerAreaEventData>;\r\n arearestorestate: CustomEvent<MarkerAreaEventData>;\r\n areafocus: CustomEvent<MarkerAreaEventData>;\r\n areablur: CustomEvent<MarkerAreaEventData>;\r\n areastatechange: CustomEvent<MarkerAreaEventData>;\r\n\r\n markerselect: CustomEvent<MarkerEditorEventData>;\r\n markerdeselect: CustomEvent<MarkerEditorEventData>;\r\n markercreating: CustomEvent<MarkerEditorEventData>;\r\n markercreate: CustomEvent<MarkerEditorEventData>;\r\n markerbeforedelete: CustomEvent<MarkerEditorEventData>;\r\n markerdelete: CustomEvent<MarkerEditorEventData>;\r\n markerchange: CustomEvent<MarkerEditorEventData>;\r\n}\r\n\r\nexport interface MarkerAreaEventData {\r\n /**\r\n * {@link MarkerArea} instance.\r\n */\r\n markerArea: MarkerArea;\r\n}\r\n\r\nexport interface MarkerEditorEventData extends MarkerAreaEventData {\r\n markerEditor: MarkerBaseEditor;\r\n}\r\n\r\n/**\r\n * @ignore\r\n */\r\nexport type MarkerAreaMode = 'select' | 'create' | 'delete';\r\n\r\nexport class MarkerArea extends HTMLElement {\r\n private _contentContainer?: HTMLDivElement;\r\n private _canvasContainer?: HTMLDivElement;\r\n\r\n private _overlayContainer!: HTMLDivElement;\r\n private _overlayContentContainer!: HTMLDivElement;\r\n\r\n private _mainCanvas?: SVGSVGElement;\r\n private _groupLayer?: SVGGElement;\r\n\r\n private _editingTarget?: HTMLImageElement;\r\n\r\n private width = 0;\r\n private height = 0;\r\n\r\n private _targetWidth = -1;\r\n public get targetWidth() {\r\n return this._targetWidth;\r\n }\r\n public set targetWidth(value) {\r\n this._targetWidth = value;\r\n this.setMainCanvasSize();\r\n }\r\n private _targetHeight = -1;\r\n public get targetHeight() {\r\n return this._targetHeight;\r\n }\r\n public set targetHeight(value) {\r\n this._targetHeight = value;\r\n this.setMainCanvasSize();\r\n }\r\n\r\n private mode: MarkerAreaMode = 'select';\r\n\r\n private _logoUI?: HTMLElement;\r\n\r\n private _isInitialized = false;\r\n\r\n private _currentMarkerEditor?: MarkerBaseEditor;\r\n public get currentMarkerEditor(): MarkerBaseEditor | undefined {\r\n return this._currentMarkerEditor;\r\n }\r\n\r\n private _newMarkerOutline: SVGPathElement = SvgHelper.createPath('', [\r\n ['stroke', '#333'],\r\n ['stroke-width', '0.5'],\r\n ['stroke-dasharray', '2 5'],\r\n ['fill', 'rgba(200,200,200,0.5)'],\r\n ['pointer-events', 'none'],\r\n ]);\r\n\r\n private _targetImage: HTMLImageElement | undefined;\r\n public get targetImage(): HTMLImageElement | undefined {\r\n return this._targetImage;\r\n }\r\n public set targetImage(value: HTMLImageElement | undefined) {\r\n this._targetImage = value;\r\n if (value !== undefined) {\r\n this.addTargetImage();\r\n }\r\n }\r\n\r\n public markerEditors: Map<\r\n typeof MarkerBase,\r\n typeof MarkerBaseEditor<MarkerBase>\r\n > = new Map();\r\n\r\n public editors: MarkerBaseEditor[] = [];\r\n\r\n private _zoomLevel = 1;\r\n /**\r\n * Returns the current zoom level.\r\n */\r\n public get zoomLevel(): number {\r\n return this._zoomLevel;\r\n }\r\n /**\r\n * Sets the current zoom level.\r\n */\r\n public set zoomLevel(value: number) {\r\n this._zoomLevel = value;\r\n if (\r\n this._canvasContainer &&\r\n this._contentContainer &&\r\n this._mainCanvas &&\r\n this._overlayContainer\r\n ) {\r\n //this.setMainCanvasSize();\r\n this._mainCanvas.style.transform = `scale(${this._zoomLevel})`;\r\n this.setEditingTargetSize();\r\n this._canvasContainer.scrollTo({\r\n left:\r\n (this._mainCanvas.clientWidth - this._canvasContainer.clientWidth) /\r\n 2,\r\n top:\r\n (this._mainCanvas.clientHeight - this._canvasContainer.clientHeight) /\r\n 2,\r\n });\r\n\r\n this._overlayContainer.style.transform = `scale(${this._zoomLevel})`;\r\n }\r\n }\r\n\r\n private prevPanPoint: IPoint = { x: 0, y: 0 };\r\n private panTo(point: IPoint) {\r\n // @todo\r\n // this.contentDiv.scrollBy({\r\n // left: this.prevPanPoint.x - point.x,\r\n // top: this.prevPanPoint.y - point.y,\r\n // });\r\n this.prevPanPoint = point;\r\n }\r\n\r\n private undoRedoManager = new UndoRedoManager<AnnotationState>();\r\n\r\n constructor() {\r\n super();\r\n\r\n this.markerEditors.set(FrameMarker, ShapeOutlineMarkerEditor<FrameMarker>);\r\n this.markerEditors.set(LineMarker, LinearMarkerEditor<LineMarker>);\r\n this.markerEditors.set(PolygonMarker, PolygonMarkerEditor<PolygonMarker>);\r\n this.markerEditors.set(FreehandMarker, FreehandMarkerEditor<FreehandMarker>);\r\n this.markerEditors.set(TextMarker, TextMarkerEditor<TextMarker>);\r\n\r\n this.connectedCallback = this.connectedCallback.bind(this);\r\n this.disconnectedCallback = this.disconnectedCallback.bind(this);\r\n\r\n this.createLayout = this.createLayout.bind(this);\r\n this.addMainCanvas = this.addMainCanvas.bind(this);\r\n this.setMainCanvasSize = this.setMainCanvasSize.bind(this);\r\n this.setEditingTargetSize = this.setEditingTargetSize.bind(this);\r\n this.initOverlay = this.initOverlay.bind(this);\r\n this.addTargetImage = this.addTargetImage.bind(this);\r\n\r\n this.attachEvents = this.attachEvents.bind(this);\r\n this.attachWindowEvents = this.attachWindowEvents.bind(this);\r\n this.detachEvents = this.detachEvents.bind(this);\r\n this.detachWindowEvents = this.detachWindowEvents.bind(this);\r\n\r\n this.onCanvasPointerDown = this.onCanvasPointerDown.bind(this);\r\n this.onCanvasDblClick = this.onCanvasDblClick.bind(this);\r\n this.onKeyUp = this.onKeyUp.bind(this);\r\n this.onPointerMove = this.onPointerMove.bind(this);\r\n this.onPointerOut = this.onPointerOut.bind(this);\r\n this.onPointerUp = this.onPointerUp.bind(this);\r\n\r\n this.createMarker = this.createMarker.bind(this);\r\n this.addNewMarker = this.addNewMarker.bind(this);\r\n this.markerCreated = this.markerCreated.bind(this);\r\n this.markerStateChanged = this.markerStateChanged.bind(this);\r\n\r\n this.switchToSelectMode = this.switchToSelectMode.bind(this);\r\n\r\n this.showOutline = this.showOutline.bind(this);\r\n this.hideOutline = this.hideOutline.bind(this);\r\n\r\n this.getState = this.getState.bind(this);\r\n this.restoreState = this.restoreState.bind(this);\r\n\r\n this.undo = this.undo.bind(this);\r\n this.addUndoStep = this.addUndoStep.bind(this);\r\n this.undoStep = this.undoStep.bind(this);\r\n this.redo = this.redo.bind(this);\r\n this.redoStep = this.redoStep.bind(this);\r\n\r\n this.toggleLogo = this.toggleLogo.bind(this);\r\n this.addLogo = this.addLogo.bind(this);\r\n this.removeLogo = this.removeLogo.bind(this);\r\n\r\n this.attachShadow({ mode: 'open' });\r\n }\r\n\r\n private connectedCallback() {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areainit', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n Activator.addKeyAddListener(this.toggleLogo);\r\n this.createLayout();\r\n this.addMainCanvas();\r\n this.initOverlay();\r\n this.attachEvents();\r\n this._isInitialized = true;\r\n if (this.targetImage !== undefined) {\r\n this.addTargetImage();\r\n }\r\n this.setMainCanvasSize();\r\n this.toggleLogo();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areashow', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n }\r\n\r\n private disconnectedCallback() {\r\n this.detachEvents();\r\n }\r\n\r\n private createLayout() {\r\n this.style.display = 'flex';\r\n this.style.width = this.style.width !== '' ? this.style.width : '100%';\r\n this.style.height = this.style.height !== '' ? this.style.height : '100%';\r\n this.style.position = 'relative';\r\n\r\n this._contentContainer = document.createElement('div');\r\n this._contentContainer.style.display = 'flex';\r\n this._contentContainer.style.position = 'relative';\r\n this._contentContainer.style.flexGrow = '2';\r\n this._contentContainer.style.flexShrink = '1';\r\n this._contentContainer.style.overflow = 'hidden';\r\n\r\n this._canvasContainer = document.createElement('div');\r\n this._canvasContainer.style.touchAction = 'pinch-zoom';\r\n this._canvasContainer.className = 'canvas-container';\r\n this._canvasContainer.style.display = 'grid';\r\n this._canvasContainer.style.gridTemplateColumns = '1fr';\r\n this._canvasContainer.style.flexGrow = '2';\r\n this._canvasContainer.style.flexShrink = '2';\r\n this._canvasContainer.style.justifyItems = 'center';\r\n this._canvasContainer.style.alignItems = 'center';\r\n this._canvasContainer.style.overflow = 'auto';\r\n this._contentContainer.appendChild(this._canvasContainer);\r\n\r\n this.shadowRoot?.appendChild(this._contentContainer);\r\n }\r\n\r\n private addMainCanvas() {\r\n this.width = this._contentContainer?.clientWidth || 0;\r\n this.height = this._contentContainer?.clientHeight || 0;\r\n\r\n this._mainCanvas = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'svg',\r\n );\r\n this._mainCanvas.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n this.setMainCanvasSize();\r\n this._mainCanvas.style.gridColumnStart = '1';\r\n this._mainCanvas.style.gridRowStart = '1';\r\n this._mainCanvas.style.pointerEvents = 'auto';\r\n // this._mainCanvas.style.backgroundColor = 'pink'; // @todo\r\n // this._mainCanvas.style.opacity = '0.3'; // @todo\r\n this._mainCanvas.style.margin = '10px';\r\n this._mainCanvas.style.transform = `scale(${this._zoomLevel})`;\r\n\r\n this._groupLayer = SvgHelper.createGroup();\r\n\r\n this._mainCanvas.appendChild(this._groupLayer);\r\n\r\n this._canvasContainer?.appendChild(this._mainCanvas);\r\n }\r\n\r\n private setMainCanvasSize() {\r\n if (\r\n this._mainCanvas !== undefined &&\r\n this._targetHeight > 0 &&\r\n this._targetWidth > 0\r\n ) {\r\n this._mainCanvas.style.width = `${this._targetWidth * this.zoomLevel}px`;\r\n this._mainCanvas.style.height = `${\r\n this._targetHeight * this.zoomLevel\r\n }px`;\r\n this._mainCanvas.setAttribute(\r\n 'width',\r\n `${this._targetWidth * this.zoomLevel}`,\r\n );\r\n this._mainCanvas.setAttribute(\r\n 'height',\r\n `${this._targetHeight * this.zoomLevel}`,\r\n );\r\n this._mainCanvas.setAttribute(\r\n 'viewBox',\r\n '0 0 ' +\r\n this._targetWidth.toString() +\r\n ' ' +\r\n this._targetHeight.toString(),\r\n );\r\n this.setEditingTargetSize();\r\n }\r\n }\r\n\r\n private setEditingTargetSize() {\r\n if (this._editingTarget !== undefined) {\r\n this._editingTarget.width = this._targetWidth * this.zoomLevel;\r\n this._editingTarget.height = this._targetHeight * this.zoomLevel;\r\n this._editingTarget.style.width = `${\r\n this._targetWidth * this.zoomLevel\r\n }px`;\r\n this._editingTarget.style.height = `${\r\n this._targetHeight * this.zoomLevel\r\n }px`;\r\n }\r\n }\r\n\r\n private initOverlay(): void {\r\n this._overlayContainer = document.createElement('div');\r\n this._overlayContainer.style.pointerEvents = 'none';\r\n this._overlayContainer.style.display = 'flex';\r\n this._overlayContainer.style.alignItems = 'center';\r\n this._overlayContainer.style.justifyContent = 'center';\r\n this._overlayContainer.style.gridRowStart = '1';\r\n this._overlayContainer.style.gridColumnStart = '1';\r\n\r\n this._canvasContainer?.appendChild(this._overlayContainer);\r\n\r\n this._overlayContentContainer = document.createElement('div');\r\n this._overlayContentContainer.style.position = 'relative';\r\n // @todo\r\n // this._overlayContentContainer.style.width = `${this.documentWidth}px`;\r\n // this._overlayContentContainer.style.height = `${this.documentHeight}px`;\r\n this._overlayContentContainer.style.display = 'flex';\r\n this._overlayContainer.appendChild(this._overlayContentContainer);\r\n }\r\n\r\n private addTargetImage() {\r\n if (\r\n this._isInitialized &&\r\n this._editingTarget === undefined &&\r\n this.targetImage !== undefined &&\r\n this._canvasContainer !== undefined &&\r\n this._mainCanvas !== undefined\r\n ) {\r\n this._editingTarget = document.createElement('img');\r\n\r\n this._targetWidth =\r\n this._targetWidth > 0\r\n ? this._targetWidth\r\n : this.targetImage.clientWidth;\r\n this._targetHeight =\r\n this._targetHeight > 0\r\n ? this._targetHeight\r\n : this.targetImage.clientHeight;\r\n\r\n this._editingTarget.addEventListener('load', (ev) => {\r\n if (this._editingTarget !== undefined) {\r\n if (this._targetHeight <= 0 && this._targetWidth <= 0) {\r\n const img = <HTMLImageElement>ev.target;\r\n this._targetWidth =\r\n img.clientWidth > 0 ? img.clientWidth : img.naturalWidth;\r\n this._targetHeight =\r\n img.clientHeight > 0 ? img.clientHeight : img.naturalHeight;\r\n }\r\n this._editingTarget.width = this._targetWidth;\r\n this._editingTarget.height = this._targetHeight;\r\n this._editingTarget.style.width = `${this._targetWidth}px`;\r\n this._editingTarget.style.height = `${this._targetHeight}px`;\r\n this._editingTarget.style.gridColumnStart = '1';\r\n this._editingTarget.style.gridRowStart = '1';\r\n\r\n this.setMainCanvasSize();\r\n }\r\n });\r\n this._editingTarget.src = this.targetImage.src;\r\n\r\n this._canvasContainer.insertBefore(this._editingTarget, this._mainCanvas);\r\n }\r\n }\r\n\r\n public createMarker(markerType: typeof MarkerBase | string) {\r\n let mType: typeof MarkerBase = FrameMarker;\r\n if (typeof markerType === 'string') {\r\n mType = this.getMarkerTypeByName(markerType) || FrameMarker;\r\n } else {\r\n mType = markerType;\r\n }\r\n const markerEditor = this.markerEditors.get(mType);\r\n if (markerEditor && this._mainCanvas) {\r\n this.setCurrentEditor();\r\n this.addUndoStep();\r\n this._currentMarkerEditor = this.addNewMarker(markerEditor, mType);\r\n this._currentMarkerEditor.onMarkerCreated = this.markerCreated;\r\n this._currentMarkerEditor.onStateChanged = this.markerStateChanged;\r\n\r\n switch (this._currentMarkerEditor.creationStyle) {\r\n case 'drop':\r\n this._mainCanvas.style.cursor = 'move';\r\n break;\r\n case 'draw':\r\n default:\r\n this._mainCanvas.style.cursor = 'crosshair';\r\n break;\r\n }\r\n }\r\n\r\n return this._currentMarkerEditor;\r\n }\r\n\r\n private addNewMarker(\r\n markerEditorType: typeof MarkerBaseEditor<MarkerBase>,\r\n markerType: typeof MarkerBase,\r\n ): MarkerBaseEditor {\r\n if (this._mainCanvas === undefined) {\r\n throw new Error('Main canvas is not initialized.');\r\n }\r\n\r\n const g = SvgHelper.createGroup();\r\n this._mainCanvas.appendChild(g);\r\n\r\n return new markerEditorType({\r\n container: g,\r\n overlayContainer: this._overlayContentContainer,\r\n markerType: markerType,\r\n });\r\n }\r\n\r\n private markerCreated(editor: MarkerBaseEditor<MarkerBase>) {\r\n if (this._mainCanvas) {\r\n this.mode = 'select';\r\n this._mainCanvas.style.cursor = 'default';\r\n this.editors.push(editor);\r\n this.setCurrentEditor(editor);\r\n if (\r\n editor.continuousCreation\r\n ) {\r\n const newMarkerEditor = this.createMarker(editor.marker.typeName);\r\n if (editor.is(FreehandMarkerEditor) && newMarkerEditor?.is(FreehandMarkerEditor)) {\r\n newMarkerEditor.strokeColor = editor.strokeColor;\r\n newMarkerEditor.strokeWidth = editor.strokeWidth;\r\n newMarkerEditor.strokeDasharray = editor.strokeDasharray;\r\n }\r\n }\r\n this.addUndoStep();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markercreate', {\r\n detail: { markerArea: this, markerEditor: editor },\r\n }),\r\n );\r\n }\r\n }\r\n\r\n private markerStateChanged(markerEditor: MarkerBaseEditor): void {\r\n this.addUndoStep();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerchange', {\r\n detail: { markerArea: this, markerEditor: markerEditor },\r\n }),\r\n );\r\n }\r\n\r\n public setCurrentEditor(editor?: MarkerBaseEditor): void {\r\n if (this._currentMarkerEditor !== editor) {\r\n // no need to deselect if not changed\r\n if (this._currentMarkerEditor !== undefined) {\r\n this._currentMarkerEditor.deselect();\r\n\r\n // @todo\r\n // if (!this._isResizing) {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerdeselect', {\r\n detail: {\r\n markerArea: this,\r\n markerEditor: this._currentMarkerEditor,\r\n },\r\n }),\r\n );\r\n // }\r\n }\r\n }\r\n this._currentMarkerEditor = editor;\r\n if (\r\n this._currentMarkerEditor !== undefined &&\r\n !this._currentMarkerEditor.isSelected\r\n ) {\r\n if (this._currentMarkerEditor.state !== 'new') {\r\n this._currentMarkerEditor.select();\r\n }\r\n\r\n // @todo\r\n // if (!this._isResizing) {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerselect', {\r\n detail: { markerArea: this, markerEditor: this._currentMarkerEditor },\r\n }),\r\n );\r\n // }\r\n }\r\n }\r\n\r\n private touchPoints = 0;\r\n private isDragging = false;\r\n\r\n private onCanvasPointerDown(ev: PointerEvent) {\r\n // @todo ?\r\n // if (!this._isFocused) {\r\n // this.focus();\r\n // }\r\n\r\n this.touchPoints++;\r\n if (this.touchPoints === 1 || ev.pointerType !== 'touch') {\r\n if (\r\n this._currentMarkerEditor !== undefined &&\r\n (this._currentMarkerEditor.state === 'new' ||\r\n this._currentMarkerEditor.state === 'creating')\r\n ) {\r\n this.isDragging = true;\r\n this._currentMarkerEditor.pointerDown(\r\n SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n ),\r\n ev.target ?? undefined,\r\n );\r\n } else if (this.mode === 'select') {\r\n const hitMarker = this.editors.find((m) => m.ownsTarget(ev.target));\r\n if (hitMarker !== undefined) {\r\n this.setCurrentEditor(hitMarker);\r\n this.isDragging = true;\r\n this._currentMarkerEditor!.pointerDown(\r\n SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n ),\r\n ev.target ?? undefined,\r\n );\r\n } else {\r\n this.setCurrentEditor();\r\n this.isDragging = true;\r\n this.prevPanPoint = { x: ev.clientX, y: ev.clientY };\r\n }\r\n }\r\n }\r\n }\r\n\r\n private onCanvasDblClick(ev: MouseEvent) {\r\n // @todo ?\r\n // if (!this._isFocused) {\r\n // this.focus();\r\n // }\r\n\r\n if (this.mode === 'select') {\r\n const hitMarker = this.editors.find((m) => m.ownsTarget(ev.target));\r\n if (hitMarker !== undefined && hitMarker !== this._currentMarkerEditor) {\r\n this.setCurrentEditor(hitMarker);\r\n }\r\n if (this._currentMarkerEditor !== undefined) {\r\n this._currentMarkerEditor.dblClick(\r\n SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n ),\r\n ev.target ?? undefined,\r\n );\r\n } else {\r\n this.setCurrentEditor();\r\n }\r\n }\r\n }\r\n\r\n private onPointerMove(ev: PointerEvent) {\r\n if (this.touchPoints === 1 || ev.pointerType !== 'touch') {\r\n if (this._currentMarkerEditor !== undefined || this.isDragging) {\r\n // don't swallow the event when editing text markers\r\n if (\r\n this._currentMarkerEditor === undefined ||\r\n this._currentMarkerEditor.state !== 'edit'\r\n ) {\r\n ev.preventDefault();\r\n }\r\n\r\n if (this._currentMarkerEditor !== undefined) {\r\n const localPoint = SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n );\r\n\r\n this.showOutline(localPoint);\r\n\r\n this._currentMarkerEditor.manipulate(localPoint);\r\n } else if (this.zoomLevel > 1) {\r\n this.panTo({ x: ev.clientX, y: ev.clientY });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private showOutline(localPoint: IPoint) {\r\n if (\r\n this._currentMarkerEditor &&\r\n this._currentMarkerEditor.creationStyle === 'drop' &&\r\n this._currentMarkerEditor.state === 'new'\r\n ) {\r\n if (\r\n this._mainCanvas !== undefined &&\r\n !this._mainCanvas.contains(this._newMarkerOutline)\r\n ) {\r\n this._mainCanvas.appendChild(this._newMarkerOutline);\r\n }\r\n const size = this._currentMarkerEditor.marker.defaultSize;\r\n SvgHelper.setAttributes(this._newMarkerOutline, [\r\n ['d', this._currentMarkerEditor.marker.getOutline()],\r\n ]);\r\n this._newMarkerOutline.style.transform = `translate(${\r\n localPoint.x - size.width / 2\r\n }px, ${localPoint.y - size.height / 2}px)`;\r\n }\r\n }\r\n\r\n private hideOutline() {\r\n if (this._mainCanvas?.contains(this._newMarkerOutline)) {\r\n this._mainCanvas.removeChild(this._newMarkerOutline);\r\n }\r\n }\r\n\r\n private onPointerUp(ev: PointerEvent) {\r\n if (this.touchPoints > 0) {\r\n this.touchPoints--;\r\n }\r\n if (this.touchPoints === 0) {\r\n if (this.isDragging && this._currentMarkerEditor !== undefined) {\r\n this._currentMarkerEditor.pointerUp(\r\n SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n ),\r\n );\r\n\r\n this.hideOutline();\r\n }\r\n }\r\n this.isDragging = false;\r\n this.addUndoStep();\r\n }\r\n\r\n private onPointerOut(/*ev: PointerEvent*/) {\r\n if (this.touchPoints > 0) {\r\n this.touchPoints--;\r\n }\r\n this.hideOutline();\r\n }\r\n\r\n private onKeyUp(ev: KeyboardEvent) {\r\n if (\r\n this._currentMarkerEditor !== undefined &&\r\n (ev.key === 'Delete' || ev.key === 'Backspace')\r\n ) {\r\n // @todo\r\n // this.deleteSelectedMarker();\r\n }\r\n }\r\n\r\n private attachEvents() {\r\n // needed to distinguish when the element is in focus (active)\r\n if (!this.hasAttribute('tabindex')) {\r\n this.setAttribute('tabindex', '0');\r\n }\r\n\r\n // @todo\r\n // this.setupResizeObserver();\r\n this._mainCanvas?.addEventListener('pointerdown', this.onCanvasPointerDown);\r\n // workaround to prevent a bug with Apple Pencil\r\n // https://bugs.webkit.org/show_bug.cgi?id=217430\r\n this._mainCanvas?.addEventListener('touchmove', (ev) =>\r\n ev.preventDefault(),\r\n );\r\n this._mainCanvas?.addEventListener('dblclick', this.onCanvasDblClick);\r\n\r\n // @todo - using these in Diagrams but not in mjs2 - why?\r\n // this._mainCanvas?.addEventListener('pointermove', this.onCanvasPointerMove);\r\n // this._mainCanvas?.addEventListener('pointerup', this.onCanvasPointerUp);\r\n // this._mainCanvas?.addEventListener('pointerout', this.onCanvasPointerOut);\r\n this.attachWindowEvents();\r\n }\r\n\r\n private attachWindowEvents() {\r\n window.addEventListener('pointermove', this.onPointerMove);\r\n window.addEventListener('pointerup', this.onPointerUp);\r\n window.addEventListener('pointerleave', this.onPointerUp);\r\n window.addEventListener('pointercancel', this.onPointerOut);\r\n window.addEventListener('pointerout', this.onPointerOut);\r\n window.addEventListener('keyup', this.onKeyUp);\r\n }\r\n\r\n private detachEvents() {\r\n // @todo\r\n // if (this._resizeObserver && this._container) {\r\n // this._resizeObserver.unobserve(this._container);\r\n // }\r\n\r\n // this._mainCanvas?.removeEventListener(\r\n // 'pointerdown',\r\n // this.onCanvasPointerDown\r\n // );\r\n // this._mainCanvas?.removeEventListener(\r\n // 'pointerdown',\r\n // this.onCanvasPointerUp\r\n // );\r\n // this._mainCanvas?.removeEventListener('dblclick', this.onDblClick);\r\n this.detachWindowEvents();\r\n }\r\n\r\n private detachWindowEvents() {\r\n // @todo\r\n // window.removeEventListener('pointermove', this.onPointerMove);\r\n // window.removeEventListener('pointerup', this.onPointerUp);\r\n // window.removeEventListener('pointercancel', this.onPointerOut);\r\n // window.removeEventListener('pointerout', this.onPointerOut);\r\n // window.removeEventListener('pointerleave', this.onPointerUp);\r\n // window.removeEventListener('keyup', this.onKeyUp);\r\n }\r\n\r\n private getMarkerTypeByName(typeName: string): typeof MarkerBase | undefined {\r\n let result: typeof MarkerBase | undefined;\r\n this.markerEditors.forEach((value, key) => {\r\n if (key.typeName === typeName) {\r\n result = key;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n public switchToSelectMode() {\r\n this.setCurrentEditor();\r\n if (this._mainCanvas) {\r\n this._mainCanvas.style.cursor = 'default';\r\n }\r\n }\r\n\r\n public getState(): AnnotationState {\r\n const result: AnnotationState = {\r\n version: 3,\r\n width: this.targetWidth,\r\n height: this.targetHeight,\r\n\r\n markers: this.editors.map((editor) => {\r\n return editor.getState();\r\n }),\r\n };\r\n\r\n return JSON.parse(JSON.stringify(result));\r\n }\r\n\r\n public restoreState(state: AnnotationState): void {\r\n const stateCopy: AnnotationState = JSON.parse(JSON.stringify(state));\r\n this.editors.splice(0);\r\n\r\n while (this._mainCanvas?.lastChild) {\r\n this._mainCanvas.removeChild(this._mainCanvas.lastChild);\r\n }\r\n\r\n stateCopy.markers.forEach((markerState) => {\r\n const markerType = this.getMarkerTypeByName(markerState.typeName);\r\n if (markerType !== undefined) {\r\n const editorType = this.markerEditors.get(markerType);\r\n if (editorType !== undefined) {\r\n const markerEditor = this.addNewMarker(editorType, markerType);\r\n markerEditor.restoreState(markerState);\r\n this.editors.push(markerEditor);\r\n }\r\n }\r\n });\r\n\r\n if (\r\n stateCopy.width &&\r\n stateCopy.height &&\r\n (stateCopy.width !== this.targetWidth || stateCopy.height !== this.targetHeight)\r\n ) {\r\n this.scaleMarkers(this.targetWidth / stateCopy.width, this.targetHeight / stateCopy.height);\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('arearestorestate', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n }\r\n\r\n private scaleMarkers(scaleX: number, scaleY: number) {\r\n let preScaleSelectedMarker: MarkerBaseEditor | undefined;\r\n // @todo\r\n // if (!(this._currentMarker && this._currentMarker instanceof TextMarker)) {\r\n // can't unselect text marker as it would hide keyboard on mobile\r\n // eslint-disable-next-line prefer-const\r\n preScaleSelectedMarker = this._currentMarkerEditor;\r\n this.setCurrentEditor();\r\n // } else {\r\n // this._currentMarker.scale(scaleX, scaleY);\r\n // }\r\n this.editors.forEach((editor) => {\r\n if (editor !== this._currentMarkerEditor) {\r\n editor.scale(scaleX, scaleY);\r\n }\r\n });\r\n if (preScaleSelectedMarker !== undefined) {\r\n this.setCurrentEditor(preScaleSelectedMarker);\r\n }\r\n }\r\n\r\n /**\r\n * NOTE:\r\n *\r\n * before removing or modifying this method please consider supporting marker.js\r\n * by visiting https://markerjs.com/buy for details\r\n *\r\n * thank you!\r\n */\r\n private toggleLogo() {\r\n if (!Activator.isLicensed('MJS3')) {\r\n // NOTE:\r\n // before removing this call please consider supporting marker.js\r\n // by visiting https://markerjs.com/ for details\r\n // thank you!\r\n this.addLogo();\r\n } else {\r\n this.removeLogo();\r\n }\r\n }\r\n \r\n private addLogo() {\r\n if (this._logoUI !== undefined) {\r\n this._contentContainer?.removeChild(this._logoUI);\r\n }\r\n this._logoUI = document.createElement('div');\r\n this._logoUI.style.display = 'inline-block';\r\n this._logoUI.style.margin = '0px';\r\n this._logoUI.style.padding = '0px';\r\n this._logoUI.style.fill = '#333333';\r\n\r\n const link = document.createElement('a');\r\n link.href = 'https://markerjs.com/';\r\n link.target = '_blank';\r\n link.innerHTML = Logo;\r\n link.title = 'Powered by marker.js';\r\n\r\n link.style.display = 'grid';\r\n link.style.alignItems = 'center';\r\n link.style.justifyItems = 'center';\r\n link.style.padding = '3px';\r\n link.style.width = '20px';\r\n link.style.height = '20px';\r\n link.style.cursor = 'pointer';\r\n\r\n this._logoUI.appendChild(link);\r\n\r\n this._contentContainer?.appendChild(this._logoUI);\r\n\r\n this._logoUI.style.position = 'absolute';\r\n this._logoUI.style.pointerEvents = 'all';\r\n this.positionLogo();\r\n }\r\n\r\n private removeLogo() {\r\n if (\r\n this._contentContainer &&\r\n this._logoUI !== undefined &&\r\n this._contentContainer.contains(this._logoUI)\r\n ) {\r\n this._contentContainer.removeChild(this._logoUI);\r\n }\r\n }\r\n\r\n private positionLogo() {\r\n if (this._logoUI && this._contentContainer) {\r\n this._logoUI.style.left = `20px`;\r\n this._logoUI.style.top = `${\r\n this._contentContainer.offsetHeight - this._logoUI.clientHeight - 20\r\n }px`;\r\n }\r\n } \r\n\r\n /**\r\n * Returns true if undo operation can be performed (undo stack is not empty).\r\n */\r\n public get isUndoPossible(): boolean {\r\n if (this.undoRedoManager && this.undoRedoManager.isUndoPossible) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if redo operation can be performed (redo stack is not empty).\r\n */\r\n public get isRedoPossible(): boolean {\r\n if (this.undoRedoManager && this.undoRedoManager.isRedoPossible) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n private addUndoStep() {\r\n if (\r\n this._currentMarkerEditor === undefined ||\r\n this._currentMarkerEditor.state !== 'edit'\r\n ) {\r\n const currentState = this.getState();\r\n const lastUndoState = this.undoRedoManager.getLastUndoStep();\r\n if (\r\n lastUndoState &&\r\n (lastUndoState.width !== currentState.width ||\r\n lastUndoState.height !== currentState.height)\r\n ) {\r\n // if the size changed just replace the last step with a resized one\r\n this.undoRedoManager.replaceLastUndoStep(currentState);\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areastatechange', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n } else {\r\n const stepAdded = this.undoRedoManager.addUndoStep(currentState);\r\n if (stepAdded) {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areastatechange', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Undo last action.\r\n */\r\n public undo(): void {\r\n this.addUndoStep();\r\n this.undoStep();\r\n }\r\n\r\n private undoStep(): void {\r\n const stepData = this.undoRedoManager.undo();\r\n if (stepData !== undefined) {\r\n this.restoreState(stepData);\r\n }\r\n }\r\n\r\n /**\r\n * Redo previously undone action.\r\n */\r\n public redo(): void {\r\n this.redoStep();\r\n }\r\n\r\n private redoStep(): void {\r\n const stepData = this.undoRedoManager.redo();\r\n if (stepData !== undefined) {\r\n this.restoreState(stepData);\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerAreaEventData>('areastatechange', {\r\n detail: { markerArea: this },\r\n }),\r\n );\r\n }\r\n }\r\n\r\n addEventListener<T extends keyof MarkerAreaEventMap>(\r\n // the event name, a key of MarkerAreaEventMap\r\n type: T,\r\n\r\n // the listener, using a value of MarkerAreaEventMap\r\n listener: (this: MarkerArea, ev: MarkerAreaEventMap[T]) => void,\r\n\r\n // any options\r\n options?: boolean | AddEventListenerOptions,\r\n ): void;\r\n addEventListener<K extends keyof HTMLElementEventMap>(\r\n type: K,\r\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => void,\r\n options?: boolean | AddEventListenerOptions | undefined,\r\n ): void;\r\n addEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | AddEventListenerOptions | undefined,\r\n ): void {\r\n super.addEventListener(type, listener, options);\r\n }\r\n\r\n removeEventListener<T extends keyof MarkerAreaEventMap>(\r\n // the event name, a key of MarkerAreaEventMap\r\n type: T,\r\n\r\n // the listener, using a value of MarkerAreaEventMap\r\n listener: (this: MarkerArea, ev: MarkerAreaEventMap[T]) => void,\r\n\r\n // any options\r\n options?: boolean | EventListenerOptions,\r\n ): void;\r\n removeEventListener<K extends keyof HTMLElementEventMap>(\r\n type: K,\r\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => void,\r\n options?: boolean | EventListenerOptions | undefined,\r\n ): void;\r\n removeEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | EventListenerOptions | undefined,\r\n ): void {\r\n super.removeEventListener(type, listener, options);\r\n }\r\n}\r\n","import { MarkerArea } from './MarkerArea';\r\n\r\nexport {\r\n MarkerArea,\r\n MarkerAreaEventData,\r\n MarkerAreaEventMap,\r\n} from './MarkerArea';\r\nexport { MarkerBaseEditor, MarkerEditorState } from './editor/MarkerBaseEditor';\r\nexport { MarkerEditorProperties } from './editor/MarkerEditorProperties';\r\nexport { ColorType } from './editor/ColorType';\r\nexport { Grip } from './editor/Grip';\r\nexport { ResizeGrip } from './editor/ResizeGrip';\r\nexport { RotateGrip } from './editor/RotateGrip';\r\nexport { ShapeOutlineMarkerEditor } from './editor/ShapeOutlineMarkerEditor';\r\nexport { LinearMarkerEditor } from './editor/LinearMarkerEditor';\r\nexport { PolygonMarkerEditor } from './editor/PolygonMarkerEditor';\r\nexport { FreehandMarkerEditor } from './editor/FreehandMarkerEditor';\r\nexport { TextMarkerEditor } from './editor/TextMarkerEditor';\r\n\r\nif (\r\n window &&\r\n window.customElements &&\r\n window.customElements.get('mjs-marker-area') === undefined\r\n) {\r\n window.customElements.define('mjs-marker-area', MarkerArea);\r\n}\r\n","import { AnnotationState, FrameMarker, FreehandMarker, MarkerBase, PolygonMarker, SvgHelper, TextMarker } from \"./core\";\r\nimport { LineMarker } from './core/LineMarker';\r\nimport { Activator } from './core/Activator';\r\n\r\nimport Logo from './assets/markerjs-logo-m.svg';\r\n\r\nexport interface MarkerViewEventMap {\r\n /**\r\n * Viewer initialized.\r\n */\r\n viewinit: CustomEvent<MarkerViewEventData>;\r\n\r\n viewshow: CustomEvent<MarkerViewEventData>;\r\n\r\n viewrestorestate: CustomEvent<MarkerViewEventData>;\r\n}\r\n\r\nexport interface MarkerViewEventData {\r\n /**\r\n * {@link MarkerView} instance.\r\n */\r\n markerView: MarkerView;\r\n}\r\n\r\n\r\nexport class MarkerView extends HTMLElement {\r\n private _contentContainer?: HTMLDivElement;\r\n private _canvasContainer?: HTMLDivElement;\r\n\r\n private _mainCanvas?: SVGSVGElement;\r\n private _groupLayer?: SVGGElement;\r\n\r\n private _editingTarget?: HTMLImageElement;\r\n\r\n private width = 0;\r\n private height = 0;\r\n\r\n private _targetWidth = -1;\r\n public get targetWidth() {\r\n return this._targetWidth;\r\n }\r\n public set targetWidth(value) {\r\n this._targetWidth = value;\r\n this.setMainCanvasSize();\r\n }\r\n private _targetHeight = -1;\r\n public get targetHeight() {\r\n return this._targetHeight;\r\n }\r\n public set targetHeight(value) {\r\n this._targetHeight = value;\r\n this.setMainCanvasSize();\r\n }\r\n\r\n private _targetImage: HTMLImageElement | undefined;\r\n public get targetImage(): HTMLImageElement | undefined {\r\n return this._targetImage;\r\n }\r\n public set targetImage(value: HTMLImageElement | undefined) {\r\n this._targetImage = value;\r\n if (value !== undefined) {\r\n this.addTargetImage();\r\n }\r\n }\r\n\r\n public markerTypes: Array<typeof MarkerBase> = [];\r\n\r\n public markers: MarkerBase[] = [];\r\n\r\n private _logoUI?: HTMLElement;\r\n\r\n private _zoomLevel = 1;\r\n /**\r\n * Returns the current zoom level.\r\n */\r\n public get zoomLevel(): number {\r\n return this._zoomLevel;\r\n }\r\n /**\r\n * Sets the current zoom level.\r\n */\r\n public set zoomLevel(value: number) {\r\n this._zoomLevel = value;\r\n if (\r\n this._canvasContainer &&\r\n this._contentContainer &&\r\n this._mainCanvas\r\n ) {\r\n //this.setMainCanvasSize();\r\n this._mainCanvas.style.transform = `scale(${this._zoomLevel})`;\r\n this.setEditingTargetSize();\r\n this._canvasContainer.scrollTo({\r\n left:\r\n (this._mainCanvas.clientWidth - this._canvasContainer.clientWidth) /\r\n 2,\r\n top:\r\n (this._mainCanvas.clientHeight - this._canvasContainer.clientHeight) /\r\n 2,\r\n });\r\n }\r\n }\r\n\r\n private _isInitialized = false;\r\n\r\n constructor() {\r\n super();\r\n\r\n this.markerTypes = [\r\n FrameMarker, LineMarker, PolygonMarker, FreehandMarker, TextMarker\r\n ];\r\n\r\n this.connectedCallback = this.connectedCallback.bind(this);\r\n this.disconnectedCallback = this.disconnectedCallback.bind(this);\r\n\r\n this.createLayout = this.createLayout.bind(this);\r\n this.addMainCanvas = this.addMainCanvas.bind(this);\r\n this.setMainCanvasSize = this.setMainCanvasSize.bind(this);\r\n this.setEditingTargetSize = this.setEditingTargetSize.bind(this);\r\n this.addTargetImage = this.addTargetImage.bind(this);\r\n\r\n this.attachEvents = this.attachEvents.bind(this);\r\n this.attachWindowEvents = this.attachWindowEvents.bind(this);\r\n this.detachEvents = this.detachEvents.bind(this);\r\n this.detachWindowEvents = this.detachWindowEvents.bind(this);\r\n\r\n this.addNewMarker = this.addNewMarker.bind(this);\r\n\r\n this.show = this.show.bind(this);\r\n this.scaleMarkers = this.scaleMarkers.bind(this);\r\n\r\n this.toggleLogo = this.toggleLogo.bind(this);\r\n this.addLogo = this.addLogo.bind(this);\r\n this.removeLogo = this.removeLogo.bind(this);\r\n\r\n this.attachShadow({ mode: 'open' });\r\n }\r\n\r\n private connectedCallback() {\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerViewEventData>('viewinit', {\r\n detail: { markerView: this },\r\n }),\r\n ); \r\n Activator.addKeyAddListener(this.toggleLogo);\r\n this.createLayout();\r\n this.addMainCanvas();\r\n this.attachEvents();\r\n this._isInitialized = true;\r\n if (this.targetImage !== undefined) {\r\n this.addTargetImage();\r\n }\r\n this.setMainCanvasSize();\r\n this.toggleLogo();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerViewEventData>('viewshow', {\r\n detail: { markerView: this },\r\n }),\r\n ); \r\n }\r\n\r\n private disconnectedCallback() {\r\n this.detachEvents();\r\n }\r\n\r\n private createLayout() {\r\n this.style.display = 'flex';\r\n this.style.width = this.style.width !== '' ? this.style.width : '100%';\r\n this.style.height = this.style.height !== '' ? this.style.height : '100%';\r\n this.style.position = 'relative';\r\n\r\n this._contentContainer = document.createElement('div');\r\n this._contentContainer.style.display = 'flex';\r\n this._contentContainer.style.position = 'relative';\r\n this._contentContainer.style.flexGrow = '2';\r\n this._contentContainer.style.flexShrink = '1';\r\n this._contentContainer.style.overflow = 'hidden';\r\n\r\n this._canvasContainer = document.createElement('div');\r\n this._canvasContainer.style.touchAction = 'pinch-zoom';\r\n this._canvasContainer.className = 'canvas-container';\r\n this._canvasContainer.style.display = 'grid';\r\n this._canvasContainer.style.gridTemplateColumns = '1fr';\r\n this._canvasContainer.style.flexGrow = '2';\r\n this._canvasContainer.style.flexShrink = '2';\r\n this._canvasContainer.style.justifyItems = 'center';\r\n this._canvasContainer.style.alignItems = 'center';\r\n this._canvasContainer.style.overflow = 'auto';\r\n this._contentContainer.appendChild(this._canvasContainer);\r\n\r\n this.shadowRoot?.appendChild(this._contentContainer);\r\n }\r\n\r\n private addMainCanvas() {\r\n this.width = this._contentContainer?.clientWidth || 0;\r\n this.height = this._contentContainer?.clientHeight || 0;\r\n\r\n this._mainCanvas = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'svg',\r\n );\r\n this._mainCanvas.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n this.setMainCanvasSize();\r\n this._mainCanvas.style.gridColumnStart = '1';\r\n this._mainCanvas.style.gridRowStart = '1';\r\n this._mainCanvas.style.pointerEvents = 'auto';\r\n // this._mainCanvas.style.backgroundColor = 'pink'; // @todo\r\n // this._mainCanvas.style.opacity = '0.3'; // @todo\r\n this._mainCanvas.style.margin = '10px';\r\n this._mainCanvas.style.transform = `scale(${this._zoomLevel})`;\r\n\r\n this._groupLayer = SvgHelper.createGroup();\r\n\r\n this._mainCanvas.appendChild(this._groupLayer);\r\n\r\n this._canvasContainer?.appendChild(this._mainCanvas);\r\n } \r\n\r\n private setMainCanvasSize() {\r\n if (\r\n this._mainCanvas !== undefined &&\r\n this._targetHeight > 0 &&\r\n this._targetWidth > 0\r\n ) {\r\n this._mainCanvas.style.width = `${this._targetWidth * this.zoomLevel}px`;\r\n this._mainCanvas.style.height = `${\r\n this._targetHeight * this.zoomLevel\r\n }px`;\r\n this._mainCanvas.setAttribute(\r\n 'width',\r\n `${this._targetWidth * this.zoomLevel}`,\r\n );\r\n this._mainCanvas.setAttribute(\r\n 'height',\r\n `${this._targetHeight * this.zoomLevel}`,\r\n );\r\n this._mainCanvas.setAttribute(\r\n 'viewBox',\r\n '0 0 ' +\r\n this._targetWidth.toString() +\r\n ' ' +\r\n this._targetHeight.toString(),\r\n );\r\n this.setEditingTargetSize();\r\n }\r\n }\r\n\r\n private setEditingTargetSize() {\r\n if (this._editingTarget !== undefined) {\r\n this._editingTarget.width = this._targetWidth * this.zoomLevel;\r\n this._editingTarget.height = this._targetHeight * this.zoomLevel;\r\n this._editingTarget.style.width = `${\r\n this._targetWidth * this.zoomLevel\r\n }px`;\r\n this._editingTarget.style.height = `${\r\n this._targetHeight * this.zoomLevel\r\n }px`;\r\n }\r\n } \r\n\r\n private addTargetImage() {\r\n if (\r\n this._isInitialized &&\r\n this._editingTarget === undefined &&\r\n this.targetImage !== undefined &&\r\n this._canvasContainer !== undefined &&\r\n this._mainCanvas !== undefined\r\n ) {\r\n this._editingTarget = document.createElement('img');\r\n\r\n this._targetWidth =\r\n this._targetWidth > 0\r\n ? this._targetWidth\r\n : this.targetImage.clientWidth;\r\n this._targetHeight =\r\n this._targetHeight > 0\r\n ? this._targetHeight\r\n : this.targetImage.clientHeight;\r\n\r\n this._editingTarget.addEventListener('load', (ev) => {\r\n if (this._editingTarget !== undefined) {\r\n if (this._targetHeight <= 0 && this._targetWidth <= 0) {\r\n const img = <HTMLImageElement>ev.target;\r\n this._targetWidth =\r\n img.clientWidth > 0 ? img.clientWidth : img.naturalWidth;\r\n this._targetHeight =\r\n img.clientHeight > 0 ? img.clientHeight : img.naturalHeight;\r\n }\r\n this._editingTarget.width = this._targetWidth;\r\n this._editingTarget.height = this._targetHeight;\r\n this._editingTarget.style.width = `${this._targetWidth}px`;\r\n this._editingTarget.style.height = `${this._targetHeight}px`;\r\n this._editingTarget.style.gridColumnStart = '1';\r\n this._editingTarget.style.gridRowStart = '1';\r\n\r\n this.setMainCanvasSize();\r\n }\r\n });\r\n this._editingTarget.src = this.targetImage.src;\r\n\r\n this._canvasContainer.insertBefore(this._editingTarget, this._mainCanvas);\r\n }\r\n }\r\n\r\n private addNewMarker(\r\n markerType: typeof MarkerBase,\r\n ): MarkerBase {\r\n if (this._mainCanvas === undefined) {\r\n throw new Error('Main canvas is not initialized.');\r\n }\r\n\r\n const g = SvgHelper.createGroup();\r\n this._mainCanvas.appendChild(g);\r\n\r\n return new markerType(g);\r\n } \r\n\r\n private attachEvents() {\r\n // needed to distinguish when the element is in focus (active)\r\n if (!this.hasAttribute('tabindex')) {\r\n this.setAttribute('tabindex', '0');\r\n }\r\n\r\n // @todo\r\n // this.setupResizeObserver();\r\n\r\n this.attachWindowEvents();\r\n }\r\n\r\n private attachWindowEvents() {\r\n // @todo\r\n // window.addEventListener('pointermove', this.onPointerMove);\r\n // window.addEventListener('pointerup', this.onPointerUp);\r\n // window.addEventListener('pointercancel', this.onPointerOut);\r\n // window.addEventListener('pointerout', this.onPointerOut);\r\n // window.addEventListener('pointerleave', this.onPointerUp);\r\n }\r\n\r\n private detachEvents() {\r\n // @todo\r\n // if (this._resizeObserver && this._container) {\r\n // this._resizeObserver.unobserve(this._container);\r\n // }\r\n // this._mainCanvas?.removeEventListener('pointerdown', this.onPointerDown);\r\n // this._mainCanvas?.removeEventListener(\r\n // 'pointerdown',\r\n // this.onStencilPointerUp\r\n // );\r\n this.detachWindowEvents();\r\n }\r\n\r\n private detachWindowEvents() {\r\n // @todo\r\n // window.removeEventListener('pointermove', this.onPointerMove);\r\n // window.removeEventListener('pointerup', this.onPointerUp);\r\n // window.removeEventListener('pointercancel', this.onPointerOut);\r\n // window.removeEventListener('pointerout', this.onPointerOut);\r\n // window.removeEventListener('pointerleave', this.onPointerUp);\r\n }\r\n\r\n private getMarkerTypeByName(typeName: string): typeof MarkerBase | undefined {\r\n let result: typeof MarkerBase | undefined;\r\n this.markerTypes.forEach((mType) => {\r\n if (mType.typeName === typeName) {\r\n result = mType;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n public show(state: AnnotationState): void {\r\n const stateCopy: AnnotationState = JSON.parse(JSON.stringify(state));\r\n this.markers.splice(0);\r\n\r\n while (this._mainCanvas?.lastChild) {\r\n this._mainCanvas.removeChild(this._mainCanvas.lastChild);\r\n }\r\n\r\n stateCopy.markers.forEach((markerState) => {\r\n const markerType = this.getMarkerTypeByName(markerState.typeName);\r\n if (markerType !== undefined) {\r\n const marker = this.addNewMarker(markerType);\r\n marker.restoreState(markerState);\r\n this.markers.push(marker);\r\n }\r\n });\r\n\r\n if (\r\n stateCopy.width &&\r\n stateCopy.height &&\r\n (stateCopy.width !== this.targetWidth || stateCopy.height !== this.targetHeight)\r\n ) {\r\n this.scaleMarkers(this.targetWidth / stateCopy.width, this.targetHeight / stateCopy.height);\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerViewEventData>('viewrestorestate', {\r\n detail: { markerView: this },\r\n }),\r\n ); \r\n }\r\n\r\n private scaleMarkers(scaleX: number, scaleY: number) {\r\n this.markers.forEach((marker) => {\r\n marker.scale(scaleX, scaleY);\r\n });\r\n }\r\n\r\n /**\r\n * NOTE:\r\n *\r\n * before removing or modifying this method please consider supporting marker.js\r\n * by visiting https://markerjs.com/buy for details\r\n *\r\n * thank you!\r\n */\r\n private toggleLogo() {\r\n if (!Activator.isLicensed('MJS3')) {\r\n // NOTE:\r\n // before removing this call please consider supporting marker.js\r\n // by visiting https://markerjs.com/ for details\r\n // thank you!\r\n this.addLogo();\r\n } else {\r\n this.removeLogo();\r\n }\r\n }\r\n\r\nprivate addLogo() {\r\n if (this._logoUI !== undefined) {\r\n this._contentContainer?.removeChild(this._logoUI);\r\n }\r\n this._logoUI = document.createElement('div');\r\n this._logoUI.style.display = 'inline-block';\r\n this._logoUI.style.margin = '0px';\r\n this._logoUI.style.padding = '0px';\r\n this._logoUI.style.fill = '#333333';\r\n\r\n const link = document.createElement('a');\r\n link.href = 'https://markerjs.com/';\r\n link.target = '_blank';\r\n link.innerHTML = Logo;\r\n link.title = 'Powered by marker.js';\r\n\r\n link.style.display = 'grid';\r\n link.style.alignItems = 'center';\r\n link.style.justifyItems = 'center';\r\n link.style.padding = '3px';\r\n link.style.width = '20px';\r\n link.style.height = '20px';\r\n link.style.cursor = 'pointer';\r\n\r\n this._logoUI.appendChild(link);\r\n\r\n this._contentContainer?.appendChild(this._logoUI);\r\n\r\n this._logoUI.style.position = 'absolute';\r\n this._logoUI.style.pointerEvents = 'all';\r\n this.positionLogo();\r\n}\r\n\r\nprivate removeLogo() {\r\n if (\r\n this._contentContainer &&\r\n this._logoUI !== undefined &&\r\n this._contentContainer.contains(this._logoUI)\r\n ) {\r\n this._contentContainer.removeChild(this._logoUI);\r\n }\r\n}\r\n\r\nprivate positionLogo() {\r\n if (this._logoUI && this._contentContainer) {\r\n this._logoUI.style.left = `20px`;\r\n this._logoUI.style.top = `${\r\n this._contentContainer.offsetHeight - this._logoUI.clientHeight - 20\r\n }px`;\r\n }\r\n} \r\n\r\n addEventListener<T extends keyof MarkerViewEventMap>(\r\n // the event name, a key of MarkerViewEventMap\r\n type: T,\r\n\r\n // the listener, using a value of MarkerViewEventMap\r\n listener: (this: MarkerView, ev: MarkerViewEventMap[T]) => void,\r\n\r\n // any options\r\n options?: boolean | AddEventListenerOptions\r\n ): void;\r\n addEventListener<K extends keyof HTMLElementEventMap>(\r\n type: K,\r\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => void,\r\n options?: boolean | AddEventListenerOptions | undefined\r\n ): void;\r\n addEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | AddEventListenerOptions | undefined\r\n ): void {\r\n super.addEventListener(type, listener, options);\r\n }\r\n\r\n removeEventListener<T extends keyof MarkerViewEventMap>(\r\n // the event name, a key of MarkerViewEventMap\r\n type: T,\r\n\r\n // the listener, using a value of MarkerViewEventMap\r\n listener: (this: MarkerView, ev: MarkerViewEventMap[T]) => void,\r\n\r\n // any options\r\n options?: boolean | EventListenerOptions\r\n ): void;\r\n removeEventListener<K extends keyof HTMLElementEventMap>(\r\n type: K,\r\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => void,\r\n options?: boolean | EventListenerOptions | undefined\r\n ): void;\r\n removeEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | EventListenerOptions | undefined\r\n ): void {\r\n super.removeEventListener(type, listener, options);\r\n } \r\n}\r\n","import { MarkerView } from './MarkerView';\r\n\r\nexport {\r\n MarkerView,\r\n MarkerViewEventData,\r\n MarkerViewEventMap,\r\n} from './MarkerView';\r\n\r\nif (\r\n window &&\r\n window.customElements &&\r\n window.customElements.get('mjs-marker-view') === undefined\r\n) {\r\n window.customElements.define('mjs-marker-view', MarkerView);\r\n}\r\n"],"names":["SvgHelper","createDefs","document","createElementNS","setAttributes","el","attributes","attr","value","setAttribute","createRect","width","height","rect","toString","createLine","x1","y1","x2","y2","line","createPolygon","points","polygon","createCircle","radius","circle","createEllipse","rx","ry","ellipse","createGroup","g","createTransform","createSVGTransform","createMarker","id","orient","markerWidth","markerHeight","refX","refY","markerElement","marker","appendChild","createText","text","createTSpan","tspan","textContent","createImage","image","createPoint","x","y","svgPoint","createSVGPoint","createPath","d","path","createForeignObject","obj","clientToLocalCoordinates","localRoot","zoomLevel","clientRect","getBoundingClientRect","left","top","createSvgFromString","stringSvg","svg","innerHTML","MarkerBase","typeName","Object","getPrototypeOf","this","constructor","container","_container","strokeColor","_strokeColor","color","applyStrokeColor","fillColor","_fillColor","applyFillColor","strokeWidth","_strokeWidth","applyStrokeWidth","strokeDasharray","_strokeDasharray","applyStrokeDasharray","opacity","_opacity","applyOpacity","defaultSize","stage","bind","ownsTarget","dispose","addMarkerVisualToContainer","element","childNodes","length","insertBefore","getOutline","getState","notes","restoreState","state","_a","_b","_c","_d","scale","scaleX","scaleY","TransformMatrix","toITransformMatrix","matrix","a","b","c","e","f","toSVGMatrix","currentMatrix","newMatrix","RectangularBoxMarkerBase","centerX","centerY","visual","_visual","translate","transform","baseVal","appendItem","super","rotationAngle","rotatePoint","unrotatePoint","moveVisual","point","style","setSize","rotate","Math","abs","sign","atan","PI","applyRotation","getItem","setRotate","replaceItem","getCTM","matrixTransform","inverse","assign","visualTransformMatrix","containerTransformMatrix","rbmState","setMatrix","rPoint","ShapeOutlineMarkerBase","createVisual","getPath","adjustVisual","title","FrameMarker","result","LinearMarkerBase","visibleVisual","selectorVisual","max","lmbState","PolygonMarker","selectorVisualLines","some","l","map","p","i","join","createSelectorVisual","forEach","addSelectorLine","adjustSelectorVisual","missingLines","removeChild","pop","push","pmState","FreehandMarker","TextBlock","_text","renderText","boundingBox","_boundingBox","labelBackground","_labelBackground","textElement","_textElement","_color","fontFamily","_fontFamily","positionText","fontSize","_fontSize","units","offsetX","offsetY","DOMRect","step","wordWrap","prevWrappedText","setupTextElement","undefined","show","hide","showControlBox","hideControlBox","applyFontStyles","wrapText","found","span","textAnchor","stroke","strokeOpacity","getTextAspectRatio","textLines","longestLineChars","lines","split","boxAspectRatio","processedLines","Array","textAspectRatio","maxLineLength","Number","MAX_VALUE","longestLine","lastIndexOf","reminderLine","maxEnd","indexOf","substring","trim","processedText","lastChild","lineno","setTimeout","ts","textSize","_textSize","textBlock","self","getBBox","noOfLines","lineHeight","autoOffset","bgPadding","onTextSizeChanged","display","TextMarker","getDefaultText","DEFAULT_TEXT","padding","setColor","setFont","setFontSize","textSizeChanged","textBoundingBox","setTextBoundingBox","prevWidth","prevHeight","onSizeChanged","font","hideVisual","visibility","showVisual","textState","newFontSize","min","LineMarker","MarkerBaseEditor","creationStyle","_creationStyle","is","cls","_marker","overlayContainer","_overlayContainer","_state","isSelected","_isSelected","continuousCreation","_continuousCreation","adjustControlBox","stateChanged","dashes","properties","_controlBox","_markerType","markerType","select","deselect","pointerDown","pointerUp","manipulate","dblClick","cursor","manipulationStartState","JSON","stringify","console","log","target","onStateChanged","currentState","Grip","gripSize","fill","filter","child","ResizeGrip","PolygonMarkerEditor","defaultLength","manipulationStartX","manipulationStartY","controlBox","grips","setupControlBox","adjustControlGrips","createGrip","positionGrip","positionGrips","resize","grip","startCreation","finishCreation","addNewPointWhileCreating","activeGrip","find","at","pointerEvents","onMarkerCreated","activeGripIndex","selectorLineIndex","findIndex","splice","gripIndex","noOfMissingGrips","setTranslate","LinearMarkerEditor","manipulationStartX1","manipulationStartY1","manipulationStartX2","manipulationStartY2","addControlGrips","grip1","grip2","inState","RectangularBoxMarkerGrips","Map","findGripByVisual","gripVisual","values","getGrip","location","get","RotateGrip","oldFill","RectangularBoxMarkerBaseEditor","manipulationStartLeft","manipulationStartTop","manipulationStartWidth","manipulationStartHeight","CB_DISTANCE","controlGrips","disabledResizeGrips","disableRotation","_suppressMarkerCreateEvent","rotatorGrip","rotatedPoint","rotatedCenter","newX","newWidth","newY","newHeight","controlRect","rotatorGripLine","createRotateGrip","cx","cy","bottom","right","rotatorGripSize","rtop","rcx","adjustGripVisibility","ShapeOutlineMarkerEditor","UndoRedoManager","undoStack","redoStack","isUndoPossible","isRedoPossible","undoStepCount","redoStepCount","addUndoStep","stepData","parse","lastRedoStep","replaceLastUndoStep","getLastUndoStep","undo","lastStep","redo","FreehandMarkerEditor","TextBlockEditor","_width","textEditor","_height","_left","_top","textColor","_textColor","isInFocus","isSetupCompleted","createElement","getEditorUi","focus","setup","flexDirection","alignItems","justifyContent","overflow","textAlign","innerText","contentEditable","outline","whiteSpace","addEventListener","ev","stopPropagation","key","preventDefault","blur","cancelBubble","onTextChanged","onBlur","clipboardData","content","getData","selection","window","getSelection","rangeCount","deleteFromDocument","getRangeAt","insertNode","createTextNode","range","createRange","selectNodeContents","collapse","removeAllRanges","addRange","TextMarkerEditor","textBlockEditorContainer","_pointerDownTime","_pointerDownPoint","markerSizeChanged","textBlockEditor","showEditor","hideEditor","Date","now","Activator","addKey","product","keys","set","keyAddListeners","listener","addKeyAddListener","removeKeyAddListener","li","isLicensed","has","keyRegex","RegExp","test","MarkerArea","HTMLElement","targetWidth","_targetWidth","setMainCanvasSize","targetHeight","_targetHeight","currentMarkerEditor","_currentMarkerEditor","targetImage","_targetImage","addTargetImage","_zoomLevel","_canvasContainer","_contentContainer","_mainCanvas","setEditingTargetSize","scrollTo","clientWidth","clientHeight","panTo","prevPanPoint","mode","_isInitialized","_newMarkerOutline","markerEditors","editors","undoRedoManager","touchPoints","isDragging","connectedCallback","disconnectedCallback","createLayout","addMainCanvas","initOverlay","attachEvents","attachWindowEvents","detachEvents","detachWindowEvents","onCanvasPointerDown","onCanvasDblClick","onKeyUp","onPointerMove","onPointerOut","onPointerUp","addNewMarker","markerCreated","markerStateChanged","switchToSelectMode","showOutline","hideOutline","undoStep","redoStep","toggleLogo","addLogo","removeLogo","attachShadow","dispatchEvent","CustomEvent","detail","markerArea","position","flexGrow","flexShrink","touchAction","className","gridTemplateColumns","justifyItems","shadowRoot","gridColumnStart","gridRowStart","margin","_groupLayer","_editingTarget","_overlayContentContainer","img","naturalWidth","naturalHeight","src","mType","getMarkerTypeByName","markerEditor","setCurrentEditor","markerEditorType","Error","editor","newMarkerEditor","pointerType","hitMarker","m","clientX","clientY","localPoint","contains","size","hasAttribute","version","markers","stateCopy","markerState","editorType","scaleMarkers","preScaleSelectedMarker","_logoUI","link","href","Logo","positionLogo","offsetHeight","lastUndoState","type","options","removeEventListener","customElements","define","MarkerView","markerTypes","markerView"],"mappings":"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"}