@markerjs/markerjs3 3.0.0-alpha.3 → 3.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +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/ShapeMarkerBase.ts","../../src/core/FrameMarker.ts","../../src/core/LinearMarkerBase.ts","../../src/core/LineMarker.ts","../../src/core/ArrowMarker.ts","../../src/core/MeasurementMarker.ts","../../src/core/PolygonMarker.ts","../../src/core/FreehandMarker.ts","../../src/core/TextBlock.ts","../../src/core/TextMarker.ts","../../src/core/CoverMarker.ts","../../src/core/HighlightMarker.ts","../../src/core/CalloutMarker.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/editor/ShapeMarkerEditor.ts","../../src/editor/ArrowMarkerEditor.ts","../../src/editor/CalloutMarkerEditor.ts","../../src/MarkerArea.ts","../../src/editor.ts","../../src/MarkerView.ts","../../node_modules/tslib/tslib.es6.js","../../src/viewer.ts","../../src/Renderer.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.strokeWidth *= (scaleX + scaleY) / 2;\r\n\r\n this.setSize();\r\n }\r\n}\r\n","import { MarkerBaseState } from './MarkerBaseState';\r\nimport { ShapeOutlineMarkerBase } from './ShapeOutlineMarkerBase';\r\nimport { ShapeMarkerBaseState } from './ShapeMarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\nexport abstract class ShapeMarkerBase extends ShapeOutlineMarkerBase {\r\n public static title = 'Shape marker';\r\n\r\n protected _fillColor = 'transparent';\r\n public get fillColor() {\r\n return this._fillColor;\r\n }\r\n public set fillColor(value) {\r\n this._fillColor = value;\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['fill', this._fillColor]]);\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 createVisual(): void {\r\n super.createVisual();\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['fill', this._fillColor]]);\r\n }\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(): ShapeMarkerBaseState {\r\n const result: ShapeMarkerBaseState = Object.assign(\r\n {\r\n fillColor: this._fillColor,\r\n },\r\n super.getState(),\r\n );\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 rectState = state as ShapeMarkerBaseState;\r\n super.restoreState(state);\r\n\r\n this.fillColor = rectState.fillColor;\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 ['fill', 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(this.getPath(), [\r\n ['stroke', 'transparent'],\r\n ['stroke-width', Math.max(this.strokeWidth, 8).toString()],\r\n ]);\r\n this.visibleVisual = SvgHelper.createPath(this.getPath(), [\r\n ['stroke', this.strokeColor],\r\n ['fill', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-linejoin', 'round'],\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, [\r\n ['stroke', this.strokeColor],\r\n ]);\r\n SvgHelper.setAttributes(this.visibleVisual, [['fill', this.strokeColor]]);\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(): 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.strokeWidth *= (scaleX + scaleY) / 2;\r\n\r\n this.adjustVisual();\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 { ArrowMarkerState, ArrowType } from './ArrowMarkerState';\r\nimport { IPoint } from './IPoint';\r\nimport { LineMarker } from './LineMarker';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\n\r\nexport class ArrowMarker extends LineMarker {\r\n public static typeName = 'ArrowMarker';\r\n public static title = 'Arrow marker';\r\n\r\n private _arrowType: ArrowType = 'end';\r\n public get arrowType(): ArrowType {\r\n return this._arrowType;\r\n }\r\n public set arrowType(value: ArrowType) {\r\n this._arrowType = value;\r\n this.adjustVisual();\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n }\r\n\r\n protected getPath(): string {\r\n const arrowHeight = 10 + this.strokeWidth * 2;\r\n const arrowWidth = Math.min(\r\n Math.max(5, this.strokeWidth * 2),\r\n this.strokeWidth + 5,\r\n );\r\n const arrowDipFactor = 0.7; // arrow base \"bend factor\"\r\n\r\n const dx = this.x2 - this.x1;\r\n const dy = this.y2 - this.y1;\r\n const angle = Math.atan2(dy, dx);\r\n\r\n // Start arrow\r\n const startArrowBasePoint: IPoint = {\r\n x: this.x1 + arrowHeight * arrowDipFactor * Math.cos(angle),\r\n y: this.y1 + arrowHeight * arrowDipFactor * Math.sin(angle),\r\n };\r\n\r\n const startArrowTipBasePoint: IPoint = {\r\n x: this.x1 + arrowHeight * Math.cos(angle),\r\n y: this.y1 + arrowHeight * Math.sin(angle),\r\n };\r\n\r\n const startArrowSide1: IPoint = {\r\n x: startArrowTipBasePoint.x + arrowWidth * Math.sin(angle),\r\n y: startArrowTipBasePoint.y - arrowWidth * Math.cos(angle),\r\n };\r\n\r\n const startArrowSide2: IPoint = {\r\n x: startArrowTipBasePoint.x - arrowWidth * Math.sin(angle),\r\n y: startArrowTipBasePoint.y + arrowWidth * Math.cos(angle),\r\n };\r\n\r\n // End arrow\r\n const endArrowBasePoint: IPoint = {\r\n x: this.x2 - arrowHeight * arrowDipFactor * Math.cos(angle),\r\n y: this.y2 - arrowHeight * arrowDipFactor * Math.sin(angle),\r\n };\r\n\r\n const endArrowTipBasePoint: IPoint = {\r\n x: this.x2 - arrowHeight * Math.cos(angle),\r\n y: this.y2 - arrowHeight * Math.sin(angle),\r\n };\r\n\r\n const endArrowSide1: IPoint = {\r\n x: endArrowTipBasePoint.x + arrowWidth * Math.sin(angle),\r\n y: endArrowTipBasePoint.y - arrowWidth * Math.cos(angle),\r\n };\r\n\r\n const endArrowSide2: IPoint = {\r\n x: endArrowTipBasePoint.x - arrowWidth * Math.sin(angle),\r\n y: endArrowTipBasePoint.y + arrowWidth * Math.cos(angle),\r\n };\r\n\r\n const startSegment =\r\n this.arrowType === 'start' || this.arrowType === 'both'\r\n ? `M ${startArrowBasePoint.x} ${startArrowBasePoint.y}\r\n L ${startArrowSide1.x} ${startArrowSide1.y} L ${this.x1} ${this.y1} L ${startArrowSide2.x} ${startArrowSide2.y} L ${startArrowBasePoint.x} ${startArrowBasePoint.y}\r\n L ${startArrowBasePoint.x} ${startArrowBasePoint.y}`\r\n : `M ${this.x1} ${this.y1}`;\r\n\r\n const endSegment =\r\n this.arrowType === 'end' || this.arrowType === 'both'\r\n ? `L ${endArrowBasePoint.x} ${endArrowBasePoint.y} \r\n L ${endArrowSide1.x} ${endArrowSide1.y} L ${this.x2} ${this.y2} L ${endArrowSide2.x} ${endArrowSide2.y} L ${endArrowBasePoint.x} ${endArrowBasePoint.y} Z`\r\n : `L ${this.x2} ${this.y2}`;\r\n // svg path for the arrow\r\n const result = `${startSegment} ${endSegment}`;\r\n\r\n return result;\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n super.applyStrokeWidth();\r\n this.adjustVisual();\r\n }\r\n\r\n /**\r\n * Returns marker's state.\r\n */\r\n public getState(): ArrowMarkerState {\r\n const result: ArrowMarkerState = Object.assign(\r\n {\r\n arrowType: this.arrowType,\r\n },\r\n super.getState(),\r\n );\r\n result.typeName = ArrowMarker.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 const arrowState = state as ArrowMarkerState;\r\n this.arrowType = arrowState.arrowType;\r\n\r\n super.restoreState(state);\r\n }\r\n}\r\n","import { IPoint } from './IPoint';\r\nimport { LineMarker } from './LineMarker';\r\nimport { LinearMarkerBaseState } from './LinearMarkerBaseState';\r\n\r\nexport class MeasurementMarker extends LineMarker {\r\n public static typeName = 'MeasurementMarker';\r\n public static title = 'Measurement marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n }\r\n\r\n protected getPath(): string {\r\n const tipLength = 5 + this.strokeWidth * 3;\r\n\r\n const dx = this.x2 - this.x1;\r\n const dy = this.y2 - this.y1;\r\n const angle = Math.atan2(dy, dx);\r\n\r\n const startArrowSide1: IPoint = {\r\n x: this.x1 + tipLength * Math.sin(angle),\r\n y: this.y1 - tipLength * Math.cos(angle),\r\n };\r\n\r\n const startArrowSide2: IPoint = {\r\n x: this.x1 - tipLength * Math.sin(angle),\r\n y: this.y1 + tipLength * Math.cos(angle),\r\n };\r\n\r\n const endArrowSide1: IPoint = {\r\n x: this.x2 + tipLength * Math.sin(angle),\r\n y: this.y2 - tipLength * Math.cos(angle),\r\n };\r\n\r\n const endArrowSide2: IPoint = {\r\n x: this.x2 - tipLength * Math.sin(angle),\r\n y: this.y2 + tipLength * Math.cos(angle),\r\n };\r\n\r\n // svg path for the arrow\r\n const result = `M ${startArrowSide1.x} ${startArrowSide1.y}\r\n L ${startArrowSide2.x} ${startArrowSide2.y}\r\n M ${this.x1} ${this.y1}\r\n L ${this.x2} ${this.y2}\r\n M ${endArrowSide1.x} ${endArrowSide1.y}\r\n L ${endArrowSide2.x} ${endArrowSide2.y}\r\n `;\r\n\r\n return result;\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n super.applyStrokeWidth();\r\n this.adjustVisual();\r\n }\r\n\r\n /**\r\n * Returns marker's state.\r\n */\r\n public getState(): LinearMarkerBaseState {\r\n const result = super.getState();\r\n result.typeName = MeasurementMarker.typeName;\r\n\r\n return result;\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 this._textElement.style.userSelect = 'none';\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 =\r\n (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 (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 { SvgHelper } from './SvgHelper';\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 this.adjustVisual = this.adjustVisual.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.offsetX = this.padding;\r\n this.textBlock.offsetY = this.padding;\r\n\r\n this.textBlock.onTextSizeChanged = this.textSizeChanged;\r\n\r\n this.visual = SvgHelper.createGroup();\r\n this.visual.appendChild(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 adjustVisual(): void {\r\n this.setSize();\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 this.textBlock.offsetX = this.padding;\r\n this.textBlock.offsetY = this.padding;\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.adjustVisual();\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.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n // @todo for some reason causes wrong positioning in the Renderer\r\n // this.padding = this.padding * ((scaleX + scaleY) / 2);\r\n\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.adjustVisual();\r\n }\r\n}\r\n","import { ShapeMarkerBase } from './ShapeMarkerBase';\r\nimport { ShapeMarkerBaseState } from './ShapeMarkerBaseState';\r\n\r\nexport class CoverMarker extends ShapeMarkerBase {\r\n /**\r\n * String type name of the marker type.\r\n */\r\n public static typeName = 'CoverMarker';\r\n\r\n /**\r\n * Marker type title (display name) used for accessibility and other attributes.\r\n */\r\n public static title = 'Cover marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.fillColor = '#000000';\r\n this.strokeColor = 'transparent';\r\n this.strokeWidth = 0;\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(): ShapeMarkerBaseState {\r\n const result = super.getState();\r\n result.typeName = CoverMarker.typeName;\r\n return result;\r\n }\r\n}\r\n","import { ShapeMarkerBase } from './ShapeMarkerBase';\r\nimport { ShapeMarkerBaseState } from './ShapeMarkerBaseState';\r\n\r\nexport class HighlightMarker extends ShapeMarkerBase {\r\n /**\r\n * String type name of the marker type.\r\n */\r\n public static typeName = 'HighlightMarker';\r\n\r\n /**\r\n * Marker type title (display name) used for accessibility and other attributes.\r\n */\r\n public static title = 'Highlight marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.fillColor = '#ffff00';\r\n this.opacity = 0.5;\r\n this.strokeColor = 'transparent';\r\n this.strokeWidth = 0;\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(): ShapeMarkerBaseState {\r\n const result = super.getState();\r\n result.typeName = HighlightMarker.typeName;\r\n return result;\r\n }\r\n}\r\n","import { CalloutMarkerState } from './CalloutMarkerState';\r\nimport { IPoint } from './IPoint';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\nimport { TextMarker } from './TextMarker';\r\n\r\nexport class CalloutMarker extends TextMarker {\r\n public static typeName = 'CalloutMarker';\r\n\r\n public static title = 'Callout marker';\r\n\r\n private _tipPosition: IPoint = { x: 0, y: 0 };\r\n public get tipPosition(): IPoint {\r\n return this._tipPosition;\r\n }\r\n public set tipPosition(value: IPoint) {\r\n this._tipPosition = value;\r\n this.adjustVisual();\r\n }\r\n\r\n private tipBase1Position: IPoint = { x: 0, y: 0 };\r\n private tipBase2Position: IPoint = { x: 0, y: 0 };\r\n\r\n private _calloutVisual: SVGPathElement = SvgHelper.createPath('M0,0');\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.color = '#ffffff';\r\n this.fillColor = '#ff0000';\r\n this.strokeColor = '#ffffff';\r\n this.strokeWidth = 3;\r\n this.padding = 20;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.getPath = this.getPath.bind(this);\r\n this.setTipPoints = this.setTipPoints.bind(this);\r\n }\r\n\r\n protected getPath(): string {\r\n const r = 5;\r\n this.setTipPoints();\r\n\r\n const result = `M ${r} 0 \r\n ${\r\n this.tipBase1Position.y === 0\r\n ? `H ${this.tipBase1Position.x} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase2Position.x} 0`\r\n : ''\r\n }\r\n H ${this.width - r} \r\n A ${r} ${r} 0 0 1 ${this.width} ${r} \r\n ${\r\n this.tipBase1Position.x === this.width\r\n ? `V ${this.tipBase1Position.y} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase2Position.x} ${this.tipBase2Position.y}`\r\n : ''\r\n }\r\n V ${this.height - r} \r\n A ${r} ${r} 0 0 1 ${this.width - r} ${this.height} \r\n ${\r\n this.tipBase1Position.y === this.height\r\n ? `H ${this.tipBase2Position.x} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase1Position.x} ${this.height}`\r\n : ''\r\n }\r\n H ${r}\r\n A ${r} ${r} 0 0 1 0 ${this.height - r} \r\n ${\r\n this.tipBase1Position.x === 0\r\n ? `V ${this.tipBase2Position.y} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase1Position.x} ${this.tipBase1Position.y}`\r\n : ''\r\n }\r\n V ${r} \r\n A ${r} ${r} 0 0 1 ${r} 0 \r\n Z`;\r\n\r\n return result;\r\n }\r\n\r\n private setTipPoints() {\r\n let offset = Math.min(this.height / 2, 15);\r\n let baseWidth = this.height / 5;\r\n\r\n const cornerAngle = Math.atan(this.height / 2 / (this.width / 2));\r\n if (\r\n this.tipPosition.x < this.width / 2 &&\r\n this.tipPosition.y < this.height / 2\r\n ) {\r\n // top left\r\n const tipAngle = Math.atan(\r\n (this.height / 2 - this.tipPosition.y) /\r\n (this.width / 2 - this.tipPosition.x),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = { x: offset, y: 0 };\r\n this.tipBase2Position = { x: offset + baseWidth, y: 0 };\r\n } else {\r\n this.tipBase1Position = { x: 0, y: offset };\r\n this.tipBase2Position = { x: 0, y: offset + baseWidth };\r\n }\r\n } else if (\r\n this.tipPosition.x >= this.width / 2 &&\r\n this.tipPosition.y < this.height / 2\r\n ) {\r\n // top right\r\n const tipAngle = Math.atan(\r\n (this.height / 2 - this.tipPosition.y) /\r\n (this.tipPosition.x - this.width / 2),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = { x: this.width - offset - baseWidth, y: 0 };\r\n this.tipBase2Position = { x: this.width - offset, y: 0 };\r\n } else {\r\n this.tipBase1Position = { x: this.width, y: offset };\r\n this.tipBase2Position = { x: this.width, y: offset + baseWidth };\r\n }\r\n } else if (\r\n this.tipPosition.x >= this.width / 2 &&\r\n this.tipPosition.y >= this.height / 2\r\n ) {\r\n // bottom right\r\n const tipAngle = Math.atan(\r\n (this.tipPosition.y - this.height / 2) /\r\n (this.tipPosition.x - this.width / 2),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = {\r\n x: this.width - offset - baseWidth,\r\n y: this.height,\r\n };\r\n this.tipBase2Position = { x: this.width - offset, y: this.height };\r\n } else {\r\n this.tipBase1Position = {\r\n x: this.width,\r\n y: this.height - offset - baseWidth,\r\n };\r\n this.tipBase2Position = { x: this.width, y: this.height - offset };\r\n }\r\n } else {\r\n // bottom left\r\n const tipAngle = Math.atan(\r\n (this.tipPosition.y - this.height / 2) /\r\n (this.width / 2 - this.tipPosition.x),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = { x: offset, y: this.height };\r\n this.tipBase2Position = { x: offset + baseWidth, y: this.height };\r\n } else {\r\n this.tipBase1Position = { x: 0, y: this.height - offset - baseWidth };\r\n this.tipBase2Position = { x: 0, y: this.height - offset };\r\n }\r\n }\r\n }\r\n\r\n public createVisual(): void {\r\n super.createVisual();\r\n\r\n this._tipPosition = {\r\n // x: -50,\r\n // x: this.width + 50,\r\n x: this.width / 4,\r\n // y: this.height / 4,\r\n // y: -50,\r\n y: this.height + 20,\r\n };\r\n\r\n this._calloutVisual = SvgHelper.createPath(this.getPath(), [\r\n ['fill', this._fillColor],\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.visual?.insertBefore(this._calloutVisual, this.textBlock.textElement);\r\n }\r\n\r\n public adjustVisual(): void {\r\n super.adjustVisual();\r\n if (this._calloutVisual) {\r\n SvgHelper.setAttributes(this._calloutVisual, [\r\n ['d', this.getPath()],\r\n ['fill', this._fillColor],\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 ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this._calloutVisual === el) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public getState(): CalloutMarkerState {\r\n const result: CalloutMarkerState = Object.assign(\r\n {\r\n tipPosition: this.tipPosition,\r\n },\r\n super.getState(),\r\n );\r\n\r\n result.typeName = CalloutMarker.typeName;\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n const calloutState = state as CalloutMarkerState;\r\n super.restoreState(state);\r\n this._tipPosition = calloutState.tipPosition;\r\n\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n this._tipPosition = {\r\n x: this._tipPosition.x * scaleX,\r\n y: this._tipPosition.y * scaleY,\r\n };\r\n\r\n this.adjustVisual();\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 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 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 protected isMultiSelected = false;\r\n /**\r\n * Selects this marker and displays appropriate selected marker UI.\r\n */\r\n public select(multi = false): void {\r\n this.isMultiSelected = multi;\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 (this.manipulationStartState != currentState) {\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","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 protected manipulationBox: 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(this.isMultiSelected);\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(\r\n (l) => l === target,\r\n );\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 this.manipulationBox = SvgHelper.createGroup();\r\n this.controlBox.appendChild(this.manipulationBox);\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.manipulationBox.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.manipulationBox.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(multi = false): void {\r\n super.select(multi);\r\n this.adjustControlBox();\r\n this.manipulationBox.style.display = multi ? 'none' : '';\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 protected manipulationBox: 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 (this.grip1?.ownsTarget(el) || this.grip2?.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.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(this.isMultiSelected);\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 (\r\n this.state === 'creating' &&\r\n Math.abs(this.marker.x1 - this.marker.x2) < 10 &&\r\n Math.abs(this.marker.y1 - this.marker.y2) < 10\r\n ) {\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 =\r\n this.manipulationStartX1 + point.x - this.manipulationStartX;\r\n this.marker.y1 =\r\n this.manipulationStartY1 + point.y - this.manipulationStartY;\r\n this.marker.x2 =\r\n this.manipulationStartX2 + point.x - this.manipulationStartX;\r\n this.marker.y2 =\r\n 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 this.manipulationBox = SvgHelper.createGroup();\r\n this.controlBox.appendChild(this.manipulationBox);\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.manipulationBox.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(\r\n this.grip1.visual,\r\n this.marker.x1 - gripSize / 2,\r\n this.marker.y1 - gripSize / 2,\r\n );\r\n this.positionGrip(\r\n this.grip2.visual,\r\n this.marker.x2 - gripSize / 2,\r\n this.marker.y2 - 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(multi = false): void {\r\n super.select(multi);\r\n this.adjustControlBox();\r\n this.manipulationBox.style.display = multi ? 'none' : '';\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 protected manipulationBox = 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 =\r\n new RectangularBoxMarkerGrips();\r\n protected disabledResizeGrips: GripLocation[] = [];\r\n private rotatorGrip?: RotateGrip;\r\n protected 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 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(this.isMultiSelected);\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(multi = false): void {\r\n super.select(multi);\r\n this.adjustControlBox();\r\n this.manipulationBox.style.display = multi ? 'none' : '';\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.manipulationBox = SvgHelper.createGroup();\r\n this.controlBox.appendChild(this.manipulationBox);\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 =\r\n 'drop-shadow(rgba(255, 255, 255, 0.7) 0px 2px 0px)';\r\n\r\n this.manipulationBox.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 protected addControlGrips() {\r\n for (const grip of this.controlGrips.grips.values()) {\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.manipulationBox.appendChild(grip.visual);\r\n\r\n this.manipulationBox.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.manipulationBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n protected 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(\r\n this.controlGrips.getGrip('topright').visual,\r\n right,\r\n top,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('leftcenter').visual,\r\n left,\r\n cy,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('rightcenter').visual,\r\n right,\r\n cy,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('bottomleft').visual,\r\n left,\r\n bottom,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('bottomcenter').visual,\r\n cx,\r\n bottom,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('bottomright').visual,\r\n right,\r\n bottom,\r\n );\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 protected 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 private _bgColor = 'transparent';\r\n public get bgColor() {\r\n return this._bgColor;\r\n }\r\n public set bgColor(value) {\r\n this._bgColor = value;\r\n this.textEditor.style.backgroundColor = this.bgColor;\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, TextMarker } from '../core';\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 this.textBlockEditor.textColor = this.marker.color;\r\n this.textBlockEditor.bgColor = this.marker.fillColor;\r\n this.textBlockEditor.fontFamily = this.marker.fontFamily;\r\n this.textBlockEditor.fontSize = `${this.marker.fontSize.value}${this.marker.fontSize.units}`;\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 { ShapeMarkerBase } from '../core';\r\nimport { ShapeOutlineMarkerEditor } from './ShapeOutlineMarkerEditor';\r\n\r\nexport class ShapeMarkerEditor<\r\n TMarkerType extends ShapeMarkerBase = ShapeMarkerBase,\r\n> extends ShapeOutlineMarkerEditor<TMarkerType> {}\r\n","import { ArrowMarker, ArrowType } from '../core';\r\nimport { LinearMarkerEditor } from './LinearMarkerEditor';\r\n\r\nexport class ArrowMarkerEditor<\r\n TMarkerType extends ArrowMarker = ArrowMarker,\r\n> extends LinearMarkerEditor<TMarkerType> {\r\n public set arrowType(value: ArrowType) {\r\n this.marker.arrowType = value;\r\n }\r\n\r\n public get arrowType(): ArrowType {\r\n return this.marker.arrowType;\r\n }\r\n}\r\n","import { CalloutMarker, IPoint, SvgHelper } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { ResizeGrip } from './ResizeGrip';\r\nimport { TextMarkerEditor } from './TextMarkerEditor';\r\n\r\nexport class CalloutMarkerEditor<\r\n TMarkerType extends CalloutMarker = CalloutMarker,\r\n> extends TextMarkerEditor<TMarkerType> {\r\n private tipGrip?: ResizeGrip;\r\n\r\n private manipulationStartTipPositionX = 0;\r\n private manipulationStartTipPositionY = 0;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n }\r\n\r\n protected addControlGrips(): void {\r\n this.tipGrip = this.createTipGrip();\r\n\r\n super.addControlGrips();\r\n }\r\n\r\n private createTipGrip(): ResizeGrip {\r\n const grip = new ResizeGrip();\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.manipulationBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n protected positionGrips() {\r\n super.positionGrips();\r\n\r\n if (this.tipGrip) {\r\n const tipGripSize = this.tipGrip.gripSize ?? 0;\r\n this.positionGrip(\r\n this.tipGrip.visual,\r\n this.marker.tipPosition.x - tipGripSize / 2,\r\n this.marker.tipPosition.y - tipGripSize / 2,\r\n );\r\n }\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this.tipGrip?.ownsTarget(el)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public pointerDown(point: IPoint, target?: EventTarget): void {\r\n super.pointerDown(point, target);\r\n\r\n this.manipulationStartTipPositionX = this.marker.tipPosition.x;\r\n this.manipulationStartTipPositionY = this.marker.tipPosition.y;\r\n\r\n if (\r\n this.tipGrip !== undefined &&\r\n target !== undefined &&\r\n this.tipGrip.ownsTarget(target)\r\n ) {\r\n this.activeGrip = this.tipGrip;\r\n this._state = 'resize';\r\n }\r\n }\r\n\r\n protected resize(point: IPoint): void {\r\n const newX =\r\n this.manipulationStartTipPositionX + point.x - this.manipulationStartX;\r\n const newY =\r\n this.manipulationStartTipPositionY + point.y - this.manipulationStartY;\r\n\r\n if (this.activeGrip === this.tipGrip) {\r\n this.marker.tipPosition = { x: newX, y: newY };\r\n this.adjustControlBox();\r\n } else {\r\n super.resize(point);\r\n }\r\n }\r\n}\r\n","import {\r\n AnnotationState,\r\n CoverMarker,\r\n FrameMarker,\r\n FreehandMarker,\r\n HighlightMarker,\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\nimport { ShapeMarkerEditor } from './editor/ShapeMarkerEditor';\r\nimport { ArrowMarker } from './core/ArrowMarker';\r\nimport { ArrowMarkerEditor } from './editor/ArrowMarkerEditor';\r\nimport { MeasurementMarker } from './core/MeasurementMarker';\r\nimport { CalloutMarker } from './core/CalloutMarker';\r\nimport { CalloutMarkerEditor } from './editor/CalloutMarkerEditor';\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 private _selectedMarkerEditors: MarkerBaseEditor[] = [];\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(\r\n FreehandMarker,\r\n FreehandMarkerEditor<FreehandMarker>,\r\n );\r\n this.markerEditors.set(TextMarker, TextMarkerEditor<TextMarker>);\r\n this.markerEditors.set(CoverMarker, ShapeMarkerEditor<CoverMarker>);\r\n this.markerEditors.set(HighlightMarker, ShapeMarkerEditor<HighlightMarker>);\r\n this.markerEditors.set(ArrowMarker, ArrowMarkerEditor<ArrowMarker>);\r\n this.markerEditors.set(\r\n MeasurementMarker,\r\n LinearMarkerEditor<MeasurementMarker>,\r\n );\r\n this.markerEditors.set(CalloutMarker, CalloutMarkerEditor<CalloutMarker>);\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 this.deleteMarker = this.deleteMarker.bind(this);\r\n this.deleteSelectedMarkers = this.deleteSelectedMarkers.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.deselectEditor();\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 (editor.continuousCreation) {\r\n const newMarkerEditor = this.createMarker(editor.marker.typeName);\r\n if (\r\n editor.is(FreehandMarkerEditor) &&\r\n newMarkerEditor?.is(FreehandMarkerEditor)\r\n ) {\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 deleteMarker(markerEditor: MarkerBaseEditor): void {\r\n if (this.editors.indexOf(markerEditor) >= 0) {\r\n this.addUndoStep();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerbeforedelete', {\r\n detail: { markerArea: this, markerEditor: markerEditor },\r\n }),\r\n );\r\n this._mainCanvas?.removeChild(markerEditor.container);\r\n markerEditor.dispose();\r\n this.editors.splice(this.editors.indexOf(markerEditor), 1);\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerdelete', {\r\n detail: { markerArea: this, markerEditor: markerEditor },\r\n }),\r\n );\r\n }\r\n }\r\n\r\n public deleteSelectedMarkers() {\r\n this._selectedMarkerEditors.forEach((m) => this.deleteMarker(m));\r\n this._selectedMarkerEditors.splice(0);\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._selectedMarkerEditors.push(this._currentMarkerEditor);\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 public selectEditor(editor: MarkerBaseEditor): void {\r\n if (this._selectedMarkerEditors.indexOf(editor) < 0) {\r\n if (this._selectedMarkerEditors.length > 0) {\r\n this._selectedMarkerEditors[0].select(true);\r\n }\r\n this._selectedMarkerEditors.push(editor);\r\n editor.select(true);\r\n }\r\n }\r\n\r\n public deselectEditor(editor?: MarkerBaseEditor): void {\r\n if (editor === undefined) {\r\n this._selectedMarkerEditors.forEach((m) => m.deselect());\r\n this._selectedMarkerEditors.splice(0);\r\n } else {\r\n const index = this._selectedMarkerEditors.indexOf(editor);\r\n if (index >= 0) {\r\n this._selectedMarkerEditors.splice(index, 1);\r\n editor.deselect();\r\n }\r\n }\r\n }\r\n\r\n private touchPoints = 0;\r\n private isDragging = false;\r\n private isSelecting = false;\r\n\r\n private _marqueeSelectOutline: SVGRectElement = SvgHelper.createRect(0, 0, [\r\n ['stroke', '#333'],\r\n ['stroke-width', '0.5'],\r\n ['stroke-dasharray', '5 5'],\r\n ['fill', 'transparent'],\r\n ['pointer-events', 'none'],\r\n ]);\r\n private _marqueeSelectRect = new DOMRect(0, 0, 0, 0);\r\n\r\n private _manipulationStartX = 0;\r\n private _manipulationStartY = 0;\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._manipulationStartX = ev.clientX;\r\n this._manipulationStartY = ev.clientY;\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 localPoint = SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n );\r\n const hitMarker = this.editors.find((m) => m.ownsTarget(ev.target));\r\n if (hitMarker !== undefined) {\r\n this.isDragging = true;\r\n if (ev.shiftKey) {\r\n this.selectEditor(hitMarker);\r\n } else if (!hitMarker.isSelected) {\r\n this.deselectEditor();\r\n this.setCurrentEditor(hitMarker);\r\n }\r\n this._selectedMarkerEditors.forEach((m) =>\r\n m.pointerDown(localPoint, ev.target ?? undefined),\r\n );\r\n } else {\r\n this.setCurrentEditor();\r\n this.deselectEditor();\r\n this.isSelecting = true;\r\n this.isDragging = true;\r\n\r\n // marquee select\r\n this._marqueeSelectRect.x = localPoint.x;\r\n this._marqueeSelectRect.y = localPoint.y;\r\n this._marqueeSelectRect.width = 0;\r\n this._marqueeSelectRect.height = 0;\r\n SvgHelper.setAttributes(this._marqueeSelectOutline, [\r\n ['x', localPoint.x.toString()],\r\n ['y', localPoint.y.toString()],\r\n ['width', '0'],\r\n ['height', '0'],\r\n ]);\r\n if (\r\n this._groupLayer &&\r\n !this._groupLayer.contains(this._marqueeSelectOutline)\r\n ) {\r\n this._groupLayer.appendChild(this._marqueeSelectOutline);\r\n }\r\n\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 (\r\n this.touchPoints === 1 ||\r\n (ev.pointerType !== 'touch' && this.isDragging)\r\n ) {\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 if (\r\n this._currentMarkerEditor !== undefined ||\r\n this._selectedMarkerEditors.length > 0\r\n ) {\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 (\r\n this._currentMarkerEditor !== undefined ||\r\n this._selectedMarkerEditors.length > 0\r\n ) {\r\n this.showOutline(localPoint);\r\n\r\n if (this._selectedMarkerEditors.length > 0) {\r\n this._selectedMarkerEditors.forEach((m) =>\r\n m.manipulate(localPoint),\r\n );\r\n } else {\r\n this._currentMarkerEditor?.manipulate(localPoint);\r\n }\r\n } else if (this.zoomLevel > 1) {\r\n this.panTo({ x: ev.clientX, y: ev.clientY });\r\n }\r\n } else if (this.isSelecting) {\r\n // adjust marquee\r\n const localManipulationStart = SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n this._manipulationStartX,\r\n this._manipulationStartY,\r\n this.zoomLevel,\r\n );\r\n\r\n this._marqueeSelectRect.x = Math.min(\r\n localPoint.x,\r\n localManipulationStart.x,\r\n );\r\n this._marqueeSelectRect.y = Math.min(\r\n localPoint.y,\r\n localManipulationStart.y,\r\n );\r\n this._marqueeSelectRect.width =\r\n Math.abs(ev.clientX - this._manipulationStartX) / this.zoomLevel;\r\n this._marqueeSelectRect.height =\r\n Math.abs(ev.clientY - this._manipulationStartY) / this.zoomLevel;\r\n\r\n SvgHelper.setAttributes(this._marqueeSelectOutline, [\r\n ['x', `${this._marqueeSelectRect.x}`],\r\n ['y', `${this._marqueeSelectRect.y}`],\r\n ['width', `${this._marqueeSelectRect.width}`],\r\n ['height', `${this._marqueeSelectRect.height}`],\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 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 if (this._selectedMarkerEditors.length > 1) {\r\n this._selectedMarkerEditors.forEach((m) => m.pointerUp(localPoint));\r\n } else {\r\n this._currentMarkerEditor.pointerUp(localPoint);\r\n }\r\n\r\n this.hideOutline();\r\n } else if (this.isSelecting) {\r\n // finish marquee selection\r\n if (\r\n this._groupLayer &&\r\n this._groupLayer.contains(this._marqueeSelectOutline)\r\n ) {\r\n this._groupLayer.removeChild(this._marqueeSelectOutline);\r\n }\r\n this.finishMarqueeSelection();\r\n }\r\n }\r\n this.isDragging = false;\r\n this.isSelecting = false;\r\n this.addUndoStep();\r\n }\r\n\r\n private finishMarqueeSelection() {\r\n this.deselectEditor();\r\n\r\n this.editors.forEach((m) => {\r\n const markerRect = m.marker.container.getBBox();\r\n if (\r\n markerRect.x <\r\n this._marqueeSelectRect.x + this._marqueeSelectRect.width &&\r\n markerRect.x + markerRect.width > this._marqueeSelectRect.x &&\r\n markerRect.y <\r\n this._marqueeSelectRect.y + this._marqueeSelectRect.height &&\r\n markerRect.y + markerRect.height > this._marqueeSelectRect.y\r\n ) {\r\n this.selectEditor(m);\r\n }\r\n });\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 ||\r\n stateCopy.height !== this.targetHeight)\r\n ) {\r\n this.scaleMarkers(\r\n this.targetWidth / stateCopy.width,\r\n this.targetHeight / stateCopy.height,\r\n );\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('MJS3E') && !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 { ShapeMarkerEditor } from './editor/ShapeMarkerEditor';\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\nexport { ArrowMarkerEditor } from './editor/ArrowMarkerEditor';\r\nexport { CalloutMarkerEditor } from './editor/CalloutMarkerEditor';\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 {\r\n AnnotationState,\r\n CoverMarker,\r\n FrameMarker,\r\n FreehandMarker,\r\n HighlightMarker,\r\n MarkerBase,\r\n PolygonMarker,\r\n SvgHelper,\r\n TextMarker,\r\n LineMarker,\r\n MeasurementMarker,\r\n ArrowMarker,\r\n} from './core';\r\nimport { Activator } from './core/Activator';\r\n\r\nimport Logo from './assets/markerjs-logo-m.svg';\r\nimport { CalloutMarker } from './core/CalloutMarker';\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\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 (this._canvasContainer && this._contentContainer && this._mainCanvas) {\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,\r\n LineMarker,\r\n ArrowMarker,\r\n MeasurementMarker,\r\n PolygonMarker,\r\n FreehandMarker,\r\n TextMarker,\r\n CoverMarker,\r\n HighlightMarker,\r\n CalloutMarker,\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(markerType: typeof MarkerBase): 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 ||\r\n stateCopy.height !== this.targetHeight)\r\n ) {\r\n this.scaleMarkers(\r\n this.targetWidth / stateCopy.width,\r\n this.targetHeight / stateCopy.height,\r\n );\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('MJS3V') && !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 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","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n function next() {\r\n while (env.stack.length) {\r\n var rec = env.stack.pop();\r\n try {\r\n var result = rec.dispose && rec.dispose.call(rec.value);\r\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\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","import {\r\n AnnotationState,\r\n CoverMarker,\r\n FrameMarker,\r\n FreehandMarker,\r\n HighlightMarker,\r\n MarkerBase,\r\n PolygonMarker,\r\n SvgHelper,\r\n TextMarker,\r\n LineMarker,\r\n ArrowMarker,\r\n MeasurementMarker,\r\n} from './core';\r\nimport { CalloutMarker } from './core/CalloutMarker';\r\n\r\nexport class Renderer {\r\n private _mainCanvas?: SVGSVGElement;\r\n\r\n private _editingTarget?: HTMLImageElement;\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 _targetImageLoaded = false;\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._targetImageLoaded = false;\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 _isInitialized = false;\r\n\r\n /**\r\n * Whether the image should be rendered at the original (natural) target image size.\r\n */\r\n public naturalSize = false;\r\n /**\r\n * Rendered image type (`image/png`, `image/jpeg`, etc.).\r\n */\r\n public imageType = 'image/png';\r\n /**\r\n * For formats that support it, specifies rendering quality.\r\n *\r\n * In the case of `image/jpeg` you can specify a value between 0 and 1 (lowest to highest quality).\r\n *\r\n * @type {number} - image rendering quality (0..1)\r\n */\r\n public imageQuality?: number;\r\n /**\r\n * When set to true, only the marker layer without the original image will be rendered.\r\n */\r\n public markersOnly = false;\r\n\r\n /**\r\n * When set and {@linkcode naturalSize} is `false` sets the width of the rendered image.\r\n *\r\n * Both `width` and `height` have to be set for this to take effect.\r\n */\r\n public width?: number;\r\n /**\r\n * When set and {@linkcode naturalSize} is `false` sets the height of the rendered image.\r\n *\r\n * Both `width` and `height` have to be set for this to take effect.\r\n */\r\n public height?: number;\r\n\r\n constructor() {\r\n this.markerTypes = [\r\n FrameMarker,\r\n LineMarker,\r\n ArrowMarker,\r\n MeasurementMarker,\r\n PolygonMarker,\r\n FreehandMarker,\r\n TextMarker,\r\n CoverMarker,\r\n HighlightMarker,\r\n CalloutMarker,\r\n ];\r\n\r\n this.init = this.init.bind(this);\r\n\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.addNewMarker = this.addNewMarker.bind(this);\r\n\r\n this.restoreState = this.restoreState.bind(this);\r\n this.scaleMarkers = this.scaleMarkers.bind(this);\r\n }\r\n\r\n private init() {\r\n this.addMainCanvas();\r\n this._isInitialized = true;\r\n if (this.targetImage !== undefined) {\r\n this.addTargetImage();\r\n }\r\n this.setMainCanvasSize();\r\n }\r\n\r\n private addMainCanvas() {\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\r\n // text isn't sized correctly without adding to the DOM\r\n this._mainCanvas.style.visibility = 'hidden';\r\n document.body.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}px`;\r\n this._mainCanvas.style.height = `${this._targetHeight}px`;\r\n this._mainCanvas.setAttribute('width', `${this._targetWidth}`);\r\n this._mainCanvas.setAttribute('height', `${this._targetHeight}`);\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;\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 }\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._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 = img.naturalWidth;\r\n this._targetHeight = 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._targetImageLoaded = true;\r\n\r\n this.setMainCanvasSize();\r\n }\r\n });\r\n this._editingTarget.style.visibility = 'hidden';\r\n this._editingTarget.src = this.targetImage.src;\r\n\r\n // this._canvasContainer.insertBefore(this._editingTarget, this._mainCanvas);\r\n document.body.appendChild(this._editingTarget);\r\n }\r\n }\r\n\r\n private addNewMarker(markerType: typeof MarkerBase): 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 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 restoreState(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 ||\r\n stateCopy.height !== this.targetHeight)\r\n ) {\r\n this.scaleMarkers(\r\n this.targetWidth / stateCopy.width,\r\n this.targetHeight / stateCopy.height,\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 public async rasterize(\r\n state: AnnotationState,\r\n targetCanvas?: HTMLCanvasElement,\r\n ): Promise<string> {\r\n if (!this.naturalSize) {\r\n this._targetWidth = state.width;\r\n this._targetHeight = state.height;\r\n }\r\n\r\n this.init();\r\n\r\n if (this._mainCanvas === undefined || this.targetImage === undefined) {\r\n throw new Error('Not properly initialized.');\r\n }\r\n\r\n let counter = 0;\r\n while (!this._targetImageLoaded && counter++ < 100) {\r\n // wait for the target image to load\r\n await new Promise((r) => setTimeout(r, 100));\r\n }\r\n\r\n this.restoreState(state);\r\n\r\n const canvas =\r\n targetCanvas !== undefined\r\n ? targetCanvas\r\n : document.createElement('canvas');\r\n\r\n if (this.targetImage === null) {\r\n this.markersOnly = true;\r\n this.naturalSize = false;\r\n }\r\n\r\n const markerImageCopy = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'svg',\r\n );\r\n markerImageCopy.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n markerImageCopy.setAttribute(\r\n 'width',\r\n this._mainCanvas.width.baseVal.valueAsString,\r\n );\r\n markerImageCopy.setAttribute(\r\n 'height',\r\n this._mainCanvas.height.baseVal.valueAsString,\r\n );\r\n markerImageCopy.setAttribute(\r\n 'viewBox',\r\n '0 0 ' +\r\n this._mainCanvas.viewBox.baseVal.width.toString() +\r\n ' ' +\r\n this._mainCanvas.viewBox.baseVal.height.toString(),\r\n );\r\n markerImageCopy.innerHTML = this._mainCanvas.innerHTML;\r\n\r\n if (this.naturalSize === true) {\r\n // scale to full image size\r\n markerImageCopy.width.baseVal.value = this.targetImage.naturalWidth;\r\n markerImageCopy.height.baseVal.value = this.targetImage.naturalHeight;\r\n } else if (this.width !== undefined && this.height !== undefined) {\r\n // scale to specific dimensions\r\n markerImageCopy.width.baseVal.value = this.width;\r\n markerImageCopy.height.baseVal.value = this.height;\r\n }\r\n\r\n canvas.width = markerImageCopy.width.baseVal.value;\r\n canvas.height = markerImageCopy.height.baseVal.value;\r\n\r\n const data = markerImageCopy.outerHTML;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (ctx === null) {\r\n throw new Error('Canvas 2D context is not available.');\r\n }\r\n\r\n if (this.markersOnly !== true) {\r\n ctx.drawImage(this.targetImage, 0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n const DOMURL = window.URL; // || window.webkitURL || window;\r\n\r\n const img = new Image(canvas.width, canvas.height);\r\n img.setAttribute('crossOrigin', 'anonymous');\r\n\r\n const blob = new Blob([data], { type: 'image/svg+xml' });\r\n\r\n const url = DOMURL.createObjectURL(blob);\r\n\r\n let result = '';\r\n img.onload = () => {\r\n ctx.drawImage(img, 0, 0);\r\n DOMURL.revokeObjectURL(url);\r\n\r\n result = canvas.toDataURL(this.imageType, this.imageQuality);\r\n };\r\n\r\n img.src = url;\r\n\r\n counter = 0;\r\n while (!result && counter++ < 100) {\r\n // wait for the image to load\r\n await new Promise((r) => setTimeout(r, 100));\r\n }\r\n\r\n if (this._editingTarget) {\r\n document.body.removeChild(this._editingTarget);\r\n }\r\n\r\n // remove the helper main canvas from the page\r\n document.body.removeChild(this._mainCanvas);\r\n\r\n return result;\r\n }\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","ShapeMarkerBase","rectState","FrameMarker","result","LinearMarkerBase","visibleVisual","selectorVisual","max","lmbState","LineMarker","ArrowMarker","arrowType","_arrowType","arrowHeight","arrowWidth","min","arrowDipFactor","dx","dy","angle","atan2","startArrowBasePoint","cos","sin","startArrowTipBasePoint","startArrowSide1","startArrowSide2","endArrowBasePoint","endArrowTipBasePoint","endArrowSide1","endArrowSide2","arrowState","MeasurementMarker","tipLength","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","userSelect","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","CoverMarker","HighlightMarker","CalloutMarker","tipPosition","_tipPosition","tipBase1Position","tipBase2Position","_calloutVisual","setTipPoints","offset","baseWidth","cornerAngle","calloutState","MarkerBaseEditor","creationStyle","_creationStyle","is","cls","_marker","overlayContainer","_overlayContainer","_state","isSelected","_isSelected","continuousCreation","_continuousCreation","adjustControlBox","stateChanged","dashes","properties","_controlBox","isMultiSelected","_markerType","markerType","select","deselect","pointerDown","pointerUp","manipulate","dblClick","multi","cursor","manipulationStartState","JSON","stringify","target","onStateChanged","currentState","console","log","Grip","gripSize","fill","filter","child","ResizeGrip","PolygonMarkerEditor","defaultLength","manipulationStartX","manipulationStartY","controlBox","manipulationBox","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","bgColor","_bgColor","backgroundColor","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","ShapeMarkerEditor","ArrowMarkerEditor","CalloutMarkerEditor","manipulationStartTipPositionX","manipulationStartTipPositionY","tipGrip","createTipGrip","tipGripSize","MarkerArea","HTMLElement","targetWidth","_targetWidth","setMainCanvasSize","targetHeight","_targetHeight","currentMarkerEditor","_currentMarkerEditor","targetImage","_targetImage","addTargetImage","_zoomLevel","_canvasContainer","_contentContainer","_mainCanvas","setEditingTargetSize","scrollTo","clientWidth","clientHeight","panTo","prevPanPoint","mode","_isInitialized","_selectedMarkerEditors","_newMarkerOutline","markerEditors","editors","undoRedoManager","touchPoints","isDragging","isSelecting","_marqueeSelectOutline","_marqueeSelectRect","_manipulationStartX","_manipulationStartY","connectedCallback","disconnectedCallback","createLayout","addMainCanvas","initOverlay","attachEvents","attachWindowEvents","detachEvents","detachWindowEvents","onCanvasPointerDown","onCanvasDblClick","onKeyUp","onPointerMove","onPointerOut","onPointerUp","addNewMarker","markerCreated","markerStateChanged","deleteMarker","deleteSelectedMarkers","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","deselectEditor","markerEditorType","Error","editor","newMarkerEditor","m","selectEditor","index","clientX","clientY","pointerType","localPoint","hitMarker","shiftKey","contains","localManipulationStart","size","finishMarqueeSelection","markerRect","hasAttribute","version","markers","stateCopy","markerState","editorType","scaleMarkers","preScaleSelectedMarker","_logoUI","link","href","Logo","positionLogo","offsetHeight","lastUndoState","type","options","removeEventListener","customElements","define","MarkerView","markerTypes","markerView","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","next","rejected","done","then","apply","SuppressedError","_targetImageLoaded","naturalSize","imageType","markersOnly","init","body","rasterize","targetCanvas","counter","r","canvas","markerImageCopy","valueAsString","viewBox","data","outerHTML","ctx","getContext","drawImage","DOMURL","URL","Image","blob","Blob","url","createObjectURL","onload","revokeObjectURL","toDataURL","imageQuality"],"mappings":"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","x_google_ignoreList":[38]}
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/ShapeMarkerBase.ts","../../src/core/FrameMarker.ts","../../src/core/LinearMarkerBase.ts","../../src/core/LineMarker.ts","../../src/core/ArrowMarker.ts","../../src/core/MeasurementMarker.ts","../../src/core/PolygonMarker.ts","../../src/core/FreehandMarker.ts","../../src/core/TextBlock.ts","../../src/core/TextMarker.ts","../../src/core/CoverMarker.ts","../../src/core/HighlightMarker.ts","../../src/core/CalloutMarker.ts","../../src/core/EllipseFrameMarker.ts","../../src/core/EllipseMarker.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/editor/ShapeMarkerEditor.ts","../../src/editor/ArrowMarkerEditor.ts","../../src/editor/CalloutMarkerEditor.ts","../../src/MarkerArea.ts","../../src/editor.ts","../../src/MarkerView.ts","../../node_modules/tslib/tslib.es6.js","../../src/viewer.ts","../../src/Renderer.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.strokeWidth *= (scaleX + scaleY) / 2;\r\n\r\n this.setSize();\r\n }\r\n}\r\n","import { MarkerBaseState } from './MarkerBaseState';\r\nimport { ShapeOutlineMarkerBase } from './ShapeOutlineMarkerBase';\r\nimport { ShapeMarkerBaseState } from './ShapeMarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\n\r\nexport abstract class ShapeMarkerBase extends ShapeOutlineMarkerBase {\r\n public static title = 'Shape marker';\r\n\r\n protected _fillColor = 'transparent';\r\n protected applyFillColor() {\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['fill', this._fillColor]]);\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 createVisual(): void {\r\n super.createVisual();\r\n if (this.visual) {\r\n SvgHelper.setAttributes(this.visual, [['fill', this._fillColor]]);\r\n }\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(): ShapeMarkerBaseState {\r\n const result: ShapeMarkerBaseState = Object.assign(\r\n {\r\n fillColor: this._fillColor,\r\n },\r\n super.getState(),\r\n );\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 rectState = state as ShapeMarkerBaseState;\r\n super.restoreState(state);\r\n\r\n this.fillColor = rectState.fillColor;\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 ['fill', 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(this.getPath(), [\r\n ['stroke', 'transparent'],\r\n ['stroke-width', Math.max(this.strokeWidth, 8).toString()],\r\n ]);\r\n this.visibleVisual = SvgHelper.createPath(this.getPath(), [\r\n ['stroke', this.strokeColor],\r\n ['fill', this.strokeColor],\r\n ['stroke-width', this.strokeWidth.toString()],\r\n ['stroke-linejoin', 'round'],\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, [\r\n ['stroke', this.strokeColor],\r\n ]);\r\n SvgHelper.setAttributes(this.visibleVisual, [['fill', this.strokeColor]]);\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(): 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.strokeWidth *= (scaleX + scaleY) / 2;\r\n\r\n this.adjustVisual();\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 { ArrowMarkerState, ArrowType } from './ArrowMarkerState';\r\nimport { IPoint } from './IPoint';\r\nimport { LineMarker } from './LineMarker';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\n\r\nexport class ArrowMarker extends LineMarker {\r\n public static typeName = 'ArrowMarker';\r\n public static title = 'Arrow marker';\r\n\r\n private _arrowType: ArrowType = 'end';\r\n public get arrowType(): ArrowType {\r\n return this._arrowType;\r\n }\r\n public set arrowType(value: ArrowType) {\r\n this._arrowType = value;\r\n this.adjustVisual();\r\n }\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n }\r\n\r\n protected getPath(): string {\r\n const arrowHeight = 10 + this.strokeWidth * 2;\r\n const arrowWidth = Math.min(\r\n Math.max(5, this.strokeWidth * 2),\r\n this.strokeWidth + 5,\r\n );\r\n const arrowDipFactor = 0.7; // arrow base \"bend factor\"\r\n\r\n const dx = this.x2 - this.x1;\r\n const dy = this.y2 - this.y1;\r\n const angle = Math.atan2(dy, dx);\r\n\r\n // Start arrow\r\n const startArrowBasePoint: IPoint = {\r\n x: this.x1 + arrowHeight * arrowDipFactor * Math.cos(angle),\r\n y: this.y1 + arrowHeight * arrowDipFactor * Math.sin(angle),\r\n };\r\n\r\n const startArrowTipBasePoint: IPoint = {\r\n x: this.x1 + arrowHeight * Math.cos(angle),\r\n y: this.y1 + arrowHeight * Math.sin(angle),\r\n };\r\n\r\n const startArrowSide1: IPoint = {\r\n x: startArrowTipBasePoint.x + arrowWidth * Math.sin(angle),\r\n y: startArrowTipBasePoint.y - arrowWidth * Math.cos(angle),\r\n };\r\n\r\n const startArrowSide2: IPoint = {\r\n x: startArrowTipBasePoint.x - arrowWidth * Math.sin(angle),\r\n y: startArrowTipBasePoint.y + arrowWidth * Math.cos(angle),\r\n };\r\n\r\n // End arrow\r\n const endArrowBasePoint: IPoint = {\r\n x: this.x2 - arrowHeight * arrowDipFactor * Math.cos(angle),\r\n y: this.y2 - arrowHeight * arrowDipFactor * Math.sin(angle),\r\n };\r\n\r\n const endArrowTipBasePoint: IPoint = {\r\n x: this.x2 - arrowHeight * Math.cos(angle),\r\n y: this.y2 - arrowHeight * Math.sin(angle),\r\n };\r\n\r\n const endArrowSide1: IPoint = {\r\n x: endArrowTipBasePoint.x + arrowWidth * Math.sin(angle),\r\n y: endArrowTipBasePoint.y - arrowWidth * Math.cos(angle),\r\n };\r\n\r\n const endArrowSide2: IPoint = {\r\n x: endArrowTipBasePoint.x - arrowWidth * Math.sin(angle),\r\n y: endArrowTipBasePoint.y + arrowWidth * Math.cos(angle),\r\n };\r\n\r\n const startSegment =\r\n this.arrowType === 'start' || this.arrowType === 'both'\r\n ? `M ${startArrowBasePoint.x} ${startArrowBasePoint.y}\r\n L ${startArrowSide1.x} ${startArrowSide1.y} L ${this.x1} ${this.y1} L ${startArrowSide2.x} ${startArrowSide2.y} L ${startArrowBasePoint.x} ${startArrowBasePoint.y}\r\n L ${startArrowBasePoint.x} ${startArrowBasePoint.y}`\r\n : `M ${this.x1} ${this.y1}`;\r\n\r\n const endSegment =\r\n this.arrowType === 'end' || this.arrowType === 'both'\r\n ? `L ${endArrowBasePoint.x} ${endArrowBasePoint.y} \r\n L ${endArrowSide1.x} ${endArrowSide1.y} L ${this.x2} ${this.y2} L ${endArrowSide2.x} ${endArrowSide2.y} L ${endArrowBasePoint.x} ${endArrowBasePoint.y} Z`\r\n : `L ${this.x2} ${this.y2}`;\r\n // svg path for the arrow\r\n const result = `${startSegment} ${endSegment}`;\r\n\r\n return result;\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n super.applyStrokeWidth();\r\n this.adjustVisual();\r\n }\r\n\r\n /**\r\n * Returns marker's state.\r\n */\r\n public getState(): ArrowMarkerState {\r\n const result: ArrowMarkerState = Object.assign(\r\n {\r\n arrowType: this.arrowType,\r\n },\r\n super.getState(),\r\n );\r\n result.typeName = ArrowMarker.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 const arrowState = state as ArrowMarkerState;\r\n this.arrowType = arrowState.arrowType;\r\n\r\n super.restoreState(state);\r\n }\r\n}\r\n","import { IPoint } from './IPoint';\r\nimport { LineMarker } from './LineMarker';\r\nimport { LinearMarkerBaseState } from './LinearMarkerBaseState';\r\n\r\nexport class MeasurementMarker extends LineMarker {\r\n public static typeName = 'MeasurementMarker';\r\n public static title = 'Measurement marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n }\r\n\r\n protected getPath(): string {\r\n const tipLength = 5 + this.strokeWidth * 3;\r\n\r\n const dx = this.x2 - this.x1;\r\n const dy = this.y2 - this.y1;\r\n const angle = Math.atan2(dy, dx);\r\n\r\n const startArrowSide1: IPoint = {\r\n x: this.x1 + tipLength * Math.sin(angle),\r\n y: this.y1 - tipLength * Math.cos(angle),\r\n };\r\n\r\n const startArrowSide2: IPoint = {\r\n x: this.x1 - tipLength * Math.sin(angle),\r\n y: this.y1 + tipLength * Math.cos(angle),\r\n };\r\n\r\n const endArrowSide1: IPoint = {\r\n x: this.x2 + tipLength * Math.sin(angle),\r\n y: this.y2 - tipLength * Math.cos(angle),\r\n };\r\n\r\n const endArrowSide2: IPoint = {\r\n x: this.x2 - tipLength * Math.sin(angle),\r\n y: this.y2 + tipLength * Math.cos(angle),\r\n };\r\n\r\n // svg path for the arrow\r\n const result = `M ${startArrowSide1.x} ${startArrowSide1.y}\r\n L ${startArrowSide2.x} ${startArrowSide2.y}\r\n M ${this.x1} ${this.y1}\r\n L ${this.x2} ${this.y2}\r\n M ${endArrowSide1.x} ${endArrowSide1.y}\r\n L ${endArrowSide2.x} ${endArrowSide2.y}\r\n `;\r\n\r\n return result;\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n super.applyStrokeWidth();\r\n this.adjustVisual();\r\n }\r\n\r\n /**\r\n * Returns marker's state.\r\n */\r\n public getState(): LinearMarkerBaseState {\r\n const result = super.getState();\r\n result.typeName = MeasurementMarker.typeName;\r\n\r\n return result;\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 this._textElement.style.userSelect = 'none';\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 =\r\n (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 (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 { SvgHelper } from './SvgHelper';\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 this.adjustVisual = this.adjustVisual.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.offsetX = this.padding;\r\n this.textBlock.offsetY = this.padding;\r\n\r\n this.textBlock.onTextSizeChanged = this.textSizeChanged;\r\n\r\n this.visual = SvgHelper.createGroup();\r\n this.visual.appendChild(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 adjustVisual(): void {\r\n this.setSize();\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 this.textBlock.offsetX = this.padding;\r\n this.textBlock.offsetY = this.padding;\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.adjustVisual();\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.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n // @todo for some reason causes wrong positioning in the Renderer\r\n // this.padding = this.padding * ((scaleX + scaleY) / 2);\r\n\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.adjustVisual();\r\n }\r\n}\r\n","import { ShapeMarkerBase } from './ShapeMarkerBase';\r\nimport { ShapeMarkerBaseState } from './ShapeMarkerBaseState';\r\n\r\nexport class CoverMarker extends ShapeMarkerBase {\r\n /**\r\n * String type name of the marker type.\r\n */\r\n public static typeName = 'CoverMarker';\r\n\r\n /**\r\n * Marker type title (display name) used for accessibility and other attributes.\r\n */\r\n public static title = 'Cover marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.fillColor = '#000000';\r\n this.strokeColor = 'transparent';\r\n this.strokeWidth = 0;\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(): ShapeMarkerBaseState {\r\n const result = super.getState();\r\n result.typeName = CoverMarker.typeName;\r\n return result;\r\n }\r\n}\r\n","import { ShapeMarkerBase } from './ShapeMarkerBase';\r\nimport { ShapeMarkerBaseState } from './ShapeMarkerBaseState';\r\n\r\nexport class HighlightMarker extends ShapeMarkerBase {\r\n /**\r\n * String type name of the marker type.\r\n */\r\n public static typeName = 'HighlightMarker';\r\n\r\n /**\r\n * Marker type title (display name) used for accessibility and other attributes.\r\n */\r\n public static title = 'Highlight marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.fillColor = '#ffff00';\r\n this.opacity = 0.5;\r\n this.strokeColor = 'transparent';\r\n this.strokeWidth = 0;\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(): ShapeMarkerBaseState {\r\n const result = super.getState();\r\n result.typeName = HighlightMarker.typeName;\r\n return result;\r\n }\r\n}\r\n","import { CalloutMarkerState } from './CalloutMarkerState';\r\nimport { IPoint } from './IPoint';\r\nimport { MarkerBaseState } from './MarkerBaseState';\r\nimport { SvgHelper } from './SvgHelper';\r\nimport { TextMarker } from './TextMarker';\r\n\r\nexport class CalloutMarker extends TextMarker {\r\n public static typeName = 'CalloutMarker';\r\n\r\n public static title = 'Callout marker';\r\n\r\n private _tipPosition: IPoint = { x: 0, y: 0 };\r\n public get tipPosition(): IPoint {\r\n return this._tipPosition;\r\n }\r\n public set tipPosition(value: IPoint) {\r\n this._tipPosition = value;\r\n this.adjustVisual();\r\n }\r\n\r\n private tipBase1Position: IPoint = { x: 0, y: 0 };\r\n private tipBase2Position: IPoint = { x: 0, y: 0 };\r\n\r\n private _calloutVisual: SVGPathElement = SvgHelper.createPath('M0,0');\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.color = '#ffffff';\r\n this.fillColor = '#ff0000';\r\n this.strokeColor = '#ffffff';\r\n this.strokeWidth = 3;\r\n this.padding = 20;\r\n\r\n this.createVisual = this.createVisual.bind(this);\r\n this.adjustVisual = this.adjustVisual.bind(this);\r\n this.getPath = this.getPath.bind(this);\r\n this.setTipPoints = this.setTipPoints.bind(this);\r\n }\r\n\r\n protected applyStrokeColor() {\r\n SvgHelper.setAttributes(this._calloutVisual, [\r\n ['stroke', this._strokeColor],\r\n ]);\r\n }\r\n\r\n protected applyStrokeWidth() {\r\n SvgHelper.setAttributes(this._calloutVisual, [\r\n ['stroke-width', this._strokeWidth.toString()],\r\n ]);\r\n }\r\n\r\n protected applyStrokeDasharray() {\r\n SvgHelper.setAttributes(this._calloutVisual, [\r\n ['stroke-dasharray', this._strokeDasharray],\r\n ]);\r\n }\r\n\r\n protected applyOpacity() {\r\n SvgHelper.setAttributes(this._calloutVisual, [\r\n ['opacity', this._opacity.toString()],\r\n ]);\r\n }\r\n\r\n protected applyFillColor() {\r\n SvgHelper.setAttributes(this._calloutVisual, [['fill', this._fillColor]]);\r\n }\r\n\r\n protected getPath(): string {\r\n const r = 5;\r\n this.setTipPoints();\r\n\r\n const result = `M ${r} 0 \r\n ${\r\n this.tipBase1Position.y === 0\r\n ? `H ${this.tipBase1Position.x} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase2Position.x} 0`\r\n : ''\r\n }\r\n H ${this.width - r} \r\n A ${r} ${r} 0 0 1 ${this.width} ${r} \r\n ${\r\n this.tipBase1Position.x === this.width\r\n ? `V ${this.tipBase1Position.y} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase2Position.x} ${this.tipBase2Position.y}`\r\n : ''\r\n }\r\n V ${this.height - r} \r\n A ${r} ${r} 0 0 1 ${this.width - r} ${this.height} \r\n ${\r\n this.tipBase1Position.y === this.height\r\n ? `H ${this.tipBase2Position.x} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase1Position.x} ${this.height}`\r\n : ''\r\n }\r\n H ${r}\r\n A ${r} ${r} 0 0 1 0 ${this.height - r} \r\n ${\r\n this.tipBase1Position.x === 0\r\n ? `V ${this.tipBase2Position.y} L ${this.tipPosition.x} ${this.tipPosition.y} L ${this.tipBase1Position.x} ${this.tipBase1Position.y}`\r\n : ''\r\n }\r\n V ${r} \r\n A ${r} ${r} 0 0 1 ${r} 0 \r\n Z`;\r\n\r\n return result;\r\n }\r\n\r\n private setTipPoints() {\r\n let offset = Math.min(this.height / 2, 15);\r\n let baseWidth = this.height / 5;\r\n\r\n const cornerAngle = Math.atan(this.height / 2 / (this.width / 2));\r\n if (\r\n this.tipPosition.x < this.width / 2 &&\r\n this.tipPosition.y < this.height / 2\r\n ) {\r\n // top left\r\n const tipAngle = Math.atan(\r\n (this.height / 2 - this.tipPosition.y) /\r\n (this.width / 2 - this.tipPosition.x),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = { x: offset, y: 0 };\r\n this.tipBase2Position = { x: offset + baseWidth, y: 0 };\r\n } else {\r\n this.tipBase1Position = { x: 0, y: offset };\r\n this.tipBase2Position = { x: 0, y: offset + baseWidth };\r\n }\r\n } else if (\r\n this.tipPosition.x >= this.width / 2 &&\r\n this.tipPosition.y < this.height / 2\r\n ) {\r\n // top right\r\n const tipAngle = Math.atan(\r\n (this.height / 2 - this.tipPosition.y) /\r\n (this.tipPosition.x - this.width / 2),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = { x: this.width - offset - baseWidth, y: 0 };\r\n this.tipBase2Position = { x: this.width - offset, y: 0 };\r\n } else {\r\n this.tipBase1Position = { x: this.width, y: offset };\r\n this.tipBase2Position = { x: this.width, y: offset + baseWidth };\r\n }\r\n } else if (\r\n this.tipPosition.x >= this.width / 2 &&\r\n this.tipPosition.y >= this.height / 2\r\n ) {\r\n // bottom right\r\n const tipAngle = Math.atan(\r\n (this.tipPosition.y - this.height / 2) /\r\n (this.tipPosition.x - this.width / 2),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = {\r\n x: this.width - offset - baseWidth,\r\n y: this.height,\r\n };\r\n this.tipBase2Position = { x: this.width - offset, y: this.height };\r\n } else {\r\n this.tipBase1Position = {\r\n x: this.width,\r\n y: this.height - offset - baseWidth,\r\n };\r\n this.tipBase2Position = { x: this.width, y: this.height - offset };\r\n }\r\n } else {\r\n // bottom left\r\n const tipAngle = Math.atan(\r\n (this.tipPosition.y - this.height / 2) /\r\n (this.width / 2 - this.tipPosition.x),\r\n );\r\n if (cornerAngle < tipAngle) {\r\n baseWidth = this.width / 5;\r\n offset = Math.min(this.width / 2, 15);\r\n this.tipBase1Position = { x: offset, y: this.height };\r\n this.tipBase2Position = { x: offset + baseWidth, y: this.height };\r\n } else {\r\n this.tipBase1Position = { x: 0, y: this.height - offset - baseWidth };\r\n this.tipBase2Position = { x: 0, y: this.height - offset };\r\n }\r\n }\r\n }\r\n\r\n public createVisual(): void {\r\n super.createVisual();\r\n\r\n this._tipPosition = {\r\n // x: -50,\r\n // x: this.width + 50,\r\n x: this.width / 4,\r\n // y: this.height / 4,\r\n // y: -50,\r\n y: this.height + 20,\r\n };\r\n\r\n this._calloutVisual = SvgHelper.createPath(this.getPath(), [\r\n ['fill', this._fillColor],\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.visual?.insertBefore(this._calloutVisual, this.textBlock.textElement);\r\n }\r\n\r\n public adjustVisual(): void {\r\n super.adjustVisual();\r\n if (this._calloutVisual) {\r\n SvgHelper.setAttributes(this._calloutVisual, [\r\n ['d', this.getPath()],\r\n ['fill', this._fillColor],\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 ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this._calloutVisual === el) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public getState(): CalloutMarkerState {\r\n const result: CalloutMarkerState = Object.assign(\r\n {\r\n tipPosition: this.tipPosition,\r\n },\r\n super.getState(),\r\n );\r\n\r\n result.typeName = CalloutMarker.typeName;\r\n\r\n return result;\r\n }\r\n\r\n public restoreState(state: MarkerBaseState): void {\r\n const calloutState = state as CalloutMarkerState;\r\n super.restoreState(state);\r\n this._tipPosition = calloutState.tipPosition;\r\n\r\n this.adjustVisual();\r\n }\r\n\r\n public scale(scaleX: number, scaleY: number): void {\r\n super.scale(scaleX, scaleY);\r\n this._tipPosition = {\r\n x: this._tipPosition.x * scaleX,\r\n y: this._tipPosition.y * scaleY,\r\n };\r\n\r\n this.adjustVisual();\r\n }\r\n}\r\n","import { ShapeOutlineMarkerBase } from './ShapeOutlineMarkerBase';\r\nimport { ShapeOutlineMarkerBaseState } from './ShapeOutlineMarkerBaseState';\r\n\r\nexport class EllipseFrameMarker extends ShapeOutlineMarkerBase {\r\n /**\r\n * String type name of the marker type.\r\n */\r\n public static typeName = 'EllipseFrameMarker';\r\n\r\n /**\r\n * Marker type title (display name) used for accessibility and other attributes.\r\n */\r\n public static title = 'Ellipse 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 ${width / 2} 0 \r\n a ${width / 2} ${height / 2} 0 1 0 0 ${height} \r\n a ${width / 2} ${height / 2} 0 1 0 0 -${height} 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 = EllipseFrameMarker.typeName;\r\n return result;\r\n }\r\n}\r\n","import { ShapeMarkerBase } from './ShapeMarkerBase';\r\nimport { ShapeMarkerBaseState } from './ShapeMarkerBaseState';\r\n\r\nexport class EllipseMarker extends ShapeMarkerBase {\r\n /**\r\n * String type name of the marker type.\r\n */\r\n public static typeName = 'EllipseMarker';\r\n\r\n /**\r\n * Marker type title (display name) used for accessibility and other attributes.\r\n */\r\n public static title = 'Ellipse marker';\r\n\r\n constructor(container: SVGGElement) {\r\n super(container);\r\n\r\n this.fillColor = '#ff0000';\r\n this.strokeColor = '#ff0000';\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 ${width / 2} 0 \r\n a ${width / 2} ${height / 2} 0 1 0 0 ${height} \r\n a ${width / 2} ${height / 2} 0 1 0 0 -${height} z`;\r\n\r\n return result;\r\n }\r\n\r\n public getState(): ShapeMarkerBaseState {\r\n const result = super.getState();\r\n result.typeName = EllipseMarker.typeName;\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 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 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 protected isMultiSelected = false;\r\n /**\r\n * Selects this marker and displays appropriate selected marker UI.\r\n */\r\n public select(multi = false): void {\r\n this.isMultiSelected = multi;\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 (this.manipulationStartState != currentState) {\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","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 protected manipulationBox: 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(this.isMultiSelected);\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 first point and adjust grips\r\n this.marker.points.splice(0, 1);\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(\r\n (l) => l === target,\r\n );\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 this.manipulationBox = SvgHelper.createGroup();\r\n this.controlBox.appendChild(this.manipulationBox);\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.manipulationBox.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.manipulationBox.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(multi = false): void {\r\n super.select(multi);\r\n this.adjustControlBox();\r\n this.manipulationBox.style.display = multi ? 'none' : '';\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 protected manipulationBox: 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 (this.grip1?.ownsTarget(el) || this.grip2?.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.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(this.isMultiSelected);\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 (\r\n this.state === 'creating' &&\r\n Math.abs(this.marker.x1 - this.marker.x2) < 10 &&\r\n Math.abs(this.marker.y1 - this.marker.y2) < 10\r\n ) {\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 =\r\n this.manipulationStartX1 + point.x - this.manipulationStartX;\r\n this.marker.y1 =\r\n this.manipulationStartY1 + point.y - this.manipulationStartY;\r\n this.marker.x2 =\r\n this.manipulationStartX2 + point.x - this.manipulationStartX;\r\n this.marker.y2 =\r\n 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 this.manipulationBox = SvgHelper.createGroup();\r\n this.controlBox.appendChild(this.manipulationBox);\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.manipulationBox.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(\r\n this.grip1.visual,\r\n this.marker.x1 - gripSize / 2,\r\n this.marker.y1 - gripSize / 2,\r\n );\r\n this.positionGrip(\r\n this.grip2.visual,\r\n this.marker.x2 - gripSize / 2,\r\n this.marker.y2 - 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(multi = false): void {\r\n super.select(multi);\r\n this.adjustControlBox();\r\n this.manipulationBox.style.display = multi ? 'none' : '';\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 protected manipulationBox = 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 =\r\n new RectangularBoxMarkerGrips();\r\n protected disabledResizeGrips: GripLocation[] = [];\r\n private rotatorGrip?: RotateGrip;\r\n protected 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 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(this.isMultiSelected);\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(multi = false): void {\r\n super.select(multi);\r\n this.adjustControlBox();\r\n this.manipulationBox.style.display = multi ? 'none' : '';\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.manipulationBox = SvgHelper.createGroup();\r\n this.controlBox.appendChild(this.manipulationBox);\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 =\r\n 'drop-shadow(rgba(255, 255, 255, 0.7) 0px 2px 0px)';\r\n\r\n this.manipulationBox.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 protected addControlGrips() {\r\n for (const grip of this.controlGrips.grips.values()) {\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.manipulationBox.appendChild(grip.visual);\r\n\r\n this.manipulationBox.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.manipulationBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n protected 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(\r\n this.controlGrips.getGrip('topright').visual,\r\n right,\r\n top,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('leftcenter').visual,\r\n left,\r\n cy,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('rightcenter').visual,\r\n right,\r\n cy,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('bottomleft').visual,\r\n left,\r\n bottom,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('bottomcenter').visual,\r\n cx,\r\n bottom,\r\n );\r\n this.positionGrip(\r\n this.controlGrips.getGrip('bottomright').visual,\r\n right,\r\n bottom,\r\n );\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 protected 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 private _bgColor = 'transparent';\r\n public get bgColor() {\r\n return this._bgColor;\r\n }\r\n public set bgColor(value) {\r\n this._bgColor = value;\r\n this.textEditor.style.backgroundColor = this.bgColor;\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 { FontSize, IPoint, SvgHelper, TextMarker } from '../core';\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 public set color(color: string) {\r\n this.marker.color = color;\r\n this.stateChanged();\r\n }\r\n public get color(): string {\r\n return this.marker.color;\r\n }\r\n\r\n public set fontFamily(font: string) {\r\n this.marker.fontFamily = font;\r\n this.stateChanged();\r\n }\r\n public get fontFamily(): string {\r\n return this.marker.fontFamily;\r\n }\r\n\r\n public set fontSize(size: FontSize) {\r\n this.marker.fontSize = size;\r\n this.stateChanged();\r\n }\r\n public get fontSize(): FontSize {\r\n return this.marker.fontSize;\r\n }\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 this.textBlockEditor.textColor = this.marker.color;\r\n this.textBlockEditor.bgColor = this.marker.fillColor;\r\n this.textBlockEditor.fontFamily = this.marker.fontFamily;\r\n this.textBlockEditor.fontSize = `${this.marker.fontSize.value}${this.marker.fontSize.units}`;\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 { ShapeMarkerBase } from '../core';\r\nimport { ShapeOutlineMarkerEditor } from './ShapeOutlineMarkerEditor';\r\n\r\nexport class ShapeMarkerEditor<\r\n TMarkerType extends ShapeMarkerBase = ShapeMarkerBase,\r\n> extends ShapeOutlineMarkerEditor<TMarkerType> {}\r\n","import { ArrowMarker, ArrowType } from '../core';\r\nimport { LinearMarkerEditor } from './LinearMarkerEditor';\r\n\r\nexport class ArrowMarkerEditor<\r\n TMarkerType extends ArrowMarker = ArrowMarker,\r\n> extends LinearMarkerEditor<TMarkerType> {\r\n public set arrowType(value: ArrowType) {\r\n this.marker.arrowType = value;\r\n }\r\n\r\n public get arrowType(): ArrowType {\r\n return this.marker.arrowType;\r\n }\r\n}\r\n","import { CalloutMarker, IPoint, SvgHelper } from '../core';\r\nimport { MarkerEditorProperties } from './MarkerEditorProperties';\r\nimport { ResizeGrip } from './ResizeGrip';\r\nimport { TextMarkerEditor } from './TextMarkerEditor';\r\n\r\nexport class CalloutMarkerEditor<\r\n TMarkerType extends CalloutMarker = CalloutMarker,\r\n> extends TextMarkerEditor<TMarkerType> {\r\n private tipGrip?: ResizeGrip;\r\n\r\n private manipulationStartTipPositionX = 0;\r\n private manipulationStartTipPositionY = 0;\r\n\r\n constructor(properties: MarkerEditorProperties<TMarkerType>) {\r\n super(properties);\r\n }\r\n\r\n protected addControlGrips(): void {\r\n this.tipGrip = this.createTipGrip();\r\n\r\n super.addControlGrips();\r\n }\r\n\r\n private createTipGrip(): ResizeGrip {\r\n const grip = new ResizeGrip();\r\n grip.visual.transform.baseVal.appendItem(SvgHelper.createTransform());\r\n this.manipulationBox.appendChild(grip.visual);\r\n\r\n return grip;\r\n }\r\n\r\n protected positionGrips() {\r\n super.positionGrips();\r\n\r\n if (this.tipGrip) {\r\n const tipGripSize = this.tipGrip.gripSize ?? 0;\r\n this.positionGrip(\r\n this.tipGrip.visual,\r\n this.marker.tipPosition.x - tipGripSize / 2,\r\n this.marker.tipPosition.y - tipGripSize / 2,\r\n );\r\n }\r\n }\r\n\r\n public ownsTarget(el: EventTarget): boolean {\r\n if (super.ownsTarget(el) || this.tipGrip?.ownsTarget(el)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n public pointerDown(point: IPoint, target?: EventTarget): void {\r\n super.pointerDown(point, target);\r\n\r\n this.manipulationStartTipPositionX = this.marker.tipPosition.x;\r\n this.manipulationStartTipPositionY = this.marker.tipPosition.y;\r\n\r\n if (\r\n this.tipGrip !== undefined &&\r\n target !== undefined &&\r\n this.tipGrip.ownsTarget(target)\r\n ) {\r\n this.activeGrip = this.tipGrip;\r\n this._state = 'resize';\r\n }\r\n }\r\n\r\n protected resize(point: IPoint): void {\r\n const newX =\r\n this.manipulationStartTipPositionX + point.x - this.manipulationStartX;\r\n const newY =\r\n this.manipulationStartTipPositionY + point.y - this.manipulationStartY;\r\n\r\n if (this.activeGrip === this.tipGrip) {\r\n this.marker.tipPosition = { x: newX, y: newY };\r\n this.adjustControlBox();\r\n } else {\r\n super.resize(point);\r\n }\r\n }\r\n}\r\n","import {\r\n AnnotationState,\r\n CoverMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\r\n FrameMarker,\r\n FreehandMarker,\r\n HighlightMarker,\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\nimport { ShapeMarkerEditor } from './editor/ShapeMarkerEditor';\r\nimport { ArrowMarker } from './core/ArrowMarker';\r\nimport { ArrowMarkerEditor } from './editor/ArrowMarkerEditor';\r\nimport { MeasurementMarker } from './core/MeasurementMarker';\r\nimport { CalloutMarker } from './core/CalloutMarker';\r\nimport { CalloutMarkerEditor } from './editor/CalloutMarkerEditor';\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 private _selectedMarkerEditors: MarkerBaseEditor[] = [];\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(\r\n EllipseFrameMarker,\r\n ShapeOutlineMarkerEditor<FrameMarker>,\r\n );\r\n this.markerEditors.set(LineMarker, LinearMarkerEditor<LineMarker>);\r\n this.markerEditors.set(PolygonMarker, PolygonMarkerEditor<PolygonMarker>);\r\n this.markerEditors.set(\r\n FreehandMarker,\r\n FreehandMarkerEditor<FreehandMarker>,\r\n );\r\n this.markerEditors.set(TextMarker, TextMarkerEditor<TextMarker>);\r\n this.markerEditors.set(CoverMarker, ShapeMarkerEditor<CoverMarker>);\r\n this.markerEditors.set(HighlightMarker, ShapeMarkerEditor<HighlightMarker>);\r\n this.markerEditors.set(EllipseMarker, ShapeMarkerEditor<HighlightMarker>);\r\n this.markerEditors.set(ArrowMarker, ArrowMarkerEditor<ArrowMarker>);\r\n this.markerEditors.set(\r\n MeasurementMarker,\r\n LinearMarkerEditor<MeasurementMarker>,\r\n );\r\n this.markerEditors.set(CalloutMarker, CalloutMarkerEditor<CalloutMarker>);\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 this.deleteMarker = this.deleteMarker.bind(this);\r\n this.deleteSelectedMarkers = this.deleteSelectedMarkers.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.deselectEditor();\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 (editor.continuousCreation) {\r\n const newMarkerEditor = this.createMarker(editor.marker.typeName);\r\n if (\r\n editor.is(FreehandMarkerEditor) &&\r\n newMarkerEditor?.is(FreehandMarkerEditor)\r\n ) {\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 deleteMarker(markerEditor: MarkerBaseEditor): void {\r\n if (this.editors.indexOf(markerEditor) >= 0) {\r\n this.addUndoStep();\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerbeforedelete', {\r\n detail: { markerArea: this, markerEditor: markerEditor },\r\n }),\r\n );\r\n this._mainCanvas?.removeChild(markerEditor.container);\r\n markerEditor.dispose();\r\n this.editors.splice(this.editors.indexOf(markerEditor), 1);\r\n this.dispatchEvent(\r\n new CustomEvent<MarkerEditorEventData>('markerdelete', {\r\n detail: { markerArea: this, markerEditor: markerEditor },\r\n }),\r\n );\r\n }\r\n }\r\n\r\n public deleteSelectedMarkers() {\r\n this._selectedMarkerEditors.forEach((m) => this.deleteMarker(m));\r\n this._selectedMarkerEditors.splice(0);\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._selectedMarkerEditors.push(this._currentMarkerEditor);\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 public selectEditor(editor: MarkerBaseEditor): void {\r\n if (this._selectedMarkerEditors.indexOf(editor) < 0) {\r\n if (this._selectedMarkerEditors.length > 0) {\r\n this._selectedMarkerEditors[0].select(true);\r\n }\r\n this._selectedMarkerEditors.push(editor);\r\n editor.select(true);\r\n }\r\n }\r\n\r\n public deselectEditor(editor?: MarkerBaseEditor): void {\r\n if (editor === undefined) {\r\n this._selectedMarkerEditors.forEach((m) => m.deselect());\r\n this._selectedMarkerEditors.splice(0);\r\n } else {\r\n const index = this._selectedMarkerEditors.indexOf(editor);\r\n if (index >= 0) {\r\n this._selectedMarkerEditors.splice(index, 1);\r\n editor.deselect();\r\n }\r\n }\r\n }\r\n\r\n private touchPoints = 0;\r\n private isDragging = false;\r\n private isSelecting = false;\r\n\r\n private _marqueeSelectOutline: SVGRectElement = SvgHelper.createRect(0, 0, [\r\n ['stroke', '#333'],\r\n ['stroke-width', '0.5'],\r\n ['stroke-dasharray', '5 5'],\r\n ['fill', 'transparent'],\r\n ['pointer-events', 'none'],\r\n ]);\r\n private _marqueeSelectRect = new DOMRect(0, 0, 0, 0);\r\n\r\n private _manipulationStartX = 0;\r\n private _manipulationStartY = 0;\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._manipulationStartX = ev.clientX;\r\n this._manipulationStartY = ev.clientY;\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 localPoint = SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n ev.clientX,\r\n ev.clientY,\r\n this.zoomLevel,\r\n );\r\n const hitMarker = this.editors.find((m) => m.ownsTarget(ev.target));\r\n if (hitMarker !== undefined) {\r\n this.isDragging = true;\r\n if (ev.shiftKey) {\r\n this.selectEditor(hitMarker);\r\n } else if (!hitMarker.isSelected) {\r\n this.deselectEditor();\r\n this.setCurrentEditor(hitMarker);\r\n }\r\n this._selectedMarkerEditors.forEach((m) =>\r\n m.pointerDown(localPoint, ev.target ?? undefined),\r\n );\r\n } else {\r\n this.setCurrentEditor();\r\n this.deselectEditor();\r\n this.isSelecting = true;\r\n this.isDragging = true;\r\n\r\n // marquee select\r\n this._marqueeSelectRect.x = localPoint.x;\r\n this._marqueeSelectRect.y = localPoint.y;\r\n this._marqueeSelectRect.width = 0;\r\n this._marqueeSelectRect.height = 0;\r\n SvgHelper.setAttributes(this._marqueeSelectOutline, [\r\n ['x', localPoint.x.toString()],\r\n ['y', localPoint.y.toString()],\r\n ['width', '0'],\r\n ['height', '0'],\r\n ]);\r\n if (\r\n this._groupLayer &&\r\n !this._groupLayer.contains(this._marqueeSelectOutline)\r\n ) {\r\n this._groupLayer.appendChild(this._marqueeSelectOutline);\r\n }\r\n\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 (\r\n this.touchPoints === 1 ||\r\n (ev.pointerType !== 'touch' && this.isDragging)\r\n ) {\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 if (\r\n this._currentMarkerEditor !== undefined ||\r\n this._selectedMarkerEditors.length > 0\r\n ) {\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 (\r\n this._currentMarkerEditor !== undefined ||\r\n this._selectedMarkerEditors.length > 0\r\n ) {\r\n this.showOutline(localPoint);\r\n\r\n if (this._selectedMarkerEditors.length > 0) {\r\n this._selectedMarkerEditors.forEach((m) =>\r\n m.manipulate(localPoint),\r\n );\r\n } else {\r\n this._currentMarkerEditor?.manipulate(localPoint);\r\n }\r\n } else if (this.zoomLevel > 1) {\r\n this.panTo({ x: ev.clientX, y: ev.clientY });\r\n }\r\n } else if (this.isSelecting) {\r\n // adjust marquee\r\n const localManipulationStart = SvgHelper.clientToLocalCoordinates(\r\n this._mainCanvas,\r\n this._manipulationStartX,\r\n this._manipulationStartY,\r\n this.zoomLevel,\r\n );\r\n\r\n this._marqueeSelectRect.x = Math.min(\r\n localPoint.x,\r\n localManipulationStart.x,\r\n );\r\n this._marqueeSelectRect.y = Math.min(\r\n localPoint.y,\r\n localManipulationStart.y,\r\n );\r\n this._marqueeSelectRect.width =\r\n Math.abs(ev.clientX - this._manipulationStartX) / this.zoomLevel;\r\n this._marqueeSelectRect.height =\r\n Math.abs(ev.clientY - this._manipulationStartY) / this.zoomLevel;\r\n\r\n SvgHelper.setAttributes(this._marqueeSelectOutline, [\r\n ['x', `${this._marqueeSelectRect.x}`],\r\n ['y', `${this._marqueeSelectRect.y}`],\r\n ['width', `${this._marqueeSelectRect.width}`],\r\n ['height', `${this._marqueeSelectRect.height}`],\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 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 if (this._selectedMarkerEditors.length > 1) {\r\n this._selectedMarkerEditors.forEach((m) => m.pointerUp(localPoint));\r\n } else {\r\n this._currentMarkerEditor.pointerUp(localPoint);\r\n }\r\n\r\n this.hideOutline();\r\n } else if (this.isSelecting) {\r\n // finish marquee selection\r\n if (\r\n this._groupLayer &&\r\n this._groupLayer.contains(this._marqueeSelectOutline)\r\n ) {\r\n this._groupLayer.removeChild(this._marqueeSelectOutline);\r\n }\r\n this.finishMarqueeSelection();\r\n }\r\n }\r\n this.isDragging = false;\r\n this.isSelecting = false;\r\n this.addUndoStep();\r\n }\r\n\r\n private finishMarqueeSelection() {\r\n this.deselectEditor();\r\n\r\n this.editors.forEach((m) => {\r\n const markerRect = m.marker.container.getBBox();\r\n if (\r\n markerRect.x <\r\n this._marqueeSelectRect.x + this._marqueeSelectRect.width &&\r\n markerRect.x + markerRect.width > this._marqueeSelectRect.x &&\r\n markerRect.y <\r\n this._marqueeSelectRect.y + this._marqueeSelectRect.height &&\r\n markerRect.y + markerRect.height > this._marqueeSelectRect.y\r\n ) {\r\n this.selectEditor(m);\r\n }\r\n });\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 ||\r\n stateCopy.height !== this.targetHeight)\r\n ) {\r\n this.scaleMarkers(\r\n this.targetWidth / stateCopy.width,\r\n this.targetHeight / stateCopy.height,\r\n );\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('MJS3E') && !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.bottom = `20px`;\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 { ShapeMarkerEditor } from './editor/ShapeMarkerEditor';\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\nexport { ArrowMarkerEditor } from './editor/ArrowMarkerEditor';\r\nexport { CalloutMarkerEditor } from './editor/CalloutMarkerEditor';\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 {\r\n AnnotationState,\r\n CoverMarker,\r\n FrameMarker,\r\n FreehandMarker,\r\n HighlightMarker,\r\n MarkerBase,\r\n PolygonMarker,\r\n SvgHelper,\r\n TextMarker,\r\n LineMarker,\r\n MeasurementMarker,\r\n ArrowMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\r\n} from './core';\r\nimport { Activator } from './core/Activator';\r\n\r\nimport Logo from './assets/markerjs-logo-m.svg';\r\nimport { CalloutMarker } from './core/CalloutMarker';\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\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 (this._canvasContainer && this._contentContainer && this._mainCanvas) {\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,\r\n LineMarker,\r\n ArrowMarker,\r\n MeasurementMarker,\r\n PolygonMarker,\r\n FreehandMarker,\r\n TextMarker,\r\n CoverMarker,\r\n HighlightMarker,\r\n CalloutMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\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(markerType: typeof MarkerBase): 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 ||\r\n stateCopy.height !== this.targetHeight)\r\n ) {\r\n this.scaleMarkers(\r\n this.targetWidth / stateCopy.width,\r\n this.targetHeight / stateCopy.height,\r\n );\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('MJS3V') && !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.bottom = `20px`;\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","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n function next() {\r\n while (env.stack.length) {\r\n var rec = env.stack.pop();\r\n try {\r\n var result = rec.dispose && rec.dispose.call(rec.value);\r\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\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","import {\r\n AnnotationState,\r\n CoverMarker,\r\n FrameMarker,\r\n FreehandMarker,\r\n HighlightMarker,\r\n MarkerBase,\r\n PolygonMarker,\r\n SvgHelper,\r\n TextMarker,\r\n LineMarker,\r\n ArrowMarker,\r\n MeasurementMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\r\n} from './core';\r\nimport { CalloutMarker } from './core/CalloutMarker';\r\n\r\nexport class Renderer {\r\n private _mainCanvas?: SVGSVGElement;\r\n\r\n private _editingTarget?: HTMLImageElement;\r\n\r\n private _renderHelperContainer?: HTMLDivElement;\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 _targetImageLoaded = false;\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._targetImageLoaded = false;\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 _isInitialized = false;\r\n\r\n /**\r\n * Whether the image should be rendered at the original (natural) target image size.\r\n */\r\n public naturalSize = false;\r\n /**\r\n * Rendered image type (`image/png`, `image/jpeg`, etc.).\r\n */\r\n public imageType = 'image/png';\r\n /**\r\n * For formats that support it, specifies rendering quality.\r\n *\r\n * In the case of `image/jpeg` you can specify a value between 0 and 1 (lowest to highest quality).\r\n *\r\n * @type {number} - image rendering quality (0..1)\r\n */\r\n public imageQuality?: number;\r\n /**\r\n * When set to true, only the marker layer without the original image will be rendered.\r\n */\r\n public markersOnly = false;\r\n\r\n /**\r\n * When set and {@linkcode naturalSize} is `false` sets the width of the rendered image.\r\n *\r\n * Both `width` and `height` have to be set for this to take effect.\r\n */\r\n public width?: number;\r\n /**\r\n * When set and {@linkcode naturalSize} is `false` sets the height of the rendered image.\r\n *\r\n * Both `width` and `height` have to be set for this to take effect.\r\n */\r\n public height?: number;\r\n\r\n constructor() {\r\n this.markerTypes = [\r\n FrameMarker,\r\n LineMarker,\r\n ArrowMarker,\r\n MeasurementMarker,\r\n PolygonMarker,\r\n FreehandMarker,\r\n TextMarker,\r\n CoverMarker,\r\n HighlightMarker,\r\n CalloutMarker,\r\n EllipseFrameMarker,\r\n EllipseMarker,\r\n ];\r\n\r\n this.init = this.init.bind(this);\r\n\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.addNewMarker = this.addNewMarker.bind(this);\r\n\r\n this.restoreState = this.restoreState.bind(this);\r\n this.scaleMarkers = this.scaleMarkers.bind(this);\r\n }\r\n\r\n private init() {\r\n this.addMainCanvas();\r\n this._isInitialized = true;\r\n if (this.targetImage !== undefined) {\r\n this.addTargetImage();\r\n }\r\n this.setMainCanvasSize();\r\n }\r\n\r\n private addMainCanvas() {\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\r\n // text isn't sized correctly without adding to the DOM\r\n this._mainCanvas.style.visibility = 'hidden';\r\n\r\n this._renderHelperContainer = document.createElement('div');\r\n this._renderHelperContainer.style.position = 'absolute';\r\n this._renderHelperContainer.style.top = '0px';\r\n this._renderHelperContainer.style.left = '0px';\r\n this._renderHelperContainer.style.width = '10px';\r\n this._renderHelperContainer.style.height = '10px';\r\n this._renderHelperContainer.style.overflow = 'hidden';\r\n this._renderHelperContainer.style.visibility = 'hidden';\r\n\r\n this._renderHelperContainer.appendChild(this._mainCanvas);\r\n\r\n document.body.appendChild(this._renderHelperContainer);\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}px`;\r\n this._mainCanvas.style.height = `${this._targetHeight}px`;\r\n this._mainCanvas.setAttribute('width', `${this._targetWidth}`);\r\n this._mainCanvas.setAttribute('height', `${this._targetHeight}`);\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;\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 }\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._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 = img.naturalWidth;\r\n this._targetHeight = 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._targetImageLoaded = true;\r\n\r\n this.setMainCanvasSize();\r\n }\r\n });\r\n this._editingTarget.style.visibility = 'hidden';\r\n this._editingTarget.src = this.targetImage.src;\r\n\r\n this._renderHelperContainer?.insertBefore(\r\n this._editingTarget,\r\n this._mainCanvas,\r\n );\r\n // document.body.appendChild(this._editingTarget);\r\n }\r\n }\r\n\r\n private addNewMarker(markerType: typeof MarkerBase): 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 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 restoreState(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 ||\r\n stateCopy.height !== this.targetHeight)\r\n ) {\r\n this.scaleMarkers(\r\n this.targetWidth / stateCopy.width,\r\n this.targetHeight / stateCopy.height,\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 public async rasterize(\r\n state: AnnotationState,\r\n targetCanvas?: HTMLCanvasElement,\r\n ): Promise<string> {\r\n if (!this.naturalSize) {\r\n this._targetWidth = state.width;\r\n this._targetHeight = state.height;\r\n }\r\n\r\n this.init();\r\n\r\n if (this._mainCanvas === undefined || this.targetImage === undefined) {\r\n throw new Error('Not properly initialized.');\r\n }\r\n\r\n let counter = 0;\r\n while (!this._targetImageLoaded && counter++ < 100) {\r\n // wait for the target image to load\r\n await new Promise((r) => setTimeout(r, 100));\r\n }\r\n\r\n this.restoreState(state);\r\n\r\n const canvas =\r\n targetCanvas !== undefined\r\n ? targetCanvas\r\n : document.createElement('canvas');\r\n\r\n if (this.targetImage === null) {\r\n this.markersOnly = true;\r\n this.naturalSize = false;\r\n }\r\n\r\n const markerImageCopy = document.createElementNS(\r\n 'http://www.w3.org/2000/svg',\r\n 'svg',\r\n );\r\n markerImageCopy.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n markerImageCopy.setAttribute(\r\n 'width',\r\n this._mainCanvas.width.baseVal.valueAsString,\r\n );\r\n markerImageCopy.setAttribute(\r\n 'height',\r\n this._mainCanvas.height.baseVal.valueAsString,\r\n );\r\n markerImageCopy.setAttribute(\r\n 'viewBox',\r\n '0 0 ' +\r\n this._mainCanvas.viewBox.baseVal.width.toString() +\r\n ' ' +\r\n this._mainCanvas.viewBox.baseVal.height.toString(),\r\n );\r\n markerImageCopy.innerHTML = this._mainCanvas.innerHTML;\r\n\r\n if (this.naturalSize === true) {\r\n // scale to full image size\r\n markerImageCopy.width.baseVal.value = this.targetImage.naturalWidth;\r\n markerImageCopy.height.baseVal.value = this.targetImage.naturalHeight;\r\n } else if (this.width !== undefined && this.height !== undefined) {\r\n // scale to specific dimensions\r\n markerImageCopy.width.baseVal.value = this.width;\r\n markerImageCopy.height.baseVal.value = this.height;\r\n }\r\n\r\n canvas.width = markerImageCopy.width.baseVal.value;\r\n canvas.height = markerImageCopy.height.baseVal.value;\r\n\r\n const data = markerImageCopy.outerHTML;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (ctx === null) {\r\n throw new Error('Canvas 2D context is not available.');\r\n }\r\n\r\n if (this.markersOnly !== true) {\r\n ctx.drawImage(this.targetImage, 0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n const DOMURL = window.URL; // || window.webkitURL || window;\r\n\r\n const img = new Image(canvas.width, canvas.height);\r\n img.setAttribute('crossOrigin', 'anonymous');\r\n\r\n const blob = new Blob([data], { type: 'image/svg+xml' });\r\n\r\n const url = DOMURL.createObjectURL(blob);\r\n\r\n let result = '';\r\n img.onload = () => {\r\n ctx.drawImage(img, 0, 0);\r\n DOMURL.revokeObjectURL(url);\r\n\r\n result = canvas.toDataURL(this.imageType, this.imageQuality);\r\n };\r\n\r\n img.src = url;\r\n\r\n counter = 0;\r\n while (!result && counter++ < 100) {\r\n // wait for the image to load\r\n await new Promise((r) => setTimeout(r, 100));\r\n }\r\n\r\n if (this._editingTarget) {\r\n this._renderHelperContainer?.removeChild(this._editingTarget);\r\n }\r\n\r\n // remove the helper main canvas from the page\r\n this._renderHelperContainer?.removeChild(this._mainCanvas);\r\n document.body.removeChild(this._renderHelperContainer!);\r\n\r\n return result;\r\n }\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","ShapeMarkerBase","rectState","FrameMarker","result","LinearMarkerBase","visibleVisual","selectorVisual","max","lmbState","LineMarker","ArrowMarker","arrowType","_arrowType","arrowHeight","arrowWidth","min","arrowDipFactor","dx","dy","angle","atan2","startArrowBasePoint","cos","sin","startArrowTipBasePoint","startArrowSide1","startArrowSide2","endArrowBasePoint","endArrowTipBasePoint","endArrowSide1","endArrowSide2","arrowState","MeasurementMarker","tipLength","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","userSelect","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","CoverMarker","HighlightMarker","CalloutMarker","tipPosition","_tipPosition","tipBase1Position","tipBase2Position","_calloutVisual","setTipPoints","offset","baseWidth","cornerAngle","calloutState","EllipseFrameMarker","EllipseMarker","MarkerBaseEditor","creationStyle","_creationStyle","is","cls","_marker","overlayContainer","_overlayContainer","_state","isSelected","_isSelected","continuousCreation","_continuousCreation","adjustControlBox","stateChanged","dashes","properties","_controlBox","isMultiSelected","_markerType","markerType","select","deselect","pointerDown","pointerUp","manipulate","dblClick","multi","cursor","manipulationStartState","JSON","stringify","target","onStateChanged","currentState","console","log","Grip","gripSize","fill","filter","child","ResizeGrip","PolygonMarkerEditor","defaultLength","manipulationStartX","manipulationStartY","controlBox","manipulationBox","grips","setupControlBox","adjustControlGrips","createGrip","positionGrip","positionGrips","resize","grip","startCreation","finishCreation","addNewPointWhileCreating","activeGrip","find","at","pointerEvents","splice","onMarkerCreated","activeGripIndex","selectorLineIndex","findIndex","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","bgColor","_bgColor","backgroundColor","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","size","textBlockEditorContainer","_pointerDownTime","_pointerDownPoint","markerSizeChanged","textBlockEditor","showEditor","hideEditor","Date","now","Activator","addKey","product","keys","set","keyAddListeners","listener","addKeyAddListener","removeKeyAddListener","li","isLicensed","has","keyRegex","RegExp","test","ShapeMarkerEditor","ArrowMarkerEditor","CalloutMarkerEditor","manipulationStartTipPositionX","manipulationStartTipPositionY","tipGrip","createTipGrip","tipGripSize","MarkerArea","HTMLElement","targetWidth","_targetWidth","setMainCanvasSize","targetHeight","_targetHeight","currentMarkerEditor","_currentMarkerEditor","targetImage","_targetImage","addTargetImage","_zoomLevel","_canvasContainer","_contentContainer","_mainCanvas","setEditingTargetSize","scrollTo","clientWidth","clientHeight","panTo","prevPanPoint","mode","_isInitialized","_selectedMarkerEditors","_newMarkerOutline","markerEditors","editors","undoRedoManager","touchPoints","isDragging","isSelecting","_marqueeSelectOutline","_marqueeSelectRect","_manipulationStartX","_manipulationStartY","connectedCallback","disconnectedCallback","createLayout","addMainCanvas","initOverlay","attachEvents","attachWindowEvents","detachEvents","detachWindowEvents","onCanvasPointerDown","onCanvasDblClick","onKeyUp","onPointerMove","onPointerOut","onPointerUp","addNewMarker","markerCreated","markerStateChanged","deleteMarker","deleteSelectedMarkers","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","deselectEditor","markerEditorType","Error","editor","newMarkerEditor","m","selectEditor","index","clientX","clientY","pointerType","localPoint","hitMarker","shiftKey","contains","localManipulationStart","finishMarqueeSelection","markerRect","hasAttribute","version","markers","stateCopy","markerState","editorType","scaleMarkers","preScaleSelectedMarker","_logoUI","link","href","Logo","positionLogo","lastUndoState","type","options","removeEventListener","customElements","define","MarkerView","markerTypes","markerView","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","next","rejected","done","then","apply","SuppressedError","_targetImageLoaded","naturalSize","imageType","markersOnly","init","_renderHelperContainer","body","rasterize","targetCanvas","counter","r","canvas","markerImageCopy","valueAsString","viewBox","data","outerHTML","ctx","getContext","drawImage","DOMURL","URL","Image","blob","Blob","url","createObjectURL","onload","revokeObjectURL","toDataURL","imageQuality"],"mappings":"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","x_google_ignoreList":[40]}