@yamcs/opi 1.2.5 → 1.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/LICENSE +0 -35
  2. package/dist/opi.js +1 -1
  3. package/dist/opi.js.map +1 -1
  4. package/dist/types/ColorMap.d.ts +1 -1
  5. package/dist/types/DialogHandler.d.ts +14 -0
  6. package/dist/types/Display.d.ts +58 -47
  7. package/dist/types/EventHandler.d.ts +3 -3
  8. package/dist/types/Font.d.ts +3 -1
  9. package/dist/types/FontResolver.d.ts +4 -0
  10. package/dist/types/Graphics.d.ts +11 -11
  11. package/dist/types/HitCanvas.d.ts +1 -1
  12. package/dist/types/HitRegionSpecification.d.ts +2 -2
  13. package/dist/types/PathResolver.d.ts +2 -2
  14. package/dist/types/Widget.d.ts +19 -13
  15. package/dist/types/XMLNode.d.ts +17 -17
  16. package/dist/types/actions/Action.d.ts +10 -0
  17. package/dist/types/actions/ExecuteCommandAction.d.ts +10 -0
  18. package/dist/types/actions/ExecuteJavaScriptAction.d.ts +10 -0
  19. package/dist/types/actions/OpenDisplayAction.d.ts +11 -0
  20. package/dist/types/actions/OpenFileAction.d.ts +8 -0
  21. package/dist/types/actions/OpenWebpageAction.d.ts +8 -0
  22. package/dist/types/actions/PlaySoundAction.d.ts +8 -0
  23. package/dist/types/actions/WritePVAction.d.ts +11 -0
  24. package/dist/types/actions.d.ts +1 -55
  25. package/dist/types/events.d.ts +6 -6
  26. package/dist/types/index.d.ts +11 -8
  27. package/dist/types/properties.d.ts +14 -14
  28. package/dist/types/pv/FormulaPVProvider.d.ts +2 -2
  29. package/dist/types/pv/LocalPV.d.ts +7 -3
  30. package/dist/types/pv/PV.d.ts +3 -3
  31. package/dist/types/pv/PVEngine.d.ts +18 -8
  32. package/dist/types/pv/PVProvider.d.ts +1 -1
  33. package/dist/types/pv/Sample.d.ts +1 -1
  34. package/dist/types/pv/SimulatedPVProvider.d.ts +2 -2
  35. package/dist/types/pv/formulas/CompiledFormula.d.ts +1 -1
  36. package/dist/types/pv/formulas/FormulaCompiler.d.ts +1 -1
  37. package/dist/types/pv/formulas/ast.d.ts +16 -16
  38. package/dist/types/pv/sim.d.ts +1 -1
  39. package/dist/types/rules.d.ts +4 -4
  40. package/dist/types/scripting/ActionWrapper.d.ts +12 -0
  41. package/dist/types/scripting/ArrayList.d.ts +5 -0
  42. package/dist/types/scripting/ColorFontUtil.d.ts +2 -2
  43. package/dist/types/scripting/ConsoleUtil.d.ts +1 -1
  44. package/dist/types/scripting/DisplayWrapper.d.ts +4 -2
  45. package/dist/types/scripting/FileUtil.d.ts +1 -1
  46. package/dist/types/scripting/GUIUtil.d.ts +4 -1
  47. package/dist/types/scripting/Java.d.ts +81 -15
  48. package/dist/types/scripting/MessageDialog.d.ts +3 -0
  49. package/dist/types/scripting/PVUtil.d.ts +6 -3
  50. package/dist/types/scripting/PVWrapper.d.ts +2 -1
  51. package/dist/types/scripting/ScriptEngine.d.ts +6 -2
  52. package/dist/types/scripting/ScriptUtil.d.ts +1 -1
  53. package/dist/types/scripting/SpreadSheetTable.d.ts +9 -2
  54. package/dist/types/scripting/SpreadSheetTableWrapper.d.ts +30 -0
  55. package/dist/types/scripting/TableWrapper.d.ts +6 -5
  56. package/dist/types/scripting/WidgetWrapper.d.ts +5 -2
  57. package/dist/types/scripting/XYGraphWrapper.d.ts +2 -2
  58. package/dist/types/scripting/utils.d.ts +4 -3
  59. package/dist/types/widgets/controls/ActionButton.d.ts +8 -6
  60. package/dist/types/widgets/controls/BooleanButton.d.ts +6 -6
  61. package/dist/types/widgets/controls/BooleanSwitch.d.ts +5 -5
  62. package/dist/types/widgets/controls/CheckBox.d.ts +6 -6
  63. package/dist/types/widgets/controls/ChoiceButton.d.ts +6 -6
  64. package/dist/types/widgets/controls/Combo.d.ts +5 -5
  65. package/dist/types/widgets/controls/ImageBooleanButton.d.ts +5 -5
  66. package/dist/types/widgets/controls/MenuButton.d.ts +6 -6
  67. package/dist/types/widgets/controls/NativeButton.d.ts +1 -1
  68. package/dist/types/widgets/controls/RadioBox.d.ts +6 -6
  69. package/dist/types/widgets/controls/Scrollbar.d.ts +5 -5
  70. package/dist/types/widgets/controls/TextInput.d.ts +5 -5
  71. package/dist/types/widgets/figures/Ramp.d.ts +3 -3
  72. package/dist/types/widgets/graphics/Arc.d.ts +4 -4
  73. package/dist/types/widgets/graphics/Ellipse.d.ts +5 -5
  74. package/dist/types/widgets/graphics/ImageWidget.d.ts +4 -4
  75. package/dist/types/widgets/graphics/Label.d.ts +5 -5
  76. package/dist/types/widgets/graphics/Polygon.d.ts +6 -6
  77. package/dist/types/widgets/graphics/Polyline.d.ts +5 -5
  78. package/dist/types/widgets/graphics/Rectangle.d.ts +5 -5
  79. package/dist/types/widgets/graphics/RoundedRectangle.d.ts +5 -5
  80. package/dist/types/widgets/monitors/ByteMonitor.d.ts +5 -5
  81. package/dist/types/widgets/monitors/Gauge.d.ts +6 -6
  82. package/dist/types/widgets/monitors/ImageBooleanIndicator.d.ts +5 -5
  83. package/dist/types/widgets/monitors/IntensityGraph.d.ts +7 -7
  84. package/dist/types/widgets/monitors/LED.d.ts +7 -7
  85. package/dist/types/widgets/monitors/LinearScale.d.ts +4 -4
  86. package/dist/types/widgets/monitors/Meter.d.ts +6 -6
  87. package/dist/types/widgets/monitors/ProgressBar.d.ts +6 -6
  88. package/dist/types/widgets/monitors/Tank.d.ts +6 -6
  89. package/dist/types/widgets/monitors/TextUpdate.d.ts +5 -5
  90. package/dist/types/widgets/monitors/Thermometer.d.ts +6 -6
  91. package/dist/types/widgets/monitors/xygraph/Axis.d.ts +4 -4
  92. package/dist/types/widgets/monitors/xygraph/CommandBuffer.d.ts +1 -1
  93. package/dist/types/widgets/monitors/xygraph/PlotAreaRegion.d.ts +4 -4
  94. package/dist/types/widgets/monitors/xygraph/Trace.d.ts +4 -4
  95. package/dist/types/widgets/monitors/xygraph/XYGraph.d.ts +10 -10
  96. package/dist/types/widgets/monitors/xygraph/XYGraphToolbar.d.ts +6 -6
  97. package/dist/types/widgets/others/AbstractContainerWidget.d.ts +4 -4
  98. package/dist/types/widgets/others/Connection.d.ts +6 -6
  99. package/dist/types/widgets/others/DisplayWidget.d.ts +6 -6
  100. package/dist/types/widgets/others/GroupingContainer.d.ts +3 -3
  101. package/dist/types/widgets/others/LinkingContainer.d.ts +4 -4
  102. package/dist/types/widgets/others/TabbedContainer.d.ts +5 -5
  103. package/dist/types/widgets/others/Table.d.ts +6 -6
  104. package/dist/types/widgets/others/WebBrowser.d.ts +4 -4
  105. package/package.json +6 -11
  106. package/dist/fonts/stylesheet.css +0 -83
  107. package/dist/opi.umd.js +0 -2
  108. package/dist/opi.umd.js.map +0 -1
  109. package/dist/types/pv/formulas/parser.d.ts +0 -10
@@ -1 +0,0 @@
1
- {"version":3,"file":"opi.umd.js","sources":["../src/ConsoleHandler.ts","../src/Color.ts","../src/EventHandler.ts","../src/HitCanvas.ts","../src/positioning.ts","../src/utils.ts","../src/Graphics.ts","../src/properties.ts","../src/actions.ts","../src/ColorMap.ts","../node_modules/fontfaceobserver/fontfaceobserver.standalone.js","../src/Font.ts","../src/macros.ts","../src/rules.ts","../src/scale.ts","../src/scripts.ts","../src/XMLNode.ts","../src/pv/PV.ts","../src/scripting/Java.ts","../src/scripting/ColorFontUtil.ts","../src/scripting/ConsoleUtil.ts","../src/scripting/DataUtil.ts","../src/scripting/PVWrapper.ts","../src/scripting/WidgetWrapper.ts","../src/scripting/TableWrapper.ts","../src/scripting/XYGraphWrapper.ts","../src/scripting/utils.ts","../src/scripting/DisplayWrapper.ts","../src/scripting/FileUtil.ts","../src/scripting/GUIUtil.ts","../src/scripting/SpreadSheetTable.ts","../src/scripting/MessageDialog.ts","../src/scripting/PVUtil.ts","../src/scripting/ScriptUtil.ts","../src/scripting/ScriptEngine.ts","../src/Widget.ts","../src/widgets/others/AbstractContainerWidget.ts","../src/widgets/others/Connection.ts","../src/widgets/others/DisplayWidget.ts","../src/widgets/others/LinkingContainer.ts","../src/PathResolver.ts","../src/pv/formulas/CompiledFormula.ts","../src/pv/formulas/parser.js","../src/pv/formulas/FormulaCompiler.ts","../src/pv/FormulaPVProvider.ts","../src/pv/LocalPV.ts","../src/pv/PVEngine.ts","../src/pv/sim.ts","../src/pv/SimulatedPVProvider.ts","../src/widgets/controls/ActionButton.ts","../src/widgets/controls/BooleanButton.ts","../src/widgets/controls/BooleanSwitch.ts","../src/widgets/controls/CheckBox.ts","../src/widgets/controls/ChoiceButton.ts","../src/widgets/controls/Combo.ts","../src/widgets/controls/ImageBooleanButton.ts","../src/widgets/controls/MenuButton.ts","../src/widgets/controls/NativeButton.ts","../src/widgets/controls/RadioBox.ts","../src/widgets/controls/Scrollbar.ts","../src/widgets/controls/TextInput.ts","../src/widgets/graphics/Arc.ts","../src/widgets/graphics/Ellipse.ts","../src/widgets/graphics/ImageWidget.ts","../src/widgets/graphics/Label.ts","../src/widgets/graphics/Polygon.ts","../src/widgets/graphics/Polyline.ts","../src/widgets/graphics/Rectangle.ts","../src/widgets/graphics/RoundedRectangle.ts","../src/widgets/monitors/ByteMonitor.ts","../src/DecimalFormat.ts","../src/widgets/figures/Ramp.ts","../src/widgets/monitors/Gauge.ts","../src/widgets/monitors/ImageBooleanIndicator.ts","../src/widgets/monitors/LinearScale.ts","../src/widgets/monitors/IntensityGraph.ts","../src/widgets/monitors/LED.ts","../src/widgets/monitors/Meter.ts","../src/widgets/monitors/ProgressBar.ts","../src/widgets/monitors/Tank.ts","../src/widgets/monitors/TextUpdate.ts","../src/widgets/monitors/Thermometer.ts","../src/widgets/monitors/xygraph/Axis.ts","../src/widgets/monitors/xygraph/CommandBuffer.ts","../src/widgets/monitors/xygraph/PlotAreaRegion.ts","../src/widgets/monitors/xygraph/TraceBuffer.ts","../src/widgets/monitors/xygraph/Trace.ts","../src/widgets/monitors/xygraph/XYGraphToolbar.ts","../src/widgets/monitors/xygraph/XYGraph.ts","../src/widgets/others/GroupingContainer.ts","../src/widgets/others/TabbedContainer.ts","../src/widgets/others/Table.ts","../src/widgets/others/WebBrowser.ts","../src/Display.ts"],"sourcesContent":["export interface ConsoleHandler {\n writeInfo(message: string): void;\n writeError(message: string): void;\n writeWarning(message: string): void;\n}\n\nexport class DefaultConsoleHandler implements ConsoleHandler {\n\n writeInfo(message: string) {\n console.log(message);\n }\n\n writeError(message: string) {\n console.error(message);\n }\n\n writeWarning(message: string) {\n console.warn(message);\n }\n}\n","export class Color {\n\n static TRANSPARENT = new Color(0, 0, 0, 0);\n\n static BLACK = new Color(0, 0, 0);\n static BLUE = new Color(0, 0, 255);\n static CYAN = new Color(0, 255, 255);\n static DARK_GRAY = new Color(150, 150, 150);\n static GRAY = new Color(200, 200, 200);\n static GREEN = new Color(0, 255, 0);\n static LIGHT_BLUE = new Color(153, 186, 243);\n static ORANGE = new Color(255, 128, 0);\n static PINK = new Color(255, 0, 255);\n static PURPLE = new Color(128, 0, 255);\n static RED = new Color(255, 0, 0);\n static WHITE = new Color(255, 255, 255);\n static YELLOW = new Color(255, 255, 0);\n\n static BUTTON = new Color(239, 240, 241);\n static BUTTON_DARKER = new Color(164, 168, 172);\n static BUTTON_DARKEST = Color.BLACK;\n static BUTTON_LIGHTEST = Color.WHITE;\n\n constructor(\n public red: number,\n public green: number,\n public blue: number,\n public alpha = 255,\n ) { }\n\n withAlpha(alpha: number) {\n return new Color(this.red, this.green, this.blue, alpha);\n }\n\n mixWith(color: Color, weight: number) {\n const r = Math.floor(this.red * weight + color.red * (1 - weight));\n const g = Math.floor(this.green * weight + color.green * (1 - weight));\n const b = Math.floor(this.blue * weight + color.blue * (1 - weight));\n return new Color(r, g, b);\n }\n\n brighter() {\n let { red: r, green: g, blue: b } = this;\n\n const i = Math.floor(1.0 / (1.0 - 0.7));\n if (r === 0 && g === 0 && b === 0) {\n return new Color(i, i, i);\n }\n if (r > 0 && r < i) {\n r = i;\n }\n if (g > 0 && g < i) {\n g = i;\n }\n if (b > 0 && b < i) {\n b = i;\n }\n\n return new Color(\n Math.min(Math.floor(this.red / 0.7), 255),\n Math.min(Math.floor(this.green / 0.7), 255),\n Math.min(Math.floor(this.blue / 0.7), 255),\n );\n }\n\n darker() {\n return new Color(\n Math.max(Math.floor(this.red * 0.7), 0),\n Math.max(Math.floor(this.green * 0.7), 0),\n Math.max(Math.floor(this.blue * 0.7), 0),\n );\n }\n\n contrast() {\n return new Color(this.red, 255 - this.green, 255 - this.blue);\n }\n\n hex() {\n let r = this.red.toString(16);\n r = r.length == 1 ? '0' + r : r;\n let g = this.green.toString(16);\n g = g.length == 1 ? '0' + g : g;\n let b = this.blue.toString(16);\n b = b.length == 1 ? '0' + b : b;\n let a = this.alpha.toString(16);\n a = a.length == 1 ? '0' + a : a;\n return `#${r}${g}${b}${a}`;\n }\n\n /** @scriptapi */\n getRGBValue() {\n return this;\n }\n\n /** @scriptapi */\n equals(other: Color) {\n return other && this.toString() === other.toString();\n }\n\n toString() {\n return `rgba(${this.red},${this.green},${this.blue},${this.alpha})`;\n }\n}\n","import { Display } from './Display';\nimport { HitCanvas } from './HitCanvas';\nimport { HitRegionSpecification } from './HitRegionSpecification';\nimport { Point } from './positioning';\n\n/**\n * Swallows any click event wherever they may originate.\n * Usually there's 0 or 1 when the user ends the grab,\n * depending on where the mouse is released.\n */\nconst clickBlocker = (e: MouseEvent) => {\n // Remove ourself. This to prevent capturing unrelated events.\n document.removeEventListener('click', clickBlocker, true /* Must be same as when created */);\n\n e.preventDefault();\n e.stopPropagation();\n return false;\n};\n\n\nfunction isLeftPressed(e: MouseEvent) {\n return (e.buttons & 1) === 1 || (e.buttons === undefined && e.which == 1);\n}\n\n\n/**\n * Minimum movement required before a viewport is in \"grab\" mode.\n * This allows to distinguish grab from regular clicks.\n */\nconst snap = 5;\n\n\nfunction measureDistance(x1: number, y1: number, x2: number, y2: number) {\n return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n}\n\n\n// Compare by id instead of references. HitRegions are allowed to be generated\n// on each draw, whereas the \"id\" could be something more long-term.\nfunction regionMatches(region1?: HitRegionSpecification, region2?: HitRegionSpecification) {\n return region1 && region2 && region1.id === region2.id;\n}\n\n\nexport interface OpiMouseEvent {\n clientX: number;\n clientY: number;\n point: Point;\n}\n\nexport interface OpiGrabEvent extends OpiMouseEvent {\n dx: number;\n dy: number;\n}\n\n\nexport class EventHandler {\n\n private grabbing = false;\n private grabTarget?: HitRegionSpecification;\n private grabPoint?: { x: number, y: number; }; // Relative to canvas\n\n // Global handlers attached only during a grab action.\n // Purpose is to support the user doing grab actions while leaving our canvas.\n private documentMouseMoveListener = (e: MouseEvent) => this.onDocumentMouseMove(e);\n private documentMouseUpListener = (e: MouseEvent) => this.onDocumentMouseUp(e);\n\n private prevEnteredRegion?: HitRegionSpecification;\n\n constructor(private display: Display, private canvas: HTMLCanvasElement, private hitCanvas: HitCanvas) {\n canvas.addEventListener('click', e => this.onCanvasClick(e), false);\n canvas.addEventListener('mousedown', e => this.onCanvasMouseDown(e), false);\n canvas.addEventListener('mouseup', e => this.onCanvasMouseUp(e), false);\n canvas.addEventListener('mouseout', e => this.onCanvasMouseOut(e), false);\n canvas.addEventListener('mousemove', e => this.onCanvasMouseMove(e), false);\n }\n\n private toPoint(event: MouseEvent): Point {\n const bbox = this.canvas.getBoundingClientRect();\n return { x: event.clientX - bbox.left, y: event.clientY - bbox.top };\n }\n\n private onCanvasClick(event: MouseEvent) {\n this.display.clearSelection();\n\n const point = this.toPoint(event);\n if (this.display.editMode) {\n this.selectSingleWidget(point.x, point.y);\n } else {\n const region = this.hitCanvas.getActiveRegion(point.x, point.y);\n if (region && region.click) {\n region.click({\n clientX: event.clientX,\n clientY: event.clientY,\n point,\n });\n }\n }\n }\n\n private onCanvasMouseDown(event: MouseEvent) {\n if (this.display.editMode) {\n return;\n }\n document.removeEventListener('click', clickBlocker, true /* Must be same as when created */);\n\n if (isLeftPressed(event)) {\n const point = this.toPoint(event);\n\n const region = this.hitCanvas.getActiveRegion(point.x, point.y);\n if (region && region.mouseDown) {\n region.mouseDown({\n clientX: event.clientX,\n clientY: event.clientY,\n point,\n });\n }\n\n if (region && region.grab) {\n this.grabPoint = { ...point };\n this.grabTarget = region;\n // Actual grab initialisation is subject to snap (see mousemove)\n }\n\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n }\n\n private onCanvasMouseUp(event: MouseEvent) {\n if (this.display.editMode) {\n return;\n }\n\n const point = this.toPoint(event);\n const region = this.hitCanvas.getActiveRegion(point.x, point.y);\n if (region && region.mouseUp) {\n region.mouseUp();\n }\n }\n\n private onCanvasMouseOut(event: MouseEvent) {\n if (this.prevEnteredRegion && this.prevEnteredRegion.mouseOut) {\n this.prevEnteredRegion.mouseOut();\n }\n this.prevEnteredRegion = undefined;\n\n event.preventDefault();\n event.stopPropagation();\n }\n\n private onCanvasMouseMove(domEvent: MouseEvent) {\n const point = this.toPoint(domEvent);\n const region = this.hitCanvas.getActiveRegion(point.x, point.y);\n\n if (this.prevEnteredRegion && this.prevEnteredRegion.mouseOut) {\n if (!regionMatches(this.prevEnteredRegion, region)) {\n this.prevEnteredRegion.mouseOut();\n }\n }\n\n if (region && region.mouseEnter) {\n if (!regionMatches(this.prevEnteredRegion, region)) {\n region.mouseEnter();\n }\n }\n\n this.prevEnteredRegion = region;\n\n const cursor = (region && region.cursor) ? region.cursor : 'auto';\n if (cursor != this.canvas.style.cursor) {\n this.canvas.style.cursor = cursor;\n }\n\n if (!this.grabbing && region && region.tooltip) {\n this.display.setTooltip(region.tooltip());\n } else {\n this.display.setTooltip(undefined);\n }\n\n if (this.grabPoint && !this.grabbing && isLeftPressed(domEvent)) {\n const distance = measureDistance(this.grabPoint.x, this.grabPoint.y, point.x, point.y);\n if (Math.abs(distance) > snap) {\n this.initiateGrab();\n // Prevent stutter on first move\n if (snap > 0 && this.grabPoint) {\n this.grabPoint = point;\n }\n }\n }\n\n if (this.grabbing && this.grabTarget && isLeftPressed(domEvent)) {\n this.grabTarget.grab!({\n clientX: domEvent.clientX,\n clientY: domEvent.clientY,\n point,\n dx: point.x - this.grabPoint!.x,\n dy: point.y - this.grabPoint!.y,\n });\n }\n }\n\n private initiateGrab() {\n document.addEventListener('click', clickBlocker, true /* capture ! */);\n document.addEventListener('mouseup', this.documentMouseUpListener);\n document.addEventListener('mousemove', this.documentMouseMoveListener);\n this.grabbing = true;\n }\n\n private onDocumentMouseUp(event: MouseEvent) {\n if (this.grabbing) {\n document.removeEventListener('mouseup', this.documentMouseUpListener);\n document.removeEventListener('mousemove', this.documentMouseMoveListener);\n const grabTarget = this.grabTarget;\n this.grabbing = false;\n this.grabPoint = undefined;\n this.grabTarget = undefined;\n if (grabTarget?.grabEnd) {\n grabTarget.grabEnd();\n }\n }\n }\n\n private onDocumentMouseMove(event: MouseEvent) {\n this.onCanvasMouseMove(event);\n }\n\n private selectSingleWidget(x: number, y: number) {\n const instance = this.display.instance;\n if (instance) {\n for (const widget of instance.widgets.slice().reverse()) {\n const x1 = widget.holderX;\n const y1 = widget.holderY;\n const x2 = widget.holderX + widget.holderWidth;\n const y2 = widget.holderY + widget.holderHeight;\n if (x1 < x && x < x2 && y1 < y && y < y2) {\n this.display.selection = [widget.wuid];\n return false;\n }\n }\n }\n }\n}\n","import { HitRegionSpecification } from './HitRegionSpecification';\n\nconst WHITE = 'rgb(255,255,255)';\n\nexport class HitCanvas {\n\n readonly ctx: CanvasRenderingContext2D;\n private regions: { [key: string]: HitRegionSpecification; } = {};\n\n // If present, use the root instead of the local regions map.\n // This avoids color collisions.\n private root?: HitCanvas;\n\n constructor(private parent?: HitCanvas, width?: number, height?: number) {\n const canvas = document.createElement('canvas');\n canvas.width = width ?? canvas.width;\n canvas.height = height ?? canvas.height;\n this.ctx = canvas.getContext('2d')!;\n this.root = parent?.root || parent;\n }\n\n clear() {\n this.regions = {};\n this.ctx.fillStyle = WHITE;\n this.ctx.fillRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n }\n\n beginHitRegion(hitRegion: HitRegionSpecification) {\n const color = (this.root || this).generateUniqueColor();\n (this.root || this).regions[color] = hitRegion;\n\n this.ctx.beginPath();\n this.ctx.fillStyle = color;\n return color;\n }\n\n getActiveRegion(x: number, y: number): HitRegionSpecification | undefined {\n const pixel = this.ctx.getImageData(x, y, 1, 1).data;\n const color = `rgb(${pixel[0]},${pixel[1]},${pixel[2]})`;\n return this.regions[color] || undefined;\n }\n\n createChild(width: number, height: number) {\n // Dimensions are needed for redraw onto a parent HitCanvas.\n return new HitCanvas(this, width, height);\n }\n\n transferToParent(dx: number, dy: number, dw: number, dh: number) {\n if (!this.parent) {\n throw new Error('No parent to transfer to');\n }\n this.parent.ctx.drawImage(this.ctx.canvas, dx, dy, dw, dh);\n }\n\n private generateUniqueColor(): string {\n while (true) {\n const r = Math.round(Math.random() * 255);\n const g = Math.round(Math.random() * 255);\n const b = Math.round(Math.random() * 255);\n const color = `rgb(${r},${g},${b})`;\n\n if (!this.regions[color] && color != WHITE) {\n return color;\n }\n }\n }\n}\n","export interface Bounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/**\n * Sets the specified attributes assuming they use border-box\n * coordinates. This is effectively the same as shrinking by\n * half the stroke size.\n */\nexport function toBorderBox(x: number, y: number, width: number, height: number, lineWidth: number): Bounds {\n return shrink({ x, y, width, height }, lineWidth / 2);\n}\n\nexport function outline(x: number, y: number, width: number, height: number, strokeWidth: number): Bounds {\n const inset = Math.max(1, strokeWidth) / 2.0;\n const inset1 = Math.floor(inset);\n const inset2 = Math.ceil(inset);\n return {\n x: x + inset1,\n y: y + inset1,\n width: width - inset1 - inset2,\n height: height - inset1 - inset2,\n };\n}\n\nexport function rotatePoint(x: number, y: number, cx: number, cy: number, angle: number): Point {\n // double trueAngle = Math.toRadians(angle);\n const sin = Math.sin(angle);\n const cos = Math.cos(angle);\n\n // Relative coordinates to the rotation point\n const relX = x - cx;\n const relY = y - cy;\n\n const temp = relX * cos - relY * sin;\n\n return { x: temp + cx, y: (relX * sin + relY * cos) + cy };\n}\n\n/**\n * Returns new bounds where the width and height are shrinked.\n */\nexport function shrink(original: Bounds, v: number, h?: number): Bounds {\n if (h === undefined) {\n h = v;\n }\n return {\n x: original.x + h,\n y: original.y + v,\n width: original.width - (h + h),\n height: original.height - (v + v),\n };\n}\n\nexport function crispen(original: Bounds): Bounds {\n return {\n x: Math.round(original.x) + 0.5,\n y: Math.round(original.y) + 0.5,\n width: Math.round(original.width),\n height: Math.round(original.height),\n };\n}\n\nexport function intersect(area1: Bounds, area2: Bounds): Bounds {\n let x1a = area1.x;\n let y1a = area1.y;\n let x2a = x1a + area1.width;\n let y2a = y1a + area1.height;\n if (x2a < x1a) {\n const swap = x1a;\n x1a = x2a;\n x2a = swap;\n }\n if (y2a < y1a) {\n const swap = y1a;\n y1a = y2a;\n y2a = swap;\n }\n\n let x1b = area2.x;\n let y1b = area2.y;\n let x2b = x1b + area2.width;\n let y2b = y1b + area2.height;\n if (x2b < x1b) {\n const swap = x1b;\n x1b = x2b;\n x2b = swap;\n }\n if (y2b < y1b) {\n const swap = y1b;\n y1b = y2b;\n y2b = swap;\n }\n\n const x = Math.max(x1a, x1b);\n const y = Math.max(y1a, y1b);\n return {\n x,\n y,\n width: Math.min(x2a, x2b) - x,\n height: Math.min(y2a, y2b) - y,\n }\n}\n\nexport function translatePoint(point: Point, dx: number, dy: number) {\n return {\n x: point.x + dx,\n y: point.y + dy,\n };\n}\n\nexport function translatePoints(points: Point[], dx: number, dy: number) {\n return points.map(point => translatePoint(point, dx, dy));\n}\n\nexport function toRadians(degrees: number) {\n return degrees * Math.PI / 180;\n}\n\nexport function getDistance(p1: Point, p2: Point) {\n return Math.sqrt(((p2.x - p1.x) * (p2.x - p1.x)) + ((p2.y - p1.y) * (p2.y - p1.y)));\n}\n\nexport function findRelativePoint(p0: Point, p1: Point, distanceRatio: number): Point {\n const d = getDistance(p0, p1);\n const t = distanceRatio / d;\n return {\n x: ((1 - t) * p0.x) + (t * p1.x),\n y: ((1 - t) * p0.y) + (t * p1.y),\n };\n}\n\nexport function convertPolarToCartesian(r: number, theta: number, bounds: Bounds): Point {\n const x = Math.floor(r * Math.cos(theta));\n const y = Math.floor(-r * Math.sin(theta)); // hmm\n return {\n x: bounds.x + bounds.width / 2 + x,\n y: bounds.y + bounds.height / 2 + y,\n };\n}\n\nexport function convertPolarToCartesian2(rx: number, ry: number, theta: number): Point {\n const x = Math.floor(rx * Math.cos(theta));\n const y = Math.floor(ry * Math.sin(theta));\n return { x, y };\n}\n\n/**\n * Convert a point to a polar point\n *\n * @param pole pole of the polar coordinate system\n * @param point the point to be converted\n */\nexport function convertCartesianToPolar(pole: Point, point: Point) {\n const x = point.x - pole.x;\n const y = point.y - pole.y;\n\n const r = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n\n let theta = Math.acos(x / r);\n if (y > 0) {\n theta = 2 * Math.PI - theta;\n }\n return new PolarPoint(Math.floor(r), theta);\n}\n\nexport class PolarPoint {\n constructor(readonly r: number, readonly theta: number) {\n }\n\n /**\n * Transform the polar point to the {@link Point} in rectangular coordinates.\n * The rectangular coordinates has the same origin as the polar coordinates.\n *\n * @return the point in rectangular coordinates\n */\n toPoint(): Point {\n const x = Math.floor(this.r * Math.cos(this.theta));\n const y = Math.floor(-this.r * Math.sin(this.theta));\n return { x, y };\n }\n}\n\nexport function scalePoints(points: Point[], scale: number): Point[] {\n return points.map(p => ({ x: p.x * scale, y: p.y * scale }));\n}\n","export function roundRect(ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, rx: number, ry: number) {\n ctx.beginPath();\n if (!rx && !ry) {\n ctx.rect(x, y, w, h);\n } else {\n if (w < 2 * rx) {\n rx = w / 2;\n }\n if (h < 2 * ry) {\n ry = h / 2;\n }\n ctx.moveTo(x + rx, y);\n ctx.lineTo(x + w - rx, y);\n ctx.quadraticCurveTo(x + w, y, x + w, y + ry);\n ctx.lineTo(x + w, y + h - ry);\n ctx.quadraticCurveTo(x + w, y + h, x + w - rx, y + h);\n ctx.lineTo(x + rx, y + h);\n ctx.quadraticCurveTo(x, y + h, x, y + h - ry);\n ctx.lineTo(x, y + ry);\n ctx.quadraticCurveTo(x, y, x + rx, y);\n }\n}\n\nexport function normalizePath(base: string, relPath: string) {\n base = '/' + base;\n let nUpLn;\n let sDir = '';\n const sPath = base.replace(/[^\\/]*$/, relPath.replace(/(\\/|^)(?:\\.?\\/+)+/g, '$1'));\n let nStart = 0;\n for (let nEnd; nEnd = sPath.indexOf('/../', nStart), nEnd > -1; nStart = nEnd + nUpLn) {\n nUpLn = /^\\/(?:\\.\\.\\/)*/.exec(sPath.slice(nEnd))![0].length;\n sDir = (sDir + sPath.substring(nStart, nEnd)).replace(\n new RegExp('(?:\\\\\\/+[^\\\\\\/]*){0,' + ((nUpLn - 1) / 3) + '}$'), '/');\n }\n return (sDir + sPath.substr(nStart)).substr(1);\n}\n","import { Color } from './Color';\nimport { Font } from './Font';\nimport { HitCanvas } from './HitCanvas';\nimport { HitRegionSpecification } from './HitRegionSpecification';\nimport { Bounds, Point, shrink } from './positioning';\nimport * as utils from './utils';\n\n\ninterface RectColorFill {\n x: number;\n y: number;\n width: number;\n height: number;\n color: Color;\n rx?: number;\n ry?: number;\n opacity?: number;\n}\n\ninterface RectGradientFill {\n x: number;\n y: number;\n width: number;\n height: number;\n gradient: CanvasGradient;\n rx?: number;\n ry?: number;\n opacity?: number;\n}\n\ntype RectFill = RectColorFill | RectGradientFill;\n\ninterface TextFill {\n x: number;\n y: number;\n baseline: 'top' | 'middle' | 'bottom';\n align: 'left' | 'right' | 'center';\n font: Font;\n color: Color;\n text: string;\n}\n\ninterface EllipseColorFill {\n cx: number;\n cy: number;\n rx: number;\n ry: number;\n color: Color;\n startAngle?: number;\n endAngle?: number;\n anticlockwise?: boolean;\n opacity?: number;\n}\n\ninterface EllipseGradientFill {\n cx: number;\n cy: number;\n rx: number;\n ry: number;\n gradient: CanvasGradient;\n startAngle?: number;\n endAngle?: number;\n anticlockwise?: boolean;\n opacity?: number;\n}\n\ntype EllipseFill = EllipseColorFill | EllipseGradientFill;\n\ninterface EllipseColorStroke {\n cx: number;\n cy: number;\n rx: number;\n ry: number;\n lineWidth: number;\n color: Color;\n startAngle?: number;\n endAngle?: number;\n anticlockwise?: boolean;\n dash?: number[];\n}\n\ninterface EllipseGradientStroke {\n cx: number;\n cy: number;\n rx: number;\n ry: number;\n lineWidth: number;\n gradient: CanvasGradient;\n startAngle?: number;\n endAngle?: number;\n anticlockwise?: boolean;\n dash?: number[];\n}\n\ntype EllipseStroke = EllipseColorStroke | EllipseGradientStroke;\n\ninterface RectStroke {\n x: number;\n y: number;\n width: number;\n height: number;\n color: Color;\n rx?: number;\n ry?: number;\n lineWidth?: number;\n dash?: number[];\n crispen?: boolean;\n}\n\ninterface PathStroke {\n path: Path;\n color: Color;\n lineWidth?: number;\n dash?: number[];\n opacity?: number;\n}\n\ninterface PathColorFill {\n path: Path;\n color: Color;\n opacity?: number;\n}\n\ninterface PathGradientFill {\n path: Path;\n gradient: CanvasGradient;\n opacity?: number;\n}\n\ntype PathFill = PathColorFill | PathGradientFill;\n\nexport class Graphics {\n\n readonly ctx: CanvasRenderingContext2D;\n\n readonly hitCanvas: HitCanvas;\n readonly hitCtx: CanvasRenderingContext2D;\n\n constructor(readonly canvas: HTMLCanvasElement, hitCanvas?: HitCanvas) {\n this.ctx = canvas.getContext('2d')!;\n this.hitCanvas = hitCanvas ? hitCanvas : new HitCanvas();\n this.hitCtx = this.hitCanvas.ctx;\n }\n\n createChild(width: number, height: number) {\n const tmpHitCanvas = this.hitCanvas.createChild(width, height);\n const childCanvas = document.createElement('canvas');\n childCanvas.width = width;\n childCanvas.height = height;\n return new Graphics(childCanvas, tmpHitCanvas);\n }\n\n translate(x: number, y: number) {\n this.ctx.translate(x, y);\n this.hitCtx.translate(x, y);\n }\n\n copy(g: Graphics, dx: number, dy: number) {\n this.ctx.drawImage(g.canvas, dx, dy);\n g.hitCanvas.transferToParent(dx, dy, g.canvas.width, g.canvas.height);\n }\n\n copyFitted(g: Graphics, dx: number, dy: number, dw: number, dh: number) {\n const { width: sw, height: sh } = g.canvas;\n const ratio = sw / sh;\n let fitw = dw;\n let fith = fitw / ratio;\n if (fith > dh) {\n fith = dh;\n fitw = fith * ratio;\n }\n this.copyScaled(g, dx, dy, fitw, fith);\n }\n\n copyScaled(g: Graphics, dx: number, dy: number, dw: number, dh: number) {\n this.ctx.drawImage(g.canvas, dx, dy, dw, dh);\n g.hitCanvas.transferToParent(dx, dy, dw, dh);\n }\n\n clearHitCanvas() {\n this.hitCanvas.clear();\n }\n\n fillCanvas(color: Color) {\n this.ctx.fillStyle = color.toString();\n this.ctx.fillRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n }\n\n clearCanvas() {\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n }\n\n /**\n * Perform a CSS-level rescale of the Canvas.\n *\n * This resamples the bitmapped canvas area to fit the area made available\n * by CSS.\n */\n scaleCanvas(width: number, height: number) {\n this.ctx.canvas.style.width = width + 'px';\n this.ctx.canvas.style.height = height + 'px';\n }\n\n resize(width: number, height: number) {\n // Careful not to reset dimensions all the time (it does lots of stuff)\n if (this.ctx.canvas.width != width || this.ctx.canvas.height != height) {\n this.ctx.canvas.width = width;\n this.ctx.canvas.height = height;\n this.hitCanvas.ctx.canvas.width = width;\n this.hitCanvas.ctx.canvas.height = height;\n }\n }\n\n fillRect(fill: RectFill) {\n if ('color' in fill) {\n this.ctx.fillStyle = fill.color.toString();\n } else {\n this.ctx.fillStyle = fill.gradient;\n }\n\n if (fill.opacity !== undefined) {\n this.ctx.globalAlpha = fill.opacity;\n }\n\n if (fill.rx || fill.ry) {\n utils.roundRect(this.ctx, fill.x, fill.y, fill.width, fill.height, fill.rx || 0, fill.ry || 0);\n this.ctx.fill();\n } else {\n this.ctx.fillRect(fill.x, fill.y, fill.width, fill.height);\n }\n\n if (fill.opacity !== undefined) {\n this.ctx.globalAlpha = 1;\n }\n }\n\n fillText(fill: TextFill) {\n this.ctx.textBaseline = fill.baseline;\n this.ctx.textAlign = fill.align;\n this.ctx.font = fill.font.getFontString();\n this.ctx.fillStyle = fill.color.toString();\n this.ctx.fillText(fill.text, fill.x, fill.y);\n }\n\n fillEllipse(fill: EllipseFill) {\n this.ctx.beginPath();\n const startAngle = fill.startAngle || 0;\n const endAngle = (fill.endAngle === undefined) ? 2 * Math.PI : fill.endAngle;\n this.ctx.ellipse(fill.cx, fill.cy,\n fill.rx, fill.ry, 0, startAngle, endAngle, fill.anticlockwise);\n if ('color' in fill) {\n this.ctx.fillStyle = fill.color.toString();\n } else {\n this.ctx.fillStyle = fill.gradient;\n }\n\n if (fill.opacity !== undefined) {\n this.ctx.globalAlpha = fill.opacity;\n }\n\n this.ctx.fill();\n\n if (fill.opacity !== undefined) {\n this.ctx.globalAlpha = 1;\n }\n }\n\n strokeEllipse(stroke: EllipseStroke) {\n if (stroke.dash) {\n this.ctx.setLineDash(stroke.dash);\n }\n this.ctx.lineWidth = stroke.lineWidth || 1;\n this.ctx.beginPath();\n const startAngle = stroke.startAngle || 0;\n const endAngle = (stroke.endAngle === undefined) ? 2 * Math.PI : stroke.endAngle;\n this.ctx.ellipse(stroke.cx, stroke.cy,\n stroke.rx, stroke.ry, 0, startAngle, endAngle, stroke.anticlockwise);\n if ('color' in stroke) {\n this.ctx.strokeStyle = stroke.color.toString();\n } else {\n this.ctx.strokeStyle = stroke.gradient;\n }\n this.ctx.stroke();\n if (stroke.dash) {\n this.ctx.setLineDash([]);\n }\n }\n\n measureText(text: string, font: Font) {\n this.ctx.font = font.getFontString();\n const width = this.ctx.measureText(text).width;\n const height = font.height;\n return { width, height };\n }\n\n createLinearGradient(x0: number, y0: number, x1: number, y1: number) {\n return this.ctx.createLinearGradient(x0, y0, x1, y1);\n }\n\n strokeRect(stroke: RectStroke) {\n if (stroke.dash) {\n this.ctx.setLineDash(stroke.dash);\n }\n const lineWidth = stroke.lineWidth || 1;\n this.ctx.lineWidth = lineWidth;\n this.ctx.strokeStyle = stroke.color.toString();\n if (stroke.crispen && lineWidth) {\n const box = shrink(stroke, lineWidth / 2, lineWidth / 2);\n if (stroke.rx || stroke.ry) {\n utils.roundRect(this.ctx, box.x, box.y, box.width, box.height, stroke.rx || 0, stroke.ry || 0);\n this.ctx.stroke();\n } else {\n this.ctx.strokeRect(box.x, box.y, box.width, box.height);\n }\n } else {\n if (stroke.rx || stroke.ry) {\n utils.roundRect(this.ctx, stroke.x, stroke.y, stroke.width, stroke.height, stroke.rx || 0, stroke.ry || 0);\n this.ctx.stroke();\n } else {\n this.ctx.strokeRect(stroke.x, stroke.y, stroke.width, stroke.height);\n }\n }\n if (stroke.dash) {\n this.ctx.setLineDash([]);\n }\n }\n\n strokePath(stroke: PathStroke) {\n if (stroke.dash) {\n this.ctx.setLineDash(stroke.dash);\n }\n this.ctx.beginPath();\n for (const segment of stroke.path.segments) {\n if (segment.line) {\n this.ctx.lineTo(segment.x, segment.y);\n } else {\n this.ctx.moveTo(segment.x, segment.y);\n }\n }\n this.ctx.lineWidth = stroke.lineWidth || 1;\n this.ctx.strokeStyle = stroke.color.toString();\n\n if (stroke.opacity !== undefined) {\n this.ctx.globalAlpha = stroke.opacity;\n }\n\n this.ctx.stroke();\n\n if (stroke.opacity !== undefined) {\n this.ctx.globalAlpha = 1;\n }\n if (stroke.dash) {\n this.ctx.setLineDash([]);\n }\n }\n\n fillPath(fill: PathFill) {\n this.ctx.beginPath();\n for (const segment of fill.path.segments) {\n if (segment.line) {\n this.ctx.lineTo(segment.x, segment.y);\n } else {\n this.ctx.moveTo(segment.x, segment.y);\n }\n }\n if ('color' in fill) {\n this.ctx.fillStyle = fill.color.toString();\n } else {\n this.ctx.fillStyle = fill.gradient;\n }\n\n if (fill.opacity !== undefined) {\n this.ctx.globalAlpha = fill.opacity;\n }\n\n this.ctx.fill(\"evenodd\"); // Match with Draw2D behavior\n\n if (fill.opacity !== undefined) {\n this.ctx.globalAlpha = 1;\n }\n }\n\n addHitRegion(region: HitRegionSpecification) {\n this.hitCanvas.beginHitRegion(region);\n return new HitRegionBuilder(this.hitCanvas.ctx);\n }\n}\n\ninterface PathSegment {\n x: number;\n y: number;\n line: boolean;\n}\n\nexport class Path {\n\n segments: PathSegment[] = [];\n\n constructor(x: number, y: number) {\n this.segments.push({ x, y, line: false });\n }\n\n static fromPoints(points: Point[]) {\n const path = new Path(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n path.lineTo(points[i].x, points[i].y);\n }\n return path;\n }\n\n getBoundingBox(): Bounds {\n const tl: Point = { x: this.segments[0].x, y: this.segments[0].y };\n const br: Point = { x: this.segments[0].x, y: this.segments[0].y };\n for (let i = 0; i < this.segments.length; i++) {\n const point = this.segments[i];\n if (point.x < tl.x) {\n tl.x = point.x;\n }\n if (point.x > br.x) {\n br.x = point.x;\n }\n if (point.y < tl.y) {\n tl.y = point.y;\n }\n if (point.y > br.y) {\n br.y = point.y;\n }\n }\n return { x: tl.x, y: tl.y, width: br.x - tl.x, height: br.y - tl.y };\n }\n\n lineTo(x: number, y: number) {\n this.segments.push({ x, y, line: true });\n return this;\n }\n\n moveTo(x: number, y: number) {\n this.segments.push({ x, y, line: false });\n return this;\n }\n\n closePath() {\n const orig = this.segments[0];\n this.segments.push({ x: orig.x, y: orig.y, line: true });\n return this;\n }\n\n translate(x: number, y: number) {\n for (const point of this.segments) {\n point.x += x;\n point.y += y;\n }\n return this;\n }\n}\n\nexport class HitRegionBuilder {\n\n constructor(private ctx: CanvasRenderingContext2D) {\n }\n\n addRect(x: number, y: number, width: number, height: number) {\n this.ctx.fillRect(x, y, width, height);\n return this;\n }\n\n addEllipse(cx: number, cy: number, rx: number, ry: number, rotation: number, startAngle: number, endAngle: number, anticlockwise?: boolean) {\n this.ctx.beginPath();\n this.ctx.ellipse(cx, cy, rx, ry, rotation, startAngle, endAngle, anticlockwise);\n this.ctx.fill();\n }\n\n addPath(path: Path) {\n this.ctx.beginPath();\n for (const segment of path.segments) {\n if (segment.line) {\n this.ctx.lineTo(segment.x, segment.y);\n } else {\n this.ctx.moveTo(segment.x, segment.y);\n }\n }\n this.ctx.fill();\n }\n}\n","import { ActionSet } from './actions';\nimport { Color } from './Color';\nimport { ColorMap } from './ColorMap';\nimport { Font } from './Font';\nimport { MacroSet } from './macros';\nimport { Point } from './positioning';\nimport { RuleSet } from './rules';\nimport { AutoScaleWidgets, ScaleOptions } from './scale';\nimport { ScriptSet } from './scripts';\nimport { Widget } from './Widget';\nimport { XMLNode } from './XMLNode';\n\nexport type PropertyGenerator = () => Property<any>[];\n\nexport class PropertySet {\n\n private properties = new Map<string, Property<any>>();\n private generators: PropertyGenerator[] = [];\n\n constructor(private widget: Widget, properties: Property<any>[] = []) {\n for (const property of properties) {\n this.properties.set(property.name, property);\n }\n }\n\n clear() {\n this.properties.clear();\n }\n\n add(property: Property<any>) {\n this.properties.set(property.name, property);\n }\n\n /**\n * Add a property generator. Generators can access the effective\n * value of static properties to determine property names.\n */\n addGenerator(generator: PropertyGenerator) {\n this.generators.push(generator);\n }\n\n all() {\n return this.properties.values();\n }\n\n private loadProperty(node: XMLNode, property: Property<any>) {\n if (node.hasNode(property.name)) {\n if (property instanceof ActionsProperty) {\n property.value = node.getActions(property.name);\n } else if (property instanceof AutoScaleWidgetsProperty) {\n property.value = node.getAutoScaleWidgets(property.name);\n } else if (property instanceof BooleanProperty) {\n property.value = node.getBoolean(property.name);\n } else if (property instanceof ColorMapProperty) {\n property.value = node.getColorMap(property.name);\n } else if (property instanceof ColorProperty) {\n property.value = node.getColor(property.name);\n } else if (property instanceof FloatProperty) {\n property.value = node.getFloat(property.name);\n } else if (property instanceof FontProperty) {\n property.value = node.getFont(property.name);\n } else if (property instanceof IntProperty) {\n property.value = node.getInt(property.name);\n } else if (property instanceof MacrosProperty) {\n property.value = node.getMacros(property.name);\n } else if (property instanceof PointsProperty) {\n property.value = node.getPoints(property.name);\n } else if (property instanceof PVValueProperty) {\n // Value determined when needed.\n } else if (property instanceof RulesProperty) {\n property.value = node.getRules(property.name);\n } else if (property instanceof ScaleOptionsProperty) {\n property.value = node.getScaleOptions(property.name);\n } else if (property instanceof ScriptsProperty) {\n property.value = node.getScripts(property.name);\n } else if (property instanceof StringProperty) {\n // The non-raw value is set below (after reading in other properties)\n (property as StringProperty).rawValue = node.getString(property.name);\n } else if (property instanceof StringListProperty) {\n property.value = node.getStringList(property.name);\n } else if (property instanceof StringTableProperty) {\n property.value = node.getStringTable(property.name);\n } else {\n throw new Error(`Property ${property.name} has an unexpected type`);\n }\n }\n }\n\n loadXMLValues(node: XMLNode) {\n this.properties.forEach(property => {\n this.loadProperty(node, property);\n });\n\n // Do this a first time, so that string properties\n // are available to generators (e.g. wuid).\n this.resolveStringProperties();\n\n for (const generator of this.generators) {\n for (const property of generator()) {\n this.properties.set(property.name, property);\n this.loadProperty(node, property);\n }\n }\n this.resolveStringProperties();\n }\n\n private resolveStringProperties() {\n // Expand macros only after reading in all properties\n // (we need the values of other properties)\n for (let i = 0; i < 2; i++) { // Twice, in case properties depend on each other.\n this.properties.forEach(property => {\n if (property instanceof StringProperty) {\n const stringProperty = property as StringProperty;\n if (stringProperty.rawValue !== undefined) {\n property.value = this.widget.expandMacro(stringProperty.rawValue);\n } else {\n property.value = stringProperty.rawValue;\n }\n }\n });\n }\n }\n\n getProperty(propertyName: string) {\n return this.properties.get(propertyName);\n }\n\n getValue(propertyName: string, optional = false) {\n const prop = this.properties.get(propertyName);\n if (prop && prop.value !== undefined) {\n return prop.value;\n } else {\n if (!optional) {\n throw new Error(`Missing property ${propertyName}`);\n }\n }\n }\n\n setValue(propertyName: string, value: any) {\n const prop = this.properties.get(propertyName);\n if (!prop) {\n throw new Error(`Cannot set value of unknown property ${propertyName}`);\n }\n prop.value = value;\n }\n}\n\nexport abstract class Property<T> {\n\n private _value?: T;\n private listeners?: PropertyListener<T>[];\n\n constructor(readonly name: string, readonly defaultValue?: T) {\n this.value = defaultValue;\n }\n\n get value(): T | undefined { return this._value; }\n set value(value: T | undefined) {\n if (this.value !== value) {\n const oldValue = this._value;\n this._value = value;\n if (this.listeners) {\n for (const listener of this.listeners) {\n listener(value, oldValue);\n }\n }\n }\n }\n\n addListener(listener: PropertyListener<T>) {\n this.listeners = this.listeners || [];\n this.listeners.push(listener);\n }\n\n removeListener(listener: PropertyListener<T>) {\n const listeners = this.listeners || [];\n const idx = listeners.indexOf(listener);\n if (idx !== -1) {\n listeners.splice(idx, 1);\n }\n }\n\n printScriptValue(value: T) {\n return String(value);\n }\n}\n\nexport type PropertyListener<T> = (newValue?: T, oldValue?: T) => void;\n\nexport class StringProperty extends Property<string> {\n /**\n * Has macros unexpanded\n */\n rawValue?: string;\n\n printScriptValue(value: String) {\n return `\"${value.replace('\"', '\\\\\"')}\"`;\n }\n}\n\nexport class PVValueProperty extends Property<any> {\n constructor(name: string, readonly pvPropertyName: string) {\n super(name);\n }\n}\n\nexport class IntProperty extends Property<number> {\n}\n\nexport class FloatProperty extends Property<number> {\n}\n\nexport class BooleanProperty extends Property<boolean> {\n}\n\nexport class ColorProperty extends Property<Color> {\n printScriptValue(value: Color) {\n const { red, green, blue } = { ...value };\n return `ColorFontUtil.getColorFromRGB(${red}, ${green}, ${blue})`;\n }\n}\n\nexport class FontProperty extends Property<Font> {\n printScriptValue(value: Font) {\n const { name, height, style } = { ...value };\n return `ColorFontUtil.getFont(\"${name}\", ${height}, ${style})`;\n }\n}\n\nexport class ColorMapProperty extends Property<ColorMap> {\n printScriptValue(value: ColorMap) {\n return `${value.code}`;\n }\n}\n\nexport class PointsProperty extends Property<Point[]> {\n}\n\nexport class ActionsProperty extends Property<ActionSet> {\n}\n\nexport class MacrosProperty extends Property<MacroSet> {\n}\n\nexport class ScriptsProperty extends Property<ScriptSet> {\n}\n\nexport class StringListProperty extends Property<string[]> {\n}\n\nexport class StringTableProperty extends Property<string[][]> {\n}\n\nexport class RulesProperty extends Property<RuleSet> {\n}\n\nexport class ScaleOptionsProperty extends Property<ScaleOptions> {\n}\n\nexport class AutoScaleWidgetsProperty extends Property<AutoScaleWidgets> {\n}\n","export class ActionSet {\n\n actions: (Action | null)[] = [];\n hookFirstActionToClick = false;\n hookAllActionsToClick = false;\n\n add(action: Action | null) {\n this.actions.push(action);\n }\n\n isClickable() {\n return this.actions.length\n && (this.hookFirstActionToClick || this.hookAllActionsToClick);\n }\n\n getAction(index: number) {\n if (index >= this.actions.length) {\n return;\n }\n return this.actions[index];\n }\n\n getClickActions() {\n const indexes = [];\n if (this.hookFirstActionToClick) {\n indexes.push(0);\n } else if (this.hookAllActionsToClick) {\n for (let i = 0; i < this.actions.length; i++) {\n indexes.push(i);\n }\n }\n return indexes;\n }\n\n // Called by the macro $(actions)\n toString() {\n if (this.actions.length === 1) {\n return String(this.actions[0]) || this.actions[0]!.type;\n } else {\n return `${this.actions.length} actions`\n }\n }\n}\n\ntype Action =\n ExecuteCommandAction |\n ExecuteJavaScriptAction |\n OpenDisplayAction |\n OpenFileAction |\n OpenWebpageAction |\n WritePVAction |\n PlaySoundAction;\n\nexport class OpenDisplayAction {\n readonly type = 'OPEN_DISPLAY';\n mode?: number;\n description?: string;\n constructor(public path: string) { }\n toString() {\n return `Open ${this.path}`;\n }\n}\n\nexport class OpenFileAction {\n readonly type = 'OPEN_FILE';\n path?: string;\n description?: string;\n toString() {\n return `Open ${this.path}`;\n }\n}\n\nexport class ExecuteJavaScriptAction {\n readonly type = 'EXECUTE_JAVASCRIPT';\n text?: string;\n path?: string;\n description?: string;\n constructor(public embedded: boolean) { }\n toString() {\n return `Execute JavaScript`;\n }\n}\n\nexport class ExecuteCommandAction {\n readonly type = 'EXECUTE_CMD';\n command?: string;\n commandDirectory?: string;\n waitTime?: number;\n description?: string;\n toString() {\n return `Execute Command ${this.command}`;\n }\n}\n\nexport class WritePVAction {\n readonly type = 'WRITE_PV';\n confirmMessage?: string;\n description?: string;\n constructor(public pvName: string, public value: string) { }\n toString() {\n return `Write ${this.value} to ${this.pvName}`;\n }\n}\n\nexport class PlaySoundAction {\n readonly type = 'PLAY_SOUND';\n path?: string;\n description?: string;\n toString() {\n return `Play WAV File ${this.path}`;\n }\n}\n\nexport class OpenWebpageAction {\n readonly type = 'OPEN_WEBPAGE';\n hyperlink?: string;\n description?: string;\n toString() {\n return `Open Webpage ${this.hyperlink}`;\n }\n}\n","type rgb = [number, number, number];\n\nexport class ColorMap {\n\n // These are not guaranteed to be\n // sorted (in case of custom color map).\n private values: number[] = [];\n private colors: rgb[] = [];\n\n // Sorted array of [value, color] tuples.\n // This data is only set (or updated) when\n // compile() is called.\n private entries: Array<[number, rgb]> = [];\n\n private dirty = true;\n\n constructor(\n readonly code: number,\n private interpolate: boolean,\n readonly autoscale: boolean,\n ) {\n if (code === 0) { // Custom\n // Set by XML parser\n } else if (code === 1) { // GrayScale\n this.values = [0, 1];\n this.colors = [\n [0, 0, 0],\n [255, 255, 255],\n ];\n } else if (code === 2) { // JET\n this.values = [0, 0.111, 0.365, 0.619, 0.873, 1];\n this.colors = [\n [0, 0, 143],\n [0, 0, 255],\n [0, 255, 255],\n [255, 255, 0],\n [255, 0, 0],\n [128, 0, 0],\n ];\n } else if (code === 3) { // ColorSpectrum\n this.values = [0, 0.126, 0.251, 0.375, 0.5, 0.625, 0.749, 0.874, 1];\n this.colors = [\n [0, 0, 0],\n [255, 0, 255],\n [0, 0, 255],\n [0, 255, 255],\n [0, 255, 0],\n [255, 255, 0],\n [255, 128, 0],\n [255, 0, 0],\n [255, 255, 255],\n ];\n } else if (code === 4) { // Hot\n this.values = [0, 0.365, 0.746, 1];\n this.colors = [\n [11, 0, 0],\n [255, 0, 0],\n [255, 255, 0],\n [255, 255, 255],\n ];\n } else if (code === 5) { // Cool\n this.values = [0, 1];\n this.colors = [\n [0, 255, 255],\n [255, 0, 255],\n ];\n } else if (code === 6) { // Shaded\n this.values = [0, 0.5, 1];\n this.colors = [\n [0, 0, 0],\n [255, 0, 0],\n [255, 255, 255],\n ];\n }\n }\n\n addMapping(value: number, red: number, green: number, blue: number) {\n this.values.push(value);\n this.colors.push([red, green, blue]);\n this.dirty = true;\n }\n\n private compile() {\n // Put the mapping in a structure suited for sorting\n this.entries.length = 0;\n for (let i = 0; i < this.values.length; i++) {\n this.entries.push([this.values[i], this.colors[i]]);\n }\n\n // Sort by value\n this.entries.sort((a, b) => a[0] < b[0] ? -1 : (a[0] > b[0] ? 1 : 0));\n }\n\n lookup(value: number): rgb {\n if (this.dirty) {\n this.compile();\n this.dirty = false;\n }\n\n let idx = this.binarySearch(value);\n if (idx >= 0) {\n return this.entries[idx][1];\n } else { // No direct match\n idx = -idx - 1;\n if (idx === 0) {\n return this.entries[idx][1];\n } else if (idx === this.entries.length) {\n return this.entries[idx - 1][1];\n } else if (this.interpolate) {\n const [start, startColor] = this.entries[idx - 1];\n const [stop, stopColor] = this.entries[idx];\n const f = (value - start) / (stop - start);\n const r = Math.floor((stopColor[0] - startColor[0]) * f + startColor[0]);\n const g = Math.floor((stopColor[1] - startColor[1]) * f + startColor[1]);\n const b = Math.floor((stopColor[2] - startColor[2]) * f + startColor[2]);\n return [r, g, b];\n } else {\n return this.entries[idx - 1][1];\n }\n }\n }\n\n getMinMax() {\n const min = Math.min.apply(Math, this.values);\n const max = Math.max.apply(Math, this.values);\n return [min, max];\n }\n\n /**\n * Returns the index of the value in the sorted entry list.\n * If the value is not found, returns a negative number\n * describing which (when negated), tells the insert\n * position of the provide value.\n */\n private binarySearch(value: number): number {\n let m = 0;\n let n = this.entries.length - 1;\n while (m <= n) {\n const k = (n + m) >> 1;\n if (value > this.entries[k][0]) {\n m = k + 1;\n } else if (value < this.entries[k][0]) {\n n = k - 1;\n } else {\n return k;\n }\n }\n return -m - 1;\n }\n}\n","/* Font Face Observer v2.1.0 - © Bram Stein. License: BSD-3-Clause */(function(){function l(a,b){document.addEventListener?a.addEventListener(\"scroll\",b,!1):a.attachEvent(\"scroll\",b)}function m(a){document.body?a():document.addEventListener?document.addEventListener(\"DOMContentLoaded\",function c(){document.removeEventListener(\"DOMContentLoaded\",c);a()}):document.attachEvent(\"onreadystatechange\",function k(){if(\"interactive\"==document.readyState||\"complete\"==document.readyState)document.detachEvent(\"onreadystatechange\",k),a()})};function t(a){this.a=document.createElement(\"div\");this.a.setAttribute(\"aria-hidden\",\"true\");this.a.appendChild(document.createTextNode(a));this.b=document.createElement(\"span\");this.c=document.createElement(\"span\");this.h=document.createElement(\"span\");this.f=document.createElement(\"span\");this.g=-1;this.b.style.cssText=\"max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;\";this.c.style.cssText=\"max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;\";\nthis.f.style.cssText=\"max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;\";this.h.style.cssText=\"display:inline-block;width:200%;height:200%;font-size:16px;max-width:none;\";this.b.appendChild(this.h);this.c.appendChild(this.f);this.a.appendChild(this.b);this.a.appendChild(this.c)}\nfunction u(a,b){a.a.style.cssText=\"max-width:none;min-width:20px;min-height:20px;display:inline-block;overflow:hidden;position:absolute;width:auto;margin:0;padding:0;top:-999px;white-space:nowrap;font-synthesis:none;font:\"+b+\";\"}function z(a){var b=a.a.offsetWidth,c=b+100;a.f.style.width=c+\"px\";a.c.scrollLeft=c;a.b.scrollLeft=a.b.scrollWidth+100;return a.g!==b?(a.g=b,!0):!1}function A(a,b){function c(){var a=k;z(a)&&a.a.parentNode&&b(a.g)}var k=a;l(a.b,c);l(a.c,c);z(a)};function B(a,b){var c=b||{};this.family=a;this.style=c.style||\"normal\";this.weight=c.weight||\"normal\";this.stretch=c.stretch||\"normal\"}var C=null,D=null,E=null,F=null;function G(){if(null===D)if(J()&&/Apple/.test(window.navigator.vendor)){var a=/AppleWebKit\\/([0-9]+)(?:\\.([0-9]+))(?:\\.([0-9]+))/.exec(window.navigator.userAgent);D=!!a&&603>parseInt(a[1],10)}else D=!1;return D}function J(){null===F&&(F=!!document.fonts);return F}\nfunction K(){if(null===E){var a=document.createElement(\"div\");try{a.style.font=\"condensed 100px sans-serif\"}catch(b){}E=\"\"!==a.style.font}return E}function L(a,b){return[a.style,a.weight,K()?a.stretch:\"\",\"100px\",b].join(\" \")}\nB.prototype.load=function(a,b){var c=this,k=a||\"BESbswy\",r=0,n=b||3E3,H=(new Date).getTime();return new Promise(function(a,b){if(J()&&!G()){var M=new Promise(function(a,b){function e(){(new Date).getTime()-H>=n?b(Error(\"\"+n+\"ms timeout exceeded\")):document.fonts.load(L(c,'\"'+c.family+'\"'),k).then(function(c){1<=c.length?a():setTimeout(e,25)},b)}e()}),N=new Promise(function(a,c){r=setTimeout(function(){c(Error(\"\"+n+\"ms timeout exceeded\"))},n)});Promise.race([N,M]).then(function(){clearTimeout(r);a(c)},\nb)}else m(function(){function v(){var b;if(b=-1!=f&&-1!=g||-1!=f&&-1!=h||-1!=g&&-1!=h)(b=f!=g&&f!=h&&g!=h)||(null===C&&(b=/AppleWebKit\\/([0-9]+)(?:\\.([0-9]+))/.exec(window.navigator.userAgent),C=!!b&&(536>parseInt(b[1],10)||536===parseInt(b[1],10)&&11>=parseInt(b[2],10))),b=C&&(f==w&&g==w&&h==w||f==x&&g==x&&h==x||f==y&&g==y&&h==y)),b=!b;b&&(d.parentNode&&d.parentNode.removeChild(d),clearTimeout(r),a(c))}function I(){if((new Date).getTime()-H>=n)d.parentNode&&d.parentNode.removeChild(d),b(Error(\"\"+\nn+\"ms timeout exceeded\"));else{var a=document.hidden;if(!0===a||void 0===a)f=e.a.offsetWidth,g=p.a.offsetWidth,h=q.a.offsetWidth,v();r=setTimeout(I,50)}}var e=new t(k),p=new t(k),q=new t(k),f=-1,g=-1,h=-1,w=-1,x=-1,y=-1,d=document.createElement(\"div\");d.dir=\"ltr\";u(e,L(c,\"sans-serif\"));u(p,L(c,\"serif\"));u(q,L(c,\"monospace\"));d.appendChild(e.a);d.appendChild(p.a);d.appendChild(q.a);document.body.appendChild(d);w=e.a.offsetWidth;x=p.a.offsetWidth;y=q.a.offsetWidth;I();A(e,function(a){f=a;v()});u(e,\nL(c,'\"'+c.family+'\",sans-serif'));A(p,function(a){g=a;v()});u(p,L(c,'\"'+c.family+'\",serif'));A(q,function(a){h=a;v()});u(q,L(c,'\"'+c.family+'\",monospace'))})})};\"object\"===typeof module?module.exports=B:(window.FontFaceObserver=B,window.FontFaceObserver.prototype.load=B.prototype.load);}());\n","import FontFaceObserver, { FontVariant } from 'fontfaceobserver';\n\n// FontFaceObserver only detects fonts loaded through @font-face, so we\n// bypass it for \"common\" fonts.\nconst WEB_SAFE = ['Arial', 'Arial Black', 'Courier New', 'Helvetica', 'Tahoma', 'Verdana'];\n\nexport class Font {\n\n static ARIAL_9 = new Font('Arial', 9, 0, false);\n static ARIAL_10 = new Font('Arial', 10, 0, false);\n static ARIAL_11 = new Font('Arial', 11, 0, false);\n static ARIAL_12_BOLD = new Font('Arial', 12, 1, false);\n\n height: number; // pixels\n\n constructor(\n public name: string,\n height: number,\n public style: number,\n pixels: boolean,\n ) {\n if (pixels) {\n this.height = height;\n } else {\n // TODO. Would expect 1pt = 3/4px, but this ratio\n // appears to be more accurate with desktop s/w...\n // (on a 72 dpi screen)\n this.height = Math.round(height * 16 / 15);\n }\n }\n\n scale(scale: number) {\n return new Font(this.name, scale * this.height, this.style, true);\n }\n\n getFontString() {\n if (this.style === 1) {\n return `bold ${this.height}px ${this.name}`;\n } else if (this.style === 2) {\n return `italic ${this.height}px ${this.name}`;\n } else if (this.style === 3) {\n return `italic bold ${this.height}px ${this.name}`;\n } else {\n if (this.style !== 0) {\n console.warn(`Unsupported font style ${this.style}`);\n }\n return `normal ${this.height}px ${this.name}`;\n }\n }\n\n preload() {\n if (WEB_SAFE.indexOf(this.name) !== -1) {\n return Promise.resolve();\n }\n\n let variant: FontVariant = { weight: 'normal', style: 'normal' };\n if (this.style === 1) {\n variant.weight = 'bold';\n } else if (this.style === 2) {\n variant.style = 'italic';\n } else if (this.style === 3) {\n variant.weight = 'bold';\n variant.style = 'italic';\n }\n\n // Probably can be done without external library in about 5 years from now.\n // Follow browser support of this spec: https://www.w3.org/TR/css-font-loading-3/\n return new FontFaceObserver(this.name, variant).load();\n }\n}\n","export class MacroSet {\n\n includeParentMacros = true;\n macros: { [key: string]: string } = {};\n\n clear() {\n this.macros = {};\n }\n\n set(name: string, replacement: string) {\n this.macros[name] = replacement;\n }\n\n get(name: string) {\n if (name in this.macros) {\n return this.macros[name];\n }\n }\n}\n","import { Color } from './Color';\n\nexport class RuleSet {\n rules: Rule[] = [];\n}\n\nexport interface Rule {\n name: string;\n propertyName: string;\n outputExpression: boolean;\n expressions: BooleanExpression[];\n inputs: RuleInput[];\n}\n\nexport type BooleanExpression = StringOutputBooleanExpression | ColorOutputBooleanExpression;\n\nexport interface StringOutputBooleanExpression {\n type: 'string';\n expression: string;\n outputValue: string;\n}\n\nexport interface ColorOutputBooleanExpression {\n type: 'color';\n expression: string;\n outputValue: Color;\n}\n\nexport interface RuleInput {\n pvName: string;\n trigger: boolean;\n}\n","export class AutoScaleWidgets {\n\n constructor(\n /**\n * If true, ScaleOptions from widgets are applied.\n *\n * This is not the same as \"scaling\", but acts more like\n * a stretch to fillup some externally set dimension. It somehow\n * distributes space among all the widgets (repositioning x/y coordinates),\n * and then the widgets that mark themselves as \"scalable\", may also have\n * their dimensions changed (with mixed results).\n *\n * Seems decent in headers/footers. Not so sure about actual content,\n * because the x/y repositioning may cause the display to look a bit\n * messy.\n */\n readonly autoScaleWidgets: boolean,\n readonly minWidth: number,\n readonly minHeight: number,\n ) {}\n}\n\nexport class ScaleOptions {\n\n constructor(\n readonly widthScalable: boolean,\n readonly heightScalable: boolean,\n readonly keepWidthHeightRatio: boolean,\n ) {}\n}\n","export class ScriptSet {\n scripts: Script[] = [];\n}\n\nexport interface Script {\n embedded: boolean;\n\n path?: string;\n text?: string;\n\n /**\n * If true, the script may only run if all PVs are connected, and\n * have a non-null value.\n */\n checkConnect: boolean;\n\n skipFirstExecution: boolean;\n\n inputs: ScriptInput[];\n}\n\nexport interface ScriptInput {\n pvName: string;\n trigger: boolean;\n}\n","import { ActionSet, ExecuteCommandAction, ExecuteJavaScriptAction, OpenDisplayAction, OpenFileAction, OpenWebpageAction, PlaySoundAction, WritePVAction } from './actions';\nimport { Color } from './Color';\nimport { ColorMap } from './ColorMap';\nimport { Font } from './Font';\nimport { MacroSet } from './macros';\nimport { BooleanExpression, RuleInput, RuleSet } from './rules';\nimport { AutoScaleWidgets, ScaleOptions } from './scale';\nimport { ScriptInput, ScriptSet } from './scripts';\n\nexport class XMLNode {\n\n constructor(private node: Node) {\n }\n\n get name() {\n return this.node.nodeName;\n }\n\n static parseFromXML(xml: string): XMLNode {\n const xmlParser = new DOMParser();\n const doc = xmlParser.parseFromString(xml, 'text/xml') as XMLDocument;\n return new XMLNode(doc.documentElement);\n }\n\n /**\n * Searches for a direct child with the specified name.\n *\n * @throws when no such child was found\n */\n getNode(name: string): XMLNode {\n const node = this.findChild(name);\n return new XMLNode(node);\n }\n\n /**\n * Searches for all direct children with the specified name.\n * If this name is undefined, all children are returned.\n */\n getNodes(name?: string): XMLNode[] {\n const result = [];\n for (let i = 0; i < this.node.childNodes.length; i++) {\n const child = this.node.childNodes[i] as Element;\n if (child.nodeType !== 3) { // Ignore text or whitespace\n if (!name || (child.nodeName === name)) {\n result.push(new XMLNode(child));\n }\n }\n }\n return result;\n }\n\n hasNode(name: string) {\n for (let i = 0; i < this.node.childNodes.length; i++) {\n const child = this.node.childNodes[i];\n if (child.nodeName === name) {\n return true;\n }\n }\n return false;\n }\n\n hasAttribute(name: string) {\n return (this.node as Element).hasAttribute(name);\n }\n\n /**\n * Returns the inner content of this node as a string\n */\n getTextContent(defaultValue?: string) {\n return this.node.textContent || defaultValue || '';\n }\n\n /**\n * Parses the child node contents of the given parent node as a string.\n *\n * @throws when no such child was found and defaultValue was undefined\n */\n getString(name: string, defaultValue?: string) {\n for (let i = 0; i < this.node.childNodes.length; i++) {\n const child = this.node.childNodes[i];\n if (child.nodeName === name) {\n if (child.textContent !== null) {\n return child.textContent;\n }\n }\n }\n\n if (defaultValue !== undefined) {\n return defaultValue;\n } else {\n throw new Error(`No child node named ${name} could be found`);\n }\n }\n\n getStringAttribute(name: string) {\n const attr = (this.node as Element).attributes.getNamedItem(name);\n if (attr === null) {\n throw new Error(`No attribute named ${name}`);\n } else {\n return attr.textContent || '';\n }\n }\n\n /**\n * Parses the child node contents of the given parent node as a float.\n *\n * @throws when no such child was found and defaultValue was undefined.\n */\n getFloat(name: string, defaultValue?: number) {\n for (let i = 0; i < this.node.childNodes.length; i++) {\n const child = this.node.childNodes[i];\n if (child.nodeName === name) {\n if (child.textContent !== null) {\n return parseFloat(child.textContent);\n }\n }\n }\n\n if (defaultValue !== undefined) {\n return defaultValue;\n } else {\n throw new Error(`No child node named ${name} could be found`);\n }\n }\n\n /**\n * Parses the child node contents of the given parent node as an integer.\n *\n * @throws when no such child was found and defaultValue was undefined.\n */\n getInt(name: string, defaultValue?: number) {\n for (let i = 0; i < this.node.childNodes.length; i++) {\n const child = this.node.childNodes[i];\n if (child.nodeName === name) {\n if (child.textContent !== null) {\n return parseInt(child.textContent, 10);\n }\n }\n }\n\n if (defaultValue !== undefined) {\n return defaultValue;\n } else {\n throw new Error(`No child node named ${name} could be found`);\n }\n }\n\n getIntAttribute(name: string) {\n const attr = (this.node as Element).attributes.getNamedItem(name);\n if (attr === null) {\n throw new Error(`No attribute named ${name}`);\n } else {\n return parseInt(attr.textContent || '', 10);\n }\n }\n\n /**\n * Parses the child node contents of the given parent node as a boolean.\n *\n * @throws when no such child was found and defaultValue was undefined.\n */\n getBoolean(name: string, defaultValue?: boolean) {\n for (let i = 0; i < this.node.childNodes.length; i++) {\n const child = this.node.childNodes[i];\n if (child.nodeName === name) {\n return child.textContent === 'true';\n }\n }\n\n if (defaultValue !== undefined) {\n return defaultValue;\n } else {\n throw new Error(`No child node named ${name} could be found`);\n }\n }\n\n getBooleanAttribute(name: string, defaultValue?: boolean) {\n const attr = (this.node as Element).attributes.getNamedItem(name);\n if (attr === null) {\n if (defaultValue !== undefined) {\n return defaultValue;\n } else {\n throw new Error(`No attribute named ${name}`);\n }\n } else {\n return attr.textContent === 'true';\n }\n }\n\n /**\n * Parses the child node contents as a color.\n *\n * @throws when no such child was found and defaultValue was undefined.\n */\n getColor(name: string, defaultValue?: Color) {\n const parent = this.findChild(name);\n for (let i = 0; i < parent.childNodes.length; i++) {\n const child = parent.childNodes[i] as Element;\n if (child.nodeName === 'color') {\n return this.parseColorNode(new XMLNode(child));\n }\n }\n\n if (defaultValue !== undefined) {\n return defaultValue;\n } else {\n throw new Error(`No child node named 'color' could be found`);\n }\n }\n\n /**\n * Parses the child node contents as a font.\n */\n getFont(name: string) {\n const parent = this.getNode(name);\n if (parent.hasNode('opifont.name')) {\n const fontNode = parent.getNode('opifont.name');\n const name = fontNode.getStringAttribute('fontName');\n const height = fontNode.getIntAttribute('height');\n const style = fontNode.getIntAttribute('style');\n let pixels = false;\n if (fontNode.hasAttribute('pixels')) {\n pixels = fontNode.getBooleanAttribute('pixels');\n }\n return new Font(name, height, style, pixels);\n } else {\n const fontNode = parent.getNode('fontdata');\n const name = fontNode.getStringAttribute('fontName');\n const height = fontNode.getIntAttribute('height');\n const style = fontNode.getIntAttribute('style');\n return new Font(name, height, style, false);\n }\n }\n\n getPoints(name: string) {\n const pointsNode = this.getNode(name);\n const points = [];\n for (const pointNode of pointsNode.getNodes('point')) {\n points.push({\n x: pointNode.getIntAttribute('x'),\n y: pointNode.getIntAttribute('y'),\n });\n }\n return points;\n }\n\n getStringList(name: string) {\n const listNode = this.getNode(name);\n const list = [];\n for (const stringNode of listNode.getNodes('s')) {\n list.push(stringNode.getTextContent());\n }\n return list;\n }\n\n getStringTable(name: string) {\n const listNode = this.getNode(name);\n const table: string[][] = [];\n for (const rowNode of listNode.getNodes('row')) {\n const row = [];\n for (const colNode of rowNode.getNodes('col')) {\n row.push(colNode.getTextContent());\n }\n table.push(row);\n }\n return table;\n }\n\n getScripts(name: string) {\n const scriptsNode = this.getNode(name);\n const scripts = new ScriptSet();\n for (const pathNode of scriptsNode.getNodes('path')) {\n const inputs: ScriptInput[] = [];\n for (const pvNode of pathNode.getNodes('pv')) {\n inputs.push({\n pvName: pvNode.getTextContent(),\n trigger: pvNode.getBooleanAttribute('trig'),\n });\n }\n const path = pathNode.getStringAttribute('pathString');\n if (path === 'EmbeddedJs') {\n scripts.scripts.push({\n embedded: true,\n text: pathNode.getString('scriptText'),\n checkConnect: pathNode.getBooleanAttribute('checkConnect'),\n skipFirstExecution: pathNode.getBooleanAttribute('sfe', false),\n inputs,\n });\n } else if (path === 'EmbeddedPy') {\n console.warn('Unsupported EmbeddedPy script');\n } else {\n scripts.scripts.push({\n embedded: false,\n path,\n checkConnect: pathNode.getBooleanAttribute('checkConnect'),\n skipFirstExecution: pathNode.getBooleanAttribute('sfe', false),\n inputs,\n });\n }\n }\n return scripts;\n }\n\n getScaleOptions(name: string) {\n const node = this.getNode(name);\n return new ScaleOptions(\n node.getBoolean('width_scalable'),\n node.getBoolean('height_scalable'),\n node.getBoolean('keep_wh_ratio'),\n );\n }\n\n getAutoScaleWidgets(name: string) {\n const node = this.getNode(name);\n return new AutoScaleWidgets(\n node.getBoolean('auto_scale_widgets'),\n node.getInt('min_width'),\n node.getInt('min_height'),\n );\n }\n\n getColorMap(name: string) {\n const node = this.getNode(name);\n if (node.hasNode('e')) { // Custom mapping\n const colorMap = new ColorMap(\n 0,\n node.getBoolean('interpolate'),\n node.getBoolean('autoscale'),\n );\n for (const entry of node.getNodes('e')) {\n const value = Number(entry.getTextContent());\n const r = entry.getIntAttribute('red');\n const g = entry.getIntAttribute('green');\n const b = entry.getIntAttribute('blue');\n colorMap.addMapping(value, r, g, b);\n }\n } else { // Predefined mapping\n return new ColorMap(\n node.getInt('map'),\n node.getBoolean('interpolate'),\n node.getBoolean('autoscale'),\n );\n }\n }\n\n getRules(name: string) {\n const rulesNode = this.getNode(name);\n const rules = new RuleSet();\n for (const ruleNode of rulesNode.getNodes('rule')) {\n const inputs: RuleInput[] = [];\n for (const pvNode of ruleNode.getNodes('pv')) {\n inputs.push({\n pvName: pvNode.getTextContent(),\n trigger: pvNode.getBooleanAttribute('trig'),\n });\n }\n const expressions: BooleanExpression[] = [];\n for (const expNode of ruleNode.getNodes('exp')) {\n const valueNode = expNode.getNode('value');\n if (valueNode.hasNode('color')) {\n expressions.push({\n type: 'color',\n expression: expNode.getStringAttribute('bool_exp'),\n outputValue: expNode.getColor('value'),\n });\n } else {\n expressions.push({\n type: 'string',\n expression: expNode.getStringAttribute('bool_exp'),\n outputValue: expNode.getString('value'),\n });\n }\n }\n rules.rules.push({\n name: ruleNode.getStringAttribute('name'),\n propertyName: ruleNode.getStringAttribute('prop_id'),\n outputExpression: ruleNode.getBooleanAttribute('out_exp'),\n inputs,\n expressions,\n });\n }\n return rules;\n }\n\n getMacros(name: string) {\n const macrosNode = this.getNode(name);\n const macros = new MacroSet();\n macros.includeParentMacros = macrosNode.getBoolean('include_parent_macros');\n for (const child of macrosNode.getNodes()) {\n if (child.name !== 'include_parent_macros') {\n macros.set(child.name, macrosNode.getString(child.name));\n }\n }\n return macros;\n }\n\n getActions(name: string) {\n const actionsNode = this.getNode(name);\n const actions = new ActionSet();\n\n actions.hookFirstActionToClick = actionsNode.getBooleanAttribute('hook');\n actions.hookAllActionsToClick = actionsNode.getBooleanAttribute('hook_all', false);\n for (const actionNode of actionsNode.getNodes('action')) {\n const actionType = actionNode.getStringAttribute('type');\n if (actionType === 'OPEN_DISPLAY') {\n const action = new OpenDisplayAction(actionNode.getString('path'));\n if (actionNode.hasNode('mode')) {\n action['mode'] = actionNode.getInt('mode');\n }\n action.description = actionNode.getString('description');\n actions.add(action);\n } else if (actionType === 'OPEN_FILE') {\n const action = new OpenFileAction();\n action.path = actionNode.getString('path');\n action.description = actionNode.getString('description');\n actions.add(action);\n } else if (actionType === 'EXECUTE_CMD') {\n const action = new ExecuteCommandAction();\n action.command = actionNode.getString('command');\n action.commandDirectory = actionNode.getString('command_directory');\n action.waitTime = actionNode.getInt('wait_time');\n action.description = actionNode.getString('description');\n actions.add(action);\n } else if (actionType === 'EXECUTE_JAVASCRIPT') {\n const action = new ExecuteJavaScriptAction(\n actionNode.getBoolean('embedded'),\n );\n if (action.embedded) {\n action.text = actionNode.getString('scriptText');\n } else {\n action.path = actionNode.getString('path');\n }\n action.description = actionNode.getString('description');\n actions.add(action);\n } else if (actionType === 'WRITE_PV') {\n const action = new WritePVAction(actionNode.getString('pv_name'),\n actionNode.getString('value'));\n action.confirmMessage = actionNode.getString('confirm_message', '');\n action.description = actionNode.getString('description');\n actions.add(action);\n } else if (actionType === 'PLAY_SOUND') {\n const action = new PlaySoundAction();\n action.path = actionNode.getString('path');\n action.description = actionNode.getString('description');\n actions.add(action);\n } else if (actionType === 'OPEN_WEBPAGE') {\n const action = new OpenWebpageAction();\n action.hyperlink = actionNode.getString('hyperlink');\n action.description = actionNode.getString('description');\n actions.add(action);\n } else {\n console.warn(`Unsupported action type ${actionType}`);\n // Insert placeholder, because actions are triggered based on index.\n actions.add(null);\n }\n }\n\n return actions;\n }\n\n private parseColorNode(node: XMLNode) {\n const r = node.getIntAttribute('red');\n const g = node.getIntAttribute('green');\n const b = node.getIntAttribute('blue');\n return new Color(r, g, b);\n }\n\n private findChild(childNodeName: string) {\n for (let i = 0; i < this.node.childNodes.length; i++) {\n const child = this.node.childNodes[i];\n if (child.nodeName === childNodeName) {\n return child;\n }\n }\n\n throw new Error(`No child node named ${childNodeName} could be found`);\n }\n}\n","import { PVEngine } from './PVEngine';\nimport { Sample } from './Sample';\n\nexport class PV {\n\n private _writable = false;\n private _units?: string;\n\n private _lowerDisplayLimit?: number;\n private _lowerAlarmLimit?: number;\n private _lowerWarningLimit?: number;\n\n private _upperWarningLimit?: number;\n private _upperAlarmLimit?: number;\n private _upperDisplayLimit?: number;\n\n private _time?: Date;\n private _value?: any;\n private _severity = AlarmSeverity.NONE;\n\n private _indexValue?: number;\n\n private _precision = 3;\n\n private _disconnected = false;\n navigable = false;\n\n constructor(readonly name: string, readonly pvEngine: PVEngine) {\n }\n\n get units(): string | undefined { return this._units; }\n set units(units: string | undefined) {\n this._units = units;\n this.pvEngine.requestRepaint();\n }\n\n get lowerDisplayLimit(): number | undefined { return this._lowerDisplayLimit; }\n set lowerDisplayLimit(lowerDisplayLimit: number | undefined) {\n this._lowerDisplayLimit = lowerDisplayLimit;\n this.pvEngine.requestRepaint();\n }\n\n get lowerAlarmLimit(): number | undefined { return this._lowerAlarmLimit; }\n set lowerAlarmLimit(lowerAlarmLimit: number | undefined) {\n this._lowerAlarmLimit = lowerAlarmLimit;\n this.pvEngine.requestRepaint();\n }\n\n get lowerWarningLimit(): number | undefined { return this._lowerWarningLimit; }\n set lowerWarningLimit(lowerWarningLimit: number | undefined) {\n this._lowerWarningLimit = lowerWarningLimit;\n this.pvEngine.requestRepaint();\n }\n\n get upperWarningLimit(): number | undefined { return this._upperWarningLimit; }\n set upperWarningLimit(upperWarningLimit: number | undefined) {\n this._upperWarningLimit = upperWarningLimit;\n this.pvEngine.requestRepaint();\n }\n\n get upperAlarmLimit(): number | undefined { return this._upperAlarmLimit; }\n set upperAlarmLimit(upperAlarmLimit: number | undefined) {\n this._upperAlarmLimit = upperAlarmLimit;\n this.pvEngine.requestRepaint();\n }\n\n get upperDisplayLimit(): number | undefined { return this._upperDisplayLimit; }\n set upperDisplayLimit(upperDisplayLimit: number | undefined) {\n this._upperDisplayLimit = upperDisplayLimit;\n this.pvEngine.requestRepaint();\n }\n\n get precision(): number { return this._precision; }\n set precision(precision: number) {\n this._precision = precision;\n this.pvEngine.requestRepaint();\n }\n\n get writable(): boolean { return this._writable; }\n set writable(writable: boolean) {\n this._writable = writable;\n this.pvEngine.requestRepaint();\n }\n\n get disconnected(): boolean { return this._disconnected; }\n set disconnected(disconnected: boolean) {\n this._disconnected = disconnected;\n this.pvEngine.requestRepaint();\n }\n\n get time(): Date | undefined { return this._time; }\n get value(): any | undefined { return this._value; }\n get indexValue(): number | undefined { return this._indexValue; }\n get severity(): AlarmSeverity { return this._severity; }\n\n get alarmName(): string {\n const numericValue = this.toNumber();\n if (numericValue === null || numericValue === undefined) {\n return 'NONE';\n } else if (numericValue <= (this.lowerAlarmLimit ?? NaN)) {\n return 'LOLO';\n } else if (numericValue >= (this.upperAlarmLimit ?? NaN)) {\n return 'HIHI';\n } else if (numericValue <= (this.lowerWarningLimit ?? NaN)) {\n return 'LOW';\n } else if (numericValue >= (this.upperWarningLimit ?? NaN)) {\n return 'HIGH';\n } else {\n return 'NONE';\n }\n }\n\n toNumber(): number | null | undefined {\n if (this.value === null) {\n return null;\n } else if (typeof this.value === 'number') {\n return this.value;\n } else if (typeof this.value === 'boolean') {\n return this.value ? 1 : 0;\n } else if (typeof this.indexValue !== undefined) {\n return this.indexValue;\n }\n }\n\n formatValue(formatType: number, precision: number) {\n if (this.value === null) {\n return '';\n } else if (typeof this.value === 'string') {\n return this.value;\n } else if (typeof this.value === 'number') {\n return this.formatNumber(formatType, this.value, precision);\n } else if (this.value instanceof Date) {\n return this.value.toISOString().replace('T', ' ').replace('Z', '');\n } else {\n return String(this.value);\n }\n }\n\n private formatNumber(formatType: number, value: number, precision: number) {\n if (value == null || value == undefined) {\n return '';\n }\n switch (formatType) {\n case 0: // DEFAULT\n case 1: // NORMAL\n if (precision === -1) { // Use PV precision if available\n precision = this.precision ?? -1;\n }\n if (precision === -1) {\n return String(value);\n } else {\n return value.toFixed(precision);\n }\n case 2: // EXPONENTIAL\n return value.toExponential().replace('e+', 'E').toUpperCase();\n case 3: // HEX\n return '0x' + value.toString(16).toUpperCase();\n default:\n console.warn(`Unexpected format type ${formatType}`);\n return String(value);\n }\n }\n\n // Should be called by PVEngine only\n setSample(sample: Sample) {\n this._time = sample.time;\n this._value = sample.value;\n this._indexValue = sample.valueIndex;\n this._severity = sample.severity;\n this.pvEngine.requestRepaint();\n }\n\n addListener(listener: PVListener) {\n this.pvEngine.addListener(this.name, listener);\n }\n\n removeListener(listener: PVListener) {\n this.pvEngine.addListener(this.name, listener);\n }\n\n toString() {\n if (this.value !== undefined) {\n return String(this.value);\n }\n }\n}\n\nexport type PVListener = () => void;\n\nexport enum AlarmSeverity {\n NONE = \"NONE\",\n MINOR = \"MINOR\",\n MAJOR = \"MAJOR\",\n INVALID = \"INVALID\",\n UNDEFINED = \"UNDEFINED\",\n}\n","import { SpreadSheetTable } from './SpreadSheetTable';\n\nexport namespace java {\n export namespace lang {\n export const Runnable = function (args: { [key: string]: any; }) {\n this.run = args[\"run\"];\n };\n\n export const Thread = function (runnable: any) {\n this.runnable = runnable;\n };\n // TODO should use a web worker, but lot of work to\n // come up with a message interface\n Thread.prototype.start = function () {\n this.runnable.run();\n };\n Thread.sleep = function (delay: number) {\n const start = Date.now();\n let i = 0;\n while (Date.now() < start + delay) { i++; }\n if (!i) { // A reference to \"i\", just to avoid compiler removing the while\n console.trace(\"Should not happen\");\n }\n };\n }\n}\n\n\nexport class Java {\n\n type(className: string) {\n switch (className) {\n case \"java.lang.Runnable\":\n return java.lang.Runnable;\n case \"java.lang.Thread\":\n return java.lang.Thread;\n case \"org.csstudio.swt.widgets.natives.SpreadSheetTable\":\n return SpreadSheetTable;\n default:\n throw new Error(\"Unexpected class name: \" + className);\n }\n }\n\n to(jsValue: any, javaType: string) {\n // We have no java in the loop, so just return\n // the input JS.\n return jsValue;\n }\n}\n","import { Color } from '../Color';\nimport { Font } from '../Font';\n\nexport class ColorFontUtil {\n\n BLACK = Color.BLACK;\n BLUE = Color.BLUE;\n CYAN = Color.CYAN;\n DARK_GRAY = Color.DARK_GRAY;\n GRAY = Color.GRAY;\n GREEN = Color.GREEN;\n LIGHT_BLUE = Color.LIGHT_BLUE;\n ORANGE = Color.ORANGE;\n PINK = Color.PINK;\n PURPLE = Color.PURPLE;\n RED = Color.RED;\n WHITE = Color.WHITE;\n YELLOW = Color.YELLOW;\n\n getColorFromRGB(red: number, green: number, blue: number) {\n return new Color(red, green, blue);\n }\n\n getFont(name: string, height: number, style: number) {\n return new Font(name, height, style, false);\n }\n}\n","import { Display } from '../Display';\n\nexport class ConsoleUtil {\n\n constructor(private display: Display) {\n }\n\n writeInfo(message: string) {\n this.display.getConsoleHandler().writeInfo(message);\n }\n\n writeError(message: string) {\n this.display.getConsoleHandler().writeError(message);\n }\n\n writeWarning(message: string) {\n this.display.getConsoleHandler().writeWarning(message);\n }\n}\n","\nexport class DataUtil {\n\n createDoubleArray(size: number) {\n return Array(size).fill(0);\n }\n\n createIntArray(size: number) {\n return Array(size).fill(0);\n }\n\n toJavaDoubleArray(arr: number[]) {\n return [...arr];\n }\n\n toJavaIntArray(arr: number[]) {\n return [...arr];\n }\n}\n","import { PV } from '../pv/PV';\n\nexport class PVWrapper {\n\n constructor(readonly _pv: PV) {\n }\n\n getName() {\n return this._pv.name;\n }\n\n getValue() {\n return this._pv.value;\n }\n\n setValue(value: any) {\n this._pv.pvEngine.setValue(new Date(), this._pv.name, value);\n }\n\n isConnected() {\n return !this._pv.disconnected;\n }\n\n isWriteAllowed() {\n return this._pv.writable;\n }\n}\n","import { ColorMap } from '../ColorMap';\nimport { ColorMapProperty, StringProperty } from '../properties';\nimport { Widget } from '../Widget';\nimport { PVWrapper } from './PVWrapper';\n\n/**\n * Exposes the API for the variable \"widget\" as used in display scripts.\n */\nexport class WidgetWrapper {\n\n constructor(private widget: Widget) {\n }\n\n executeAction(index: number) {\n this.widget.executeAction(index);\n }\n\n getPVByName(name: string) {\n const pv = this.widget.display.getPV(name);\n return pv ? new PVWrapper(pv) : null;\n }\n\n getPV(propertyName = 'pv_name') {\n const propertyValue = this.getPropertyValue(propertyName);\n if (propertyValue) {\n return this.getPVByName(propertyValue);\n } else {\n return null;\n }\n }\n\n getVar(name: string) {\n return this.widget.vars.get(name) ?? null;\n }\n\n setVar(name: string, value: any) {\n this.widget.vars.set(name, value);\n }\n\n getPropertyValue(propertyName: string) {\n const property = this.widget.properties.getProperty(propertyName);\n return property ? property.value : null;\n }\n\n setPropertyValue(propertyName: string, value: any) {\n const property = this.widget.properties.getProperty(propertyName);\n if (!property) {\n throw new Error(`Cannot set value of unknown property ${propertyName}`);\n }\n\n if (property instanceof StringProperty) {\n value = (value !== undefined) ? String(value) : value;\n this.widget.properties.setValue(propertyName, value);\n } else if (property instanceof ColorMapProperty) {\n let code = 0;\n switch (value) {\n case 'GrayScale':\n code = 1;\n break;\n case 'JET':\n code = 2;\n break;\n case 'ColorSpectrum':\n code = 3;\n break;\n case 'Hot':\n code = 4;\n break;\n case 'Cool':\n code = 5;\n break;\n case 'Shaded':\n code = 6;\n break;\n }\n // It is unfortunate that autoscale and interpolate are fixed\n // to true, instead of keeping their previous values. But that\n // is consistent with current Yamcs Studio behaviour.\n const colorMap = new ColorMap(code, true, true);\n this.widget.properties.setValue(propertyName, colorMap);\n } else {\n this.widget.properties.setValue(propertyName, value);\n }\n\n this.widget.requestRepaint();\n }\n\n getName(): string {\n return this.getPropertyValue('name');\n }\n\n setX(x: number) {\n this.setPropertyValue('x', x);\n }\n\n setY(y: number) {\n this.setPropertyValue('y', y);\n }\n\n setWidth(width: number) {\n this.setPropertyValue('width', width);\n }\n\n setHeight(height: number) {\n this.setPropertyValue('height', height);\n }\n\n setVisible(visible: boolean) {\n this.setPropertyValue('visible', visible);\n }\n\n getValue() {\n return this.widget.value ?? null;\n }\n\n setValue(value: any) {\n this.widget.value = value;\n }\n\n setValueInUIThread(value: any) {\n this.setValue(value);\n }\n}\n","import { Table } from '../widgets/others/Table';\nimport { SpreadSheetTable } from './SpreadSheetTable';\nimport { WidgetWrapper } from './WidgetWrapper';\n\nexport class TableWrapper extends WidgetWrapper {\n\n private table: Table;\n private spreadSheetTable: SpreadSheetTable;\n\n constructor(widget: Table) {\n super(widget);\n this.table = widget;\n this.spreadSheetTable = this.table.spreadsheet;\n }\n\n getTable() {\n return this.spreadSheetTable;\n }\n}\n","import { XYGraph } from '../widgets/monitors/xygraph/XYGraph';\nimport { WidgetWrapper } from './WidgetWrapper';\n\nexport class XYGraphWrapper extends WidgetWrapper {\n\n private xyGraph: XYGraph;\n\n constructor(widget: XYGraph) {\n super(widget);\n this.xyGraph = widget;\n }\n\n clearGraph() {\n this.xyGraph.clearGraph();\n }\n\n getXBuffer(index: number) {\n const trace = this.xyGraph.getTrace(index);\n return trace.snapshot().map(sample => sample.x);\n }\n\n getYBuffer(index: number) {\n const trace = this.xyGraph.getTrace(index);\n return trace.snapshot().map(sample => sample.y);\n }\n}\n","import { Widget } from '../Widget';\nimport { TableWrapper } from './TableWrapper';\nimport { WidgetWrapper } from './WidgetWrapper';\nimport { XYGraphWrapper } from './XYGraphWrapper';\n\nexport function wrapWidget(widget: Widget) {\n // Avoid importing specific widgets, because it result in a circular warning\n switch (widget.widgetType) {\n case 'Table':\n return new TableWrapper(widget as any);\n case 'XY Graph':\n return new XYGraphWrapper(widget as any);\n default:\n return new WidgetWrapper(widget);\n }\n}\n","import { Display } from '../Display';\nimport { wrapWidget } from './utils';\n\nexport class DisplayWrapper {\n\n constructor(private display: Display) {\n }\n\n isActive() {\n return true;\n }\n\n getWidget(name: string) {\n const widget = this.display.findWidgetByName(name);\n if (widget) {\n return wrapWidget(widget);\n }\n }\n}\n","import { Display } from '../Display';\n\nexport class FileUtil {\n\n constructor(private display: Display) {\n }\n\n readTextFile(filePath: string) {\n const href = this.display.resolvePath(filePath);\n // Use XMLHTTPRequest because it can be used synchronously\n // (we may not return a promise from this method because it would break\n // the intended API).\n var request = new XMLHttpRequest();\n request.open('GET', href, false);\n request.send(null);\n if (request.status === 200) {\n return request.responseText;\n } else {\n throw Error(`Cannot open ${href}`);\n }\n }\n}\n","export class GUIUtil {\n\n fullScreen() {\n document.documentElement.requestFullscreen();\n }\n\n openConfirmDialog(message: string) {\n return confirm(message);\n }\n\n openInformationDialog(message: string) {\n alert(message);\n }\n\n openWarningDialog(message: string) {\n alert(message);\n }\n\n openErrorDialog(message: string) {\n alert(message);\n }\n\n openPasswordDialog(message: string, password: string) {\n let answer = prompt(message);\n if (answer) {\n return answer === password;\n }\n }\n}\n","import { Color } from '../Color';\nimport { Table } from '../widgets/others/Table';\n\ninterface Cell {\n text?: string;\n backgroundColor?: Color;\n foregroundColor?: Color;\n}\n\nexport class SpreadSheetTable {\n\n private columnCount = 0;\n private cells: Cell[][] = [];\n dirty = false;\n\n constructor(private table: Table) {\n }\n\n isEmpty() {\n return !this.cells.length;\n }\n\n refresh() {\n this.dirty = true;\n }\n\n getCells() {\n return this.cells;\n }\n\n getContent() {\n const content = [];\n for (const row of this.cells) {\n content.push(row.map(cell => cell.text || ''));\n }\n return content;\n }\n\n setContent(content: string[][]) {\n this.cells.length = 0;\n for (let i = 0; i < content.length; i++) {\n if (i === 0) {\n this.columnCount = content[i].length;\n }\n this.cells.push(content[i].map(text => {\n return { text };\n }));\n }\n this.dirty = true;\n }\n\n getColumnCount() {\n return this.columnCount;\n }\n\n getRowCount() {\n return this.cells.length;\n }\n\n getCellText(row: number, col: number) {\n const rowContent = this.cells[row];\n if (rowContent) {\n return rowContent[col]?.text ?? null;\n } else {\n return null;\n }\n }\n\n setColumnsCount(count: number) {\n if (count < this.columnCount) {\n for (const row of this.cells) {\n row.length = count;\n }\n }\n if (count > this.columnCount) {\n const newColumns = count - this.columnCount;\n for (const row of this.cells) {\n for (let i = 0; i < newColumns; i++) {\n row.push({ text: '' });\n }\n }\n }\n this.columnCount = count;\n this.dirty = true;\n }\n\n appendRow() {\n const row: Cell[] = [];\n for (let i = 0; i < this.columnCount; i++) {\n row[i] = { text: '' };\n }\n this.cells.push(row);\n this.dirty = true;\n return this.cells.length - 1;\n }\n\n deleteRow(index: number) {\n this.cells.splice(index, 1);\n this.dirty = true;\n }\n\n deleteColumn(index: number) {\n for (const row of this.cells) {\n row.splice(index, 1);\n }\n this.columnCount--;\n this.dirty = true;\n }\n\n insertRow(index: number) {\n const row: Cell[] = [];\n for (let i = 0; i < this.columnCount; i++) {\n row.push({ text: '' });\n }\n this.cells.splice(index, 0, row);\n this.dirty = true;\n }\n\n insertColumn(index: number) {\n for (const row of this.cells) {\n row.splice(index, 0, { text: '' });\n }\n this.columnCount++;\n this.dirty = true;\n }\n\n private getCell(row: number, col: number): Cell {\n this.cells[row] = this.cells[row] ?? [];\n const cell = this.cells[row][col] ?? {};\n this.cells[row][col] = cell;\n return cell;\n }\n\n setCellText(row: number, col: number, text: string) {\n const cell = this.getCell(row, col);\n cell.text = text;\n this.dirty = true;\n }\n\n setRowBackground(row: number, color: Color) {\n const rowCells = this.cells[row];\n for (const cell of rowCells) {\n cell.backgroundColor = color;\n }\n this.dirty = true;\n }\n\n setRowForeground(row: number, color: Color) {\n const rowCells = this.cells[row];\n for (const cell of rowCells) {\n cell.foregroundColor = color;\n }\n this.dirty = true;\n }\n\n setCellBackground(row: number, col: number, color: Color) {\n const cell = this.getCell(row, col);\n cell.backgroundColor = color;\n this.dirty = true;\n }\n\n setCellForeground(row: number, col: number, color: Color) {\n const cell = this.getCell(row, col);\n cell.foregroundColor = color;\n this.dirty = true;\n }\n\n setColumnCellEditorData(col: number, data: any) {\n }\n}\n","export class MessageDialog {\n\n openInformation(shell: any, title: string, message: string) {\n alert(message);\n }\n\n openConfirm(shell: any, title: string, message: string) {\n return confirm(message);\n }\n\n openError(shell: any, title: string, message: string) {\n alert(message);\n }\n}\n","import { AlarmSeverity } from '../pv/PV';\nimport { PVEngine } from '../pv/PVEngine';\nimport { PVWrapper } from './PVWrapper';\n\nconst SUPPORTED_DATE_FORMAT_PATTERNS = ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'nnnnnnnnn'];\n\nexport class PVUtil {\n\n constructor(private pvEngine: PVEngine) {\n }\n\n getDouble(pv: PVWrapper) {\n // It probably already is a float, but parseFloat again to emit error if it's not\n return parseFloat(pv.getValue());\n }\n\n getLong(pv: PVWrapper) {\n // It probably already is an int, but parseInt again to emit error if it's not\n return parseInt(pv.getValue(), 10);\n }\n\n getString(pv: PVWrapper) {\n return pv._pv.formatValue(0, -1);\n }\n\n getStringArray(pv: PVWrapper) {\n const value = pv.getValue();\n if (Array.isArray(value)) {\n return value.map(item => String(item));\n } else {\n return [String(value)];\n }\n }\n\n getTimeInMilliseconds(pv: PVWrapper) {\n const dt = pv._pv.time;\n return dt?.getTime() ?? 0;\n }\n\n getTimeString(pv: PVWrapper, format = \"yyyy-MM-dd HH:mm:ss.nnnnnnnnn\") {\n const dt = pv._pv.time;\n if (dt) {\n let result = format;\n for (const pattern of SUPPORTED_DATE_FORMAT_PATTERNS) {\n result = result.replace(pattern, this.formatDate(dt, pattern));\n }\n return result;\n }\n return null;\n }\n\n getSeverity(pv: PVWrapper) {\n switch (pv._pv.severity) {\n case AlarmSeverity.NONE:\n return 0;\n case AlarmSeverity.MAJOR:\n return 1;\n case AlarmSeverity.MINOR:\n return 2;\n default:\n return -1;\n }\n }\n\n getSeverityString(pv: PVWrapper) {\n return String(pv._pv.severity);\n }\n\n getStatus(pv: PVWrapper) {\n return pv._pv.alarmName;\n }\n\n private formatDate(date: Date, format: string) {\n if (format === 'yyyy') {\n return String(date.getUTCFullYear());\n } else if (format === 'MM') {\n const m = date.getUTCMonth() + 1;\n return (m < 10) ? '0' + m : '' + m;\n } else if (format === 'dd') {\n const d = date.getUTCDate();\n return (d < 10) ? '0' + d : '' + d;\n } else if (format === 'HH') {\n const h = date.getUTCHours();\n return (h < 10) ? '0' + h : '' + h;\n } else if (format === 'mm') {\n const m = date.getUTCMinutes();\n return (m < 10) ? '0' + m : '' + m;\n } else if (format === 'ss') {\n const s = date.getUTCSeconds();\n return (s < 10) ? '0' + s : '' + s;\n } else if (format === 'nnnnnnnnn') {\n const m = date.getUTCMilliseconds();\n if (m < 10) {\n return '00' + m;\n } else if (m < 100) {\n return '0' + m;\n } else {\n return '' + m;\n }\n } else {\n throw new Error(`Unexpected format '${format}'`);\n }\n }\n}\n","import { Display } from '../Display';\nimport { OpenDisplayEvent } from '../events';\n\nexport class ScriptUtil {\n\n constructor(private display: Display) { }\n\n openOPI(widget: any, path: string, target: number, macrosInput: any) {\n if (target === 0) { // replace\n const event: OpenDisplayEvent = {\n path,\n replace: target === 0,\n };\n this.display.fireEvent('opendisplay', event);\n } else {\n throw new Error(`Unsupported target ${target}`);\n }\n }\n\n closeCurrentOPI() {\n this.display.fireEvent('closedisplay', {});\n }\n}\n","import { PV } from '../pv/PV';\nimport { Widget } from '../Widget';\nimport { ColorFontUtil } from './ColorFontUtil';\nimport { ConsoleUtil } from './ConsoleUtil';\nimport { DataUtil } from './DataUtil';\nimport { DisplayWrapper } from './DisplayWrapper';\nimport { FileUtil } from './FileUtil';\nimport { GUIUtil } from './GUIUtil';\nimport { java, Java } from './Java';\nimport { MessageDialog } from './MessageDialog';\nimport { PVUtil } from './PVUtil';\nimport { PVWrapper } from './PVWrapper';\nimport { ScriptUtil } from './ScriptUtil';\nimport { wrapWidget } from './utils';\n\ninterface Context { [key: string]: any; }\n\nlet iframe: HTMLIFrameElement;\nlet contentWindow: any;\nlet wEval: any;\nfunction createIframe() {\n iframe = document.createElement('iframe');\n iframe.id = 'script-e';\n iframe.style.display = 'none';\n document.body.appendChild(iframe);\n\n contentWindow = iframe.contentWindow as any;\n wEval = contentWindow.eval;\n if (!wEval && contentWindow.execScript) { // IE\n contentWindow.execScript.call(contentWindow, 'null');\n wEval = contentWindow.eval;\n }\n}\n\nexport class ScriptEngine {\n\n private context: Context;\n\n constructor(widget: Widget, readonly scriptText: string, pvs: PV[] = []) {\n if (!iframe) {\n createIframe();\n }\n this.scriptText = scriptText\n .replace(/importClass\\([^\\)]*\\)\\s*\\;?/gi, '')\n .replace(/importPackage\\([^\\)]*\\)\\s*\\;?/gi, '')\n .trim();\n this.context = {\n display: new DisplayWrapper(widget.display),\n pvs: pvs.map(pv => new PVWrapper(pv)),\n triggerPV: null,\n widget: wrapWidget(widget),\n ColorFontUtil: new ColorFontUtil(),\n ConsoleUtil: new ConsoleUtil(widget.display),\n DataUtil: new DataUtil(),\n FileUtil: new FileUtil(widget.display),\n GUIUtil: new GUIUtil(),\n Java: new Java(),\n java: java,\n MessageDialog: new MessageDialog(),\n PVUtil: new PVUtil(widget.display.pvEngine),\n ScriptUtil: new ScriptUtil(widget.display),\n ...widget.display.pvEngine.scriptLibraries,\n };\n }\n\n run(triggerPV?: PV) {\n // Update context with triggerPV, using same wrapper object to support equality comparisons\n this.context.triggerPV = null;\n if (triggerPV) {\n for (const pvWrapper of this.context.pvs) {\n if ((pvWrapper as PVWrapper)._pv === triggerPV) {\n this.context.triggerPV = pvWrapper;\n }\n }\n }\n\n // Mark current globals\n const originalGlobals = [];\n for (const k in iframe.contentWindow) {\n originalGlobals.push(k);\n }\n\n try {\n // Add context to iframe globals\n for (const k in this.context) {\n if (this.context.hasOwnProperty(k)) {\n contentWindow[k] = this.context[k];\n }\n }\n wEval.call(contentWindow, this.scriptText);\n\n // Extract updated context\n const updatedContext: Context = {};\n for (const k in contentWindow) {\n if (originalGlobals.indexOf(k) === -1) {\n updatedContext[k] = contentWindow[k];\n }\n }\n this.context = updatedContext;\n } finally {\n // Reset iframe\n for (const k in contentWindow) {\n if (originalGlobals.indexOf(k) === -1) {\n delete contentWindow[k];\n }\n }\n }\n }\n}\n","import { ActionSet } from './actions';\nimport { Color } from './Color';\nimport { Display } from './Display';\nimport { OpenDisplayEvent } from './events';\nimport { Font } from './Font';\nimport { Graphics, Path } from './Graphics';\nimport { HitRegionSpecification } from './HitRegionSpecification';\nimport { Bounds, shrink, toBorderBox } from './positioning';\nimport { ActionsProperty, BooleanProperty, ColorProperty, FontProperty, IntProperty, PropertyListener, PropertySet, PVValueProperty, RulesProperty, ScaleOptionsProperty, ScriptsProperty, StringProperty } from './properties';\nimport { AlarmSeverity, PV } from './pv/PV';\nimport { RuleSet } from './rules';\nimport { ScaleOptions } from './scale';\nimport { ScriptEngine } from './scripting/ScriptEngine';\nimport { ScriptSet } from './scripts';\nimport { AbstractContainerWidget } from './widgets/others/AbstractContainerWidget';\nimport { XMLNode } from './XMLNode';\n\nconst PROP_ACTIONS = 'actions';\nconst PROP_BACKGROUND_COLOR = 'background_color';\nconst PROP_BACKGROUND_ALARM_SENSITIVE = 'backcolor_alarm_sensitive';\nconst PROP_BORDER_ALARM_SENSITIVE = 'border_alarm_sensitive';\nconst PROP_BORDER_COLOR = 'border_color';\nconst PROP_BORDER_WIDTH = 'border_width';\nconst PROP_BORDER_STYLE = 'border_style';\nconst PROP_ENABLED = 'enabled';\nconst PROP_FOREGROUND_COLOR = 'foreground_color';\nconst PROP_FOREGROUND_ALARM_SENSITIVE = 'forecolor_alarm_sensitive';\nconst PROP_HEIGHT = 'height';\nconst PROP_NAME = 'name';\nconst PROP_PV_NAME = 'pv_name';\nconst PROP_PV_VALUE = 'pv_value';\nconst PROP_RULES = 'rules';\nconst PROP_SCALE_OPTIONS = 'scale_options';\nconst PROP_SCRIPTS = 'scripts';\nconst PROP_TEXT = 'text';\nconst PROP_TOOLTIP = 'tooltip';\nconst PROP_TRANSPARENT = 'transparent';\nconst PROP_VISIBLE = 'visible';\nconst PROP_WIDGET_TYPE = 'widget_type';\nconst PROP_WIDTH = 'width';\nconst PROP_WUID = 'wuid';\nconst PROP_X = 'x';\nconst PROP_Y = 'y';\n\nexport abstract class Widget {\n\n // bbox around the widget (excluding border)\n x = 0;\n y = 0;\n width = 0;\n height = 0;\n\n // Intrinsic value of the widget. PV widgets write to\n // this value upon PV update, but it may also be updated\n // directly through scripting.\n private _value: any;\n\n // Some widgets ignore the fill of this border (only the stroke).\n // (Rectangle, RoundedRectangle)\n protected fillRoundRectangleBackgroundBorder = true;\n\n private holderRegion?: HitRegionSpecification;\n\n properties: PropertySet;\n\n // Custom variables, for use by scripts\n readonly vars = new Map<string, any>();\n\n constructor(readonly display: Display, readonly parent?: AbstractContainerWidget) {\n this.properties = new PropertySet(this, [\n new ActionsProperty(PROP_ACTIONS, new ActionSet()),\n new BooleanProperty(PROP_BACKGROUND_ALARM_SENSITIVE, false),\n new ColorProperty(PROP_BACKGROUND_COLOR, Color.TRANSPARENT),\n new BooleanProperty(PROP_BORDER_ALARM_SENSITIVE, false),\n new ColorProperty(PROP_BORDER_COLOR),\n new IntProperty(PROP_BORDER_STYLE),\n new IntProperty(PROP_BORDER_WIDTH),\n new BooleanProperty(PROP_ENABLED, true),\n new BooleanProperty(PROP_FOREGROUND_ALARM_SENSITIVE, false),\n new ColorProperty(PROP_FOREGROUND_COLOR),\n new IntProperty(PROP_HEIGHT),\n new StringProperty(PROP_NAME),\n new StringProperty(PROP_PV_NAME),\n new PVValueProperty(PROP_PV_VALUE, PROP_PV_NAME),\n new RulesProperty(PROP_RULES, new RuleSet()),\n new ScriptsProperty(PROP_SCRIPTS),\n new StringProperty(PROP_TEXT, ''),\n new StringProperty(PROP_TOOLTIP, ''),\n new BooleanProperty(PROP_TRANSPARENT, false),\n new BooleanProperty(PROP_VISIBLE),\n new StringProperty(PROP_WIDGET_TYPE),\n new IntProperty(PROP_WIDTH),\n new StringProperty(PROP_WUID),\n new IntProperty(PROP_X),\n new IntProperty(PROP_Y),\n new ScaleOptionsProperty(PROP_SCALE_OPTIONS),\n ]);\n }\n\n parseNode(node: XMLNode) {\n this.properties.loadXMLValues(node);\n\n for (const property of this.properties.all()) {\n if (property instanceof FontProperty) {\n const font = property.value as Font;\n font.preload().then(() => this.requestRepaint())\n .catch(() => console.warn(`Failed to load font '${font.getFontString()}'.`));\n }\n }\n\n if (this.pvName) {\n this.display.pvEngine.createPV(this.pvName);\n }\n\n for (const script of this.scripts.scripts) {\n if (script.embedded) {\n this.display.pvEngine.createScript(this, script, script.text!);\n } else {\n fetch(this.display.resolvePath(script.path!), {\n // Send cookies too.\n // Old versions of Firefox do not do this automatically.\n credentials: 'same-origin'\n }).then(response => {\n if (response.ok) {\n response.text().then(text => {\n this.display.pvEngine.createScript(this, script, text);\n });\n }\n });\n }\n }\n\n for (const rule of this.rules.rules) {\n if (this.properties.getProperty(rule.propertyName)) {\n this.display.pvEngine.createRule(this, rule);\n } else {\n console.warn(`Cannot create rule for unsupported property ${rule.propertyName}`);\n }\n }\n\n // Default underlay region, specific widgets may need to redefine\n // if they place a region on top.\n //\n // Don't declare a region unless necessary, to prevent\n // undesired mouse interactions\n //\n // EDIT: Commented out \"this.tooltip\" because it is independent of\n // actions. For example, see 4_Actions_2.opi.\n // Better fix would be to do tooltips on another canvas than\n // the click regions.\n if (/*this.tooltip ||*/ this.actions.isClickable()) {\n this.holderRegion = {\n id: `${this.wuid}-holder`,\n };\n if (this.tooltip) {\n this.holderRegion.tooltip = () => this.tooltip;\n }\n if (this.actions.isClickable()) {\n this.holderRegion.click = () => {\n for (const idx of this.actions.getClickActions()) {\n this.executeAction(idx);\n }\n };\n this.holderRegion!.cursor = 'pointer';\n }\n }\n\n this.init();\n }\n\n drawHolder(g: Graphics) {\n const { scale } = this;\n let insets = [0, 0, 0, 0]; // T L B R\n\n const alarmBorder = this.borderAlarmSensitive &&\n (this.pv?.severity === AlarmSeverity.MINOR || this.pv?.severity === AlarmSeverity.MAJOR);\n\n if (!alarmBorder) {\n switch (this.borderStyle) {\n case 0: // Empty\n // Not all widgets do this, so we shrink bounds inside the widget's draw\n // if (this.borderAlarmSensitive) {\n // insets = [2, 2, 2, 2];\n //}\n break;\n case 1: // Line\n insets = [this.borderWidth, this.borderWidth, this.borderWidth, this.borderWidth];\n break;\n case 2: // Raised\n case 3: // Lowered\n insets = [1 * scale, 1 * scale, 1 * scale, 1 * scale];\n break;\n case 4: // Etched\n case 5: // Ridged\n case 6: // Button Raised\n insets = [2 * scale, 2 * scale, 2 * scale, 2 * scale];\n break;\n case 7: // Button Pressed\n insets = [2 * scale, 2 * scale, 1 * scale, 1 * scale];\n break;\n case 8: // Dot\n case 9: // Dash\n case 10: // Dash Dot\n case 11: // Dash Dot Dot\n insets = [this.borderWidth, this.borderWidth, this.borderWidth, this.borderWidth];\n break;\n case 12: // Title Bar\n insets = [(16 + 1) * scale, 1 * scale, 1 * scale, 1 * scale];\n break;\n case 13: // Group Box\n insets = [16 * scale, 16 * scale, 16 * scale, 16 * scale];\n break;\n case 14: // Round Rectangle Background\n const i = this.borderWidth * 2;\n insets = [i, i, i, i];\n break;\n }\n }\n\n // Shrink the available widget area\n this.x = this.holderX + insets[1];\n this.y = this.holderY + insets[0];\n this.width = this.holderWidth - insets[1] - insets[3];\n this.height = this.holderHeight - insets[0] - insets[2];\n\n if (!alarmBorder) {\n this.beforeDrawBorder(g);\n this.drawBorderStyle(g);\n }\n\n if (this.holderRegion) {\n g.addHitRegion(this.holderRegion).addRect(\n this.holderX, this.holderY, this.holderWidth, this.holderHeight);\n }\n }\n\n beforeDrawBorder(g: Graphics) {\n // For extension\n }\n\n private drawBorderStyle(g: Graphics) {\n const { scale } = this;\n if (this.borderStyle === 0) { // No border\n // Ignore\n } else if (this.borderStyle === 1) { // Line\n g.strokeRect({\n x: this.holderX,\n y: this.holderY,\n width: this.holderWidth,\n height: this.holderHeight,\n color: this.borderColor,\n lineWidth: this.borderWidth,\n crispen: true,\n });\n } else if (this.borderStyle === 2) { // Raised\n const lineWidth = 1 * scale;\n const top = this.holderY + (lineWidth / 2);\n const left = this.holderX + (lineWidth / 2);\n const bottom = this.holderY + this.holderHeight - lineWidth + (lineWidth / 2);\n const right = this.holderX + this.holderWidth - lineWidth + (lineWidth / 2);\n g.strokePath({\n color: Color.BLACK,\n path: new Path(right, bottom)\n .lineTo(right, top)\n .moveTo(right, bottom)\n .lineTo(left, bottom)\n });\n g.strokePath({\n color: Color.WHITE,\n path: new Path(left, top)\n .lineTo(right - lineWidth, top)\n .moveTo(left, top)\n .lineTo(left, bottom - lineWidth)\n });\n } else if (this.borderStyle === 3) { // Lowered\n const lineWidth = 1 * scale;\n const top = this.holderY + (lineWidth / 2);\n const left = this.holderX + (lineWidth / 2);\n const bottom = this.holderY + this.holderHeight - lineWidth + (lineWidth / 2);\n const right = this.holderX + this.holderWidth - lineWidth + (lineWidth / 2);\n g.strokePath({\n color: Color.WHITE,\n path: new Path(right, bottom)\n .lineTo(right, top)\n .moveTo(right, bottom)\n .lineTo(left, bottom)\n });\n g.strokePath({\n color: Color.BLACK,\n path: new Path(left, top)\n .lineTo(right - lineWidth, top)\n .moveTo(left, top)\n .lineTo(left, bottom - lineWidth)\n });\n } else if (this.borderStyle === 4) { // Etched\n this.drawShadowBorder(g, Color.BUTTON_LIGHTEST, Color.BUTTON_DARKER,\n Color.BUTTON_DARKER, Color.BUTTON_LIGHTEST);\n } else if (this.borderStyle === 5) { // Ridged\n this.drawShadowBorder(g, Color.BUTTON_DARKER, Color.BUTTON_LIGHTEST,\n Color.BUTTON_LIGHTEST, Color.BUTTON_DARKER);\n } else if (this.borderStyle === 6) { // Button Raised\n this.drawShadowBorder(g, Color.BUTTON_DARKEST, Color.BUTTON_DARKER,\n Color.BUTTON, Color.BUTTON_LIGHTEST);\n } else if (this.borderStyle === 7) { // Button Pressed\n this.drawShadowBorder(g, Color.BUTTON_LIGHTEST, Color.BUTTON_LIGHTEST,\n Color.BUTTON_DARKEST, Color.BUTTON_DARKER);\n } else if (this.borderStyle === 8) { // Dot\n this.drawDashedBorder(g, [2 * scale, 2 * scale]);\n } else if (this.borderStyle === 9) { // Dash\n this.drawDashedBorder(g, [6 * scale, 2 * scale]);\n } else if (this.borderStyle === 10) { // Dash Dot\n this.drawDashedBorder(g, [6 * scale, 2 * scale, 2 * scale, 2 * scale]);\n } else if (this.borderStyle === 11) { // Dash Dot Dot\n this.drawDashedBorder(g, [6 * scale, 2 * scale, 2 * scale, 2 * scale, 2 * scale, 2 * scale]);\n } else if (this.borderStyle === 12) { // Title bar\n g.fillRect({\n x: this.holderX,\n y: this.holderY + (1 * scale),\n width: this.holderWidth,\n height: 16 * scale,\n color: this.borderColor,\n });\n g.fillText({\n x: this.holderX + (1 * scale) + (3 * scale),\n y: this.holderY + (1 * scale) + (16 / 2 * scale),\n baseline: 'middle',\n align: 'left',\n font: Font.ARIAL_11.scale(scale),\n color: Color.BLACK,\n text: this.name,\n });\n g.strokeRect({\n x: this.holderX,\n y: this.holderY,\n width: this.holderWidth,\n height: this.holderHeight,\n color: Color.BLACK,\n crispen: true,\n });\n } else if (this.borderStyle === 13) { // Group Box\n const fm = g.measureText(this.name, Font.ARIAL_11.scale(scale));\n const lineWidth = 1;\n let box = toBorderBox(\n this.holderX + (8 * scale),\n this.holderY + (8 * scale),\n this.holderWidth - (16 * scale) - lineWidth,\n this.holderHeight - (16 * scale) - lineWidth,\n lineWidth,\n );\n\n if (!this.transparent) {\n // Cover inner box\n g.fillRect({\n ...shrink(box, 8 * scale),\n color: this.backgroundColor,\n });\n // Cover label\n g.fillRect({\n x: this.holderX + (16 * scale),\n y: this.holderY,\n width: fm.width,\n height: 16 * scale,\n color: this.backgroundColor,\n });\n }\n\n g.fillText({\n x: this.holderX + (16 * scale),\n y: this.holderY + (8 * scale),\n baseline: 'middle',\n align: 'left',\n font: Font.ARIAL_11.scale(scale),\n color: this.borderColor,\n text: this.name,\n });\n\n // Avoid drawing border over text\n g.strokePath({\n color: this.backgroundColor.darker(),\n path: new Path(box.x, box.y)\n .lineTo(box.x + (8 * scale), box.y)\n .moveTo(box.x + (8 * scale) + fm.width, box.y)\n .lineTo(box.x + box.width, box.y)\n .lineTo(box.x + box.width, box.y + box.height)\n .lineTo(box.x, box.y + box.height)\n .lineTo(box.x, box.y)\n });\n\n box = toBorderBox(\n this.holderX + (8 * scale) + lineWidth,\n this.holderY + (8 * scale) + lineWidth,\n this.holderWidth - (16 * scale) - lineWidth,\n this.holderHeight - (16 * scale) - lineWidth,\n lineWidth,\n );\n\n g.strokePath({\n color: this.backgroundColor.brighter(),\n path: new Path(box.x, box.y)\n .lineTo(box.x + (8 * scale) - lineWidth, box.y)\n .moveTo(box.x + (8 * scale) - lineWidth + fm.width, box.y)\n .lineTo(box.x + box.width, box.y)\n .lineTo(box.x + box.width, box.y + box.height)\n .lineTo(box.x, box.y + box.height)\n .lineTo(box.x, box.y)\n });\n } else if (this.borderStyle === 14) { // Round Rectangle Background\n const box = toBorderBox(this.holderX, this.holderY, this.holderWidth, this.holderHeight, this.borderWidth);\n\n if (this.fillRoundRectangleBackgroundBorder) {\n g.fillRect({\n ...box,\n rx: 4 * scale,\n ry: 4 * scale,\n color: this.backgroundColor,\n });\n }\n if (this.borderWidth) {\n g.strokeRect({\n ...box,\n rx: 4 * scale,\n ry: 4 * scale,\n color: this.borderColor,\n lineWidth: this.borderWidth,\n });\n }\n } else if (this.borderStyle === 15) { // Empty\n // NOP\n } else {\n console.warn(`Unsupported border style: ${this.borderStyle}`);\n }\n }\n\n drawDecoration(g: Graphics) {\n if (this.display.editMode) {\n return;\n }\n const { scale } = this;\n\n if (this.pvName && (!this.pv || this.pv.disconnected)) { // Disconnected\n const lineWidth = 1 * scale;\n g.fillRect({\n x: this.holderX - (lineWidth / 2),\n y: this.holderY - (lineWidth / 2),\n width: this.holderWidth + lineWidth,\n height: this.holderHeight + lineWidth,\n color: Color.PURPLE,\n opacity: 0.4,\n });\n g.strokeRect({\n x: this.holderX - (lineWidth / 2),\n y: this.holderY - (lineWidth / 2),\n width: this.holderWidth + lineWidth,\n height: this.holderHeight + lineWidth,\n color: Color.PURPLE,\n });\n } else if (this.pv && this.pv.value === undefined) { // Connected, but no value\n g.strokeRect({\n ...this.bounds,\n dash: [2 * scale, 2 * scale],\n lineWidth: 2 * scale,\n color: Color.PINK,\n crispen: true,\n });\n }\n\n if (this.borderAlarmSensitive) {\n let dash;\n if (this.borderStyle === 8) { // Dot\n dash = [2 * scale, 2 * scale];\n } else if (this.borderStyle === 9) { // Dash\n dash = [6 * scale, 2 * scale];\n } else if (this.borderStyle === 10) { // Dash Dot\n dash = [6 * scale, 2 * scale, 2 * scale, 2 * scale];\n } else if (this.borderStyle === 11) { // Dash Dot Dot\n dash = [6 * scale, 2 * scale, 2 * scale, 2 * scale, 2 * scale, 2 * scale];\n }\n if (this.pv?.severity === AlarmSeverity.MAJOR) {\n g.strokeRect({\n ... this.bounds,\n lineWidth: 2 * scale,\n color: Color.RED,\n crispen: true,\n dash,\n });\n } else if (this.pv?.severity === AlarmSeverity.MINOR) {\n g.strokeRect({\n ... this.bounds,\n lineWidth: 2 * scale,\n color: Color.ORANGE,\n crispen: true,\n dash\n });\n } else if (this.pv?.severity === AlarmSeverity.INVALID) {\n g.strokeRect({\n ... this.bounds,\n lineWidth: 2 * scale,\n color: Color.PINK,\n crispen: true,\n });\n }\n }\n }\n\n drawOverlay(g: Graphics) {\n }\n\n drawSelection(ctx: CanvasRenderingContext2D) {\n ctx.lineWidth = 1;\n ctx.strokeStyle = 'black';\n ctx.strokeRect(this.holderX - 0.5, this.holderY - 0.5, this.holderWidth + 1, this.holderHeight + 1);\n ctx.fillStyle = 'black';\n let r = 2;\n ctx.fillRect(this.holderX - r, this.holderY - r, r + r, r + r);\n ctx.fillRect(this.holderX + this.holderWidth / 2 - r, this.holderY - r, r + r, r + r);\n ctx.fillRect(this.holderX + this.holderWidth - r, this.holderY - r, r + r, r + r);\n\n ctx.fillRect(this.holderX - r, this.holderY + this.holderHeight / 2 - r, r + r, r + r);\n ctx.fillRect(this.holderX + this.holderWidth - r, this.holderY + this.holderHeight / 2 - r, r + r, r + r);\n\n ctx.fillRect(this.holderX - r, this.holderY + this.holderHeight - r, r + r, r + r);\n ctx.fillRect(this.holderX + this.holderWidth / 2 - r, this.holderY + this.holderHeight - r, r + r, r + r);\n ctx.fillRect(this.holderX + this.holderWidth - r, this.holderY + this.holderHeight - r, r + r, r + r);\n\n ctx.strokeStyle = 'white';\n r = 3;\n ctx.strokeRect(this.holderX - r + 0.5, this.holderY - r + 0.5, r + r - 1, r + r - 1);\n ctx.strokeRect(this.holderX + this.holderWidth / 2 - r + 0.5, this.holderY - r + 0.5, r + r - 1, r + r - 1);\n ctx.strokeRect(this.holderX + this.holderWidth - r + 0.5, this.holderY - r + 0.5, r + r - 1, r + r - 1);\n\n ctx.strokeRect(this.holderX - r + 0.5, this.holderY + this.holderHeight / 2 - r + 0.5, r + r - 1, r + r - 1);\n ctx.strokeRect(this.holderX + this.holderWidth - r + 0.5, this.holderY + this.holderHeight / 2 - r + 0.5, r + r - 1, r + r - 1);\n\n ctx.strokeRect(this.holderX - r + 0.5, this.holderY + this.holderHeight - r + 0.5, r + r - 1, r + r - 1);\n ctx.strokeRect(this.holderX + this.holderWidth / 2 - r + 0.5, this.holderY + this.holderHeight - r + 0.5, r + r - 1, r + r - 1);\n ctx.strokeRect(this.holderX + this.holderWidth - r + 0.5, this.holderY + this.holderHeight - r + 0.5, r + r - 1, r + r - 1);\n }\n\n requestRepaint() {\n this.display.requestRepaint();\n }\n\n resolvePath(path: string) {\n return this.display.resolvePath(path, this);\n }\n\n /**\n * Bounds of this widget (within its parent).\n * Bounds cover the entire widget: area + ornaments.\n */\n get bounds(): Bounds {\n return {\n x: this.holderX,\n y: this.holderY,\n width: this.holderWidth,\n height: this.holderHeight,\n };\n }\n\n get unscaledBounds(): Bounds {\n return {\n x: this.properties.getValue(PROP_X),\n y: this.properties.getValue(PROP_Y),\n width: this.properties.getValue(PROP_WIDTH),\n height: this.properties.getValue(PROP_HEIGHT),\n };\n }\n\n /**\n * Area where the widget can draw.\n * (this is smaller than the actual widget bounds).\n */\n get area(): Bounds {\n return {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n };\n }\n\n private drawShadowBorder(g: Graphics, c1: Color, c2: Color, c3: Color, c4: Color) {\n const lineWidth = 1 * this.scale;\n const top = this.holderY + (lineWidth / 2);\n const left = this.holderX + (lineWidth / 2);\n const bottom = this.holderY + this.holderHeight - lineWidth + (lineWidth / 2);\n const right = this.holderX + this.holderWidth - lineWidth + (lineWidth / 2);\n g.strokePath({\n color: c1,\n path: new Path(right, bottom)\n .lineTo(right, top)\n .moveTo(right, bottom)\n .lineTo(left, bottom)\n });\n g.strokePath({\n color: c2,\n path: new Path(right - lineWidth, bottom - lineWidth)\n .lineTo(right - lineWidth, top + lineWidth)\n .moveTo(right - lineWidth, bottom - lineWidth)\n .lineTo(left + lineWidth, bottom - lineWidth)\n });\n g.strokePath({\n color: c3,\n path: new Path(left, top)\n .lineTo(right - lineWidth, top)\n .moveTo(left, top)\n .lineTo(left, bottom - lineWidth)\n });\n g.strokePath({\n color: c4,\n path: new Path(left + lineWidth, top + lineWidth)\n .lineTo(right - lineWidth - lineWidth, top + lineWidth)\n .moveTo(left + lineWidth, top + lineWidth)\n .lineTo(left + lineWidth, bottom - lineWidth - lineWidth)\n });\n }\n\n private drawDashedBorder(g: Graphics, dash: number[]) {\n const bbox = toBorderBox(this.holderX, this.holderY, this.holderWidth, this.holderHeight, this.borderWidth);\n g.strokePath({\n color: this.borderColor,\n lineWidth: this.borderWidth,\n dash,\n path: new Path(bbox.x, bbox.y)\n .lineTo(bbox.x + bbox.width, bbox.y)\n .lineTo(bbox.x + bbox.width, bbox.y + bbox.height)\n .lineTo(bbox.x, bbox.y + bbox.height)\n .closePath()\n });\n }\n\n executeAction(index: number) {\n const action = this.actions.getAction(index);\n if (!action) {\n return;\n }\n\n switch (action.type) {\n case 'OPEN_DISPLAY':\n const event: OpenDisplayEvent = {\n path: action.path,\n replace: action.mode === 0,\n };\n this.display.fireEvent('opendisplay', event);\n break;\n case 'EXECUTE_JAVASCRIPT':\n if (action.embedded) {\n // TODO should the current widget be passed?\n const engine = new ScriptEngine(this.display.instance!, action.text!);\n engine.run();\n } else {\n fetch(this.display.resolvePath(action.path!), {\n // Send cookies too.\n // Old versions of Firefox do not do this automatically.\n credentials: 'same-origin'\n }).then(response => {\n if (response.ok) {\n response.text().then(text => {\n const engine = new ScriptEngine(this.display.instance!, text);\n engine.run();\n });\n }\n });\n }\n break;\n case 'WRITE_PV':\n if (action.pvName) {\n const pvName = this.expandMacro(action.pvName);\n this.display.pvEngine.createPV(pvName);\n this.display.pvEngine.setValue(new Date(), pvName, action.value);\n }\n break;\n case 'PLAY_SOUND':\n if (action.path) {\n const audio = new Audio(this.display.resolvePath(action.path!));\n audio.play();\n }\n break;\n case 'OPEN_WEBPAGE':\n if (action.hyperlink) {\n window.location.href = action.hyperlink;\n }\n break;\n default:\n throw new Error(`Unsupported command ${action.type}`);\n }\n }\n\n expandMacro(text: string) {\n if (text.indexOf('$') === -1) {\n return text;\n } else {\n for (const prop of this.properties.all()) {\n // Both ${pv_name} and $(pv_name) notations are accepted\n\n if (prop instanceof PVValueProperty) {\n const pvProperty = this.properties.getProperty(prop.pvPropertyName);\n let replacement = '';\n const pvName = pvProperty?.value;\n if (pvName) {\n const pv = this.display.getPV(pvName);\n replacement = pv?.value ?? '';\n }\n text = text.replace(`$(${prop.name})`, replacement);\n text = text.replace(`\\${${prop.name}}`, replacement);\n } else {\n text = text.replace(`$(${prop.name})`, prop.value || '');\n text = text.replace(`\\${${prop.name}}`, prop.value || '');\n }\n }\n return this.parent ? this.parent.expandContainerMacros(text) : text;\n }\n }\n\n get pv(): PV | undefined {\n if (this.pvName) {\n return this.display.getPV(this.pvName);\n }\n }\n\n isMinorSeverity() {\n return this.pv?.severity === AlarmSeverity.MINOR;\n }\n\n isMajorSeverity() {\n return this.pv?.severity === AlarmSeverity.MAJOR;\n }\n\n get alarm() {\n return this.pv?.severity === AlarmSeverity.MINOR\n || this.pv?.severity === AlarmSeverity.MAJOR;\n }\n\n get alarmSensitiveBackgroundColor() {\n if (this.backgroundAlarmSensitive) {\n if (this.isMajorSeverity()) {\n return Color.RED;\n } else if (this.isMinorSeverity()) {\n return Color.ORANGE;\n }\n }\n return this.backgroundColor;\n }\n\n get alarmSensitiveForegroundColor() {\n if (this.foregroundAlarmSensitive) {\n if (this.isMajorSeverity()) {\n return Color.RED;\n } else if (this.isMinorSeverity()) {\n return Color.ORANGE;\n }\n }\n return this.foregroundColor;\n }\n\n get scale() {\n let scale = this.display.scale;\n let parent = this.parent;\n while (parent) {\n scale *= parent.relativeScale;\n parent = parent.parent;\n }\n return scale;\n }\n\n get value() {\n return this._value;\n }\n\n set value(value: any) {\n this._value = value;\n this.requestRepaint();\n }\n\n addPropertyListener(propertyName: string, listener: PropertyListener<any>) {\n const property = this.properties.getProperty(propertyName)!;\n property.addListener(listener);\n }\n\n removePropertyListener(propertyName: string, listener: PropertyListener<any>) {\n const property = this.properties.getProperty(propertyName)!;\n property.removeListener(listener);\n }\n\n /**\n * Returns this widget as an image.\n */\n toDataURL(type = 'image/png', quality?: any) {\n const area = this.display.measureAbsoluteArea(this);\n const canvas = this.display.copyCanvas(area);\n return canvas.toDataURL(type, quality);\n }\n\n get wuid(): string { return this.properties.getValue(PROP_WUID); }\n get name(): string { return this.properties.getValue(PROP_NAME); }\n get holderX(): number {\n return this.scale * this.properties.getValue(PROP_X);\n }\n get holderY(): number {\n return this.scale * this.properties.getValue(PROP_Y);\n }\n get holderWidth(): number {\n return this.scale * this.properties.getValue(PROP_WIDTH);\n }\n get holderHeight(): number {\n return this.scale * this.properties.getValue(PROP_HEIGHT);\n }\n get borderAlarmSensitive(): boolean {\n return this.properties.getValue(PROP_BORDER_ALARM_SENSITIVE);\n }\n get backgroundAlarmSensitive(): boolean {\n return this.properties.getValue(PROP_BACKGROUND_ALARM_SENSITIVE);\n }\n get foregroundAlarmSensitive(): boolean {\n return this.properties.getValue(PROP_FOREGROUND_ALARM_SENSITIVE);\n }\n get pvName(): string | undefined { return this.properties.getValue(PROP_PV_NAME, true); }\n get pvValue(): any { return this.properties.getValue(PROP_PV_VALUE, true); }\n get borderColor(): Color { return this.properties.getValue(PROP_BORDER_COLOR); }\n get borderStyle(): number { return this.properties.getValue(PROP_BORDER_STYLE); }\n get borderWidth(): number {\n return this.scale * this.properties.getValue(PROP_BORDER_WIDTH);\n }\n get backgroundColor(): Color { return this.properties.getValue(PROP_BACKGROUND_COLOR); }\n get enabled(): boolean { return this.properties.getValue(PROP_ENABLED); }\n get foregroundColor(): Color { return this.properties.getValue(PROP_FOREGROUND_COLOR); }\n get tooltip(): string | undefined {\n const property = this.properties.getProperty(PROP_TOOLTIP) as StringProperty;\n if (property.rawValue) {\n return this.expandMacro(property.rawValue);\n }\n }\n get transparent(): boolean { return this.properties.getValue(PROP_TRANSPARENT); }\n get visible(): boolean { return this.properties.getValue(PROP_VISIBLE); }\n get actions(): ActionSet { return this.properties.getValue(PROP_ACTIONS); }\n get scripts(): ScriptSet { return this.properties.getValue(PROP_SCRIPTS); }\n get rules(): RuleSet { return this.properties.getValue(PROP_RULES); }\n get scaleOptions(): ScaleOptions { return this.properties.getValue(PROP_SCALE_OPTIONS); }\n get widgetType(): string | undefined { return this.properties.getValue(PROP_WIDGET_TYPE, true); }\n\n get text(): string {\n if (this.display.editMode) {\n const prop = this.properties.getProperty(PROP_TEXT) as StringProperty;\n return (prop.rawValue || '').split(' ').join('\\u00a0'); // Preserve whitespace\n } else {\n const text = this.properties.getValue(PROP_TEXT);\n return text.split(' ').join('\\u00a0'); // Preserve whitespace\n }\n }\n\n /**\n * Called exactly once post-construct. A destroyed widget will\n * never be re-inited.\n */\n init(): void { }\n\n /**\n * Called when a widget should temporarily hide content\n * (tab switch).\n *\n * Most widgets don't need to override, but it used by some\n * that position HTML on top of the canvas.\n *\n * Unhide should occur upon the next draw request.\n */\n hide(): void { }\n\n /**\n * Called when a widget will never be used again.\n * (display close).\n */\n destroy(): void { }\n\n abstract draw(g: Graphics): void;\n}\n","import { Display } from '../../Display';\nimport { MacroSet } from '../../macros';\nimport { MacrosProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { Connection } from './Connection';\n\nconst PROP_MACROS = 'macros';\n\nexport abstract class AbstractContainerWidget extends Widget {\n\n _widgets: Widget[] = [];\n _connections: Connection[] = [];\n\n /**\n * Scale relative to immediate parent.\n */\n relativeScale = 1;\n\n constructor(display: Display, parent?: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new MacrosProperty(PROP_MACROS));\n }\n\n expandContainerMacros(text: string): string {\n for (const key in this.macros.macros) {\n // Both ${pv_name} and $(pv_name) notations are accepted\n text = text.replace(`$(${key})`, this.macros.macros[key]);\n text = text.replace(`\\${${key}}`, this.macros.macros[key]);\n }\n\n if (this.parent && this.macros.includeParentMacros) {\n text = this.parent.expandContainerMacros(text);\n }\n return text;\n }\n\n findWidget(wuid: string): Widget | undefined {\n for (const widget of this.widgets) {\n if (widget.wuid === wuid) {\n return widget;\n } else if (widget instanceof AbstractContainerWidget) {\n const match = widget.findWidget(wuid);\n if (match) {\n return match;\n }\n }\n }\n }\n\n findWidgetByName(name: string): Widget | undefined {\n for (const widget of this.widgets) {\n if (widget.name === name) {\n return widget;\n } else if (widget instanceof AbstractContainerWidget) {\n const match = widget.findWidgetByName(name);\n if (match) {\n return match;\n }\n }\n }\n for (const connection of this.connections) {\n if (connection.name === name) {\n return connection;\n }\n }\n }\n\n hide() {\n for (const widget of this.widgets) {\n widget.hide();\n }\n }\n\n destroy() {\n for (const widget of this.widgets) {\n widget.destroy();\n }\n }\n\n // Exposed as properties to make it easier to override them\n // (used by Linkingcontainer)\n get widgets() { return this._widgets; }\n get connections() { return this._connections; }\n get macros(): MacroSet { return this.properties.getValue(PROP_MACROS); }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Graphics, Path } from '../../Graphics';\nimport { convertCartesianToPolar, Point, PolarPoint, scalePoints, translatePoint } from '../../positioning';\nimport { BooleanProperty, ColorProperty, IntProperty, PointsProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { XMLNode } from '../../XMLNode';\n\nconst PROP_ARROW_LENGTH = 'arrow_length';\nconst PROP_ARROWS = 'arrows';\nconst PROP_FILL_ARROW = 'fill_arrow';\nconst PROP_NAME = 'name';\nconst PROP_LINE_COLOR = 'line_color';\nconst PROP_LINE_STYLE = 'line_style';\nconst PROP_LINE_WIDTH = 'line_width';\nconst PROP_SRC_WUID = 'src_wuid';\nconst PROP_SRC_TERM = 'src_term';\nconst PROP_TGT_WUID = 'tgt_wuid';\nconst PROP_TGT_TERM = 'tgt_term';\nconst PROP_ROUTER = 'router';\nconst PROP_POINTS = 'points';\nconst PROP_WUID = 'wuid';\n\nconst DIRECTION_LEFT = 'LEFT';\nconst DIRECTION_UP = 'UP';\nconst DIRECTION_DOWN = 'DOWN';\nconst DIRECTION_RIGHT = 'RIGHT';\n\ninterface RoutePoint extends Point {\n x: number;\n y: number;\n direction: string;\n}\n\nexport class Connection extends Widget {\n\n private sourceWidget?: Widget;\n private targetWidget?: Widget;\n\n constructor(display: Display) {\n super(display);\n this.properties.clear();\n this.properties.add(new IntProperty(PROP_ARROW_LENGTH));\n this.properties.add(new IntProperty(PROP_ARROWS));\n this.properties.add(new BooleanProperty(PROP_FILL_ARROW));\n this.properties.add(new StringProperty(PROP_NAME));\n this.properties.add(new ColorProperty(PROP_LINE_COLOR));\n this.properties.add(new IntProperty(PROP_LINE_STYLE));\n this.properties.add(new IntProperty(PROP_LINE_WIDTH));\n this.properties.add(new StringProperty(PROP_SRC_WUID));\n this.properties.add(new StringProperty(PROP_SRC_TERM));\n this.properties.add(new StringProperty(PROP_TGT_WUID));\n this.properties.add(new StringProperty(PROP_TGT_TERM));\n this.properties.add(new IntProperty(PROP_ROUTER));\n this.properties.add(new PointsProperty(PROP_POINTS));\n this.properties.add(new StringProperty(PROP_WUID));\n }\n\n parseNode(node: XMLNode) {\n this.properties.loadXMLValues(node);\n\n this.sourceWidget = this.display.findWidget(this.sourceWuid);\n if (!this.sourceWidget) {\n console.warn(`Can't find source widget ${this.sourceWuid}`);\n }\n\n this.targetWidget = this.display.findWidget(this.targetWuid);\n if (!this.targetWidget) {\n console.warn(`Can't find target widget ${this.targetWuid}`);\n }\n }\n\n draw(g: Graphics) {\n if (!this.sourceWidget || !this.targetWidget) {\n return;\n }\n\n if (this.points.length) { // Only present if the user has manually repositioned a mid-point.\n this.drawPath(g);\n } else if (this.router === 0) {\n this.drawManhattanConnection(g);\n } else if (this.router === 1) {\n this.drawDirectConnection(g);\n }\n }\n\n private drawPath(g: Graphics) {\n const from = this.getPosition(this.sourceWidget!, this.sourceTerm);\n const to = this.getPosition(this.targetWidget!, this.targetTerm);\n\n const points = [from, ... this.points, to];\n const path = Path.fromPoints(points).translate(0.5 * this.scale, 0.5 * this.scale);\n\n g.strokePath({\n path,\n lineWidth: this.lineWidth,\n color: this.lineColor,\n dash: this.getDashArray(),\n });\n\n this.drawStartArrow(g, points[1], points[0]);\n this.drawStopArrow(g, points[points.length - 2], points[points.length - 1]);\n }\n\n private drawManhattanConnection(g: Graphics) {\n const source = this.getManhattanAnchor(this.sourceWidget!, this.sourceTerm);\n const target = this.getManhattanAnchor(this.targetWidget!, this.targetTerm);\n\n const points = this.route(source, target);\n const path = Path.fromPoints(points);\n\n if (this.lineWidth) {\n g.strokePath({\n lineWidth: this.lineWidth,\n color: this.lineColor,\n path,\n dash: this.getDashArray(),\n });\n }\n\n this.drawStartArrow(g, points[points.length - 2], points[points.length - 1]);\n this.drawStopArrow(g, points[1], points[0]);\n }\n\n private getDashArray() {\n const { scale } = this;\n if (this.lineWidth) {\n if (this.lineStyle === 0) { // Solid\n return [];\n } else if (this.lineStyle === 1) { // Dash\n return [6 * scale, 2 * scale];\n } else if (this.lineStyle === 2) { // Dot\n return [2 * scale, 2 * scale];\n } else if (this.lineStyle === 3) { // Dash Dot\n return [6 * scale, 2 * scale, 2 * scale, 2 * scale];\n } else if (this.lineStyle === 4) { // Dash Dot Dot\n return [6 * scale, 2 * scale, 2 * scale, 2 * scale, 2 * scale, 2 * scale];\n } else {\n console.warn(`Unsupported connection line style ${this.lineStyle}`);\n }\n }\n }\n\n private drawDirectConnection(g: Graphics) {\n const from = this.getPosition(this.sourceWidget!, this.sourceTerm);\n const to = this.getPosition(this.targetWidget!, this.targetTerm);\n if (this.lineWidth) {\n g.strokePath({\n path: new Path(from.x, from.y).lineTo(to.x, to.y),\n lineWidth: this.lineWidth,\n color: this.lineColor,\n dash: this.getDashArray(),\n });\n }\n this.drawStartArrow(g, to, from);\n this.drawStopArrow(g, from, to);\n }\n\n // Gets the direction that a connector should have when connecting\n // to a particular anchor.\n private getManhattanAnchor(widget: Widget, term: string): RoutePoint {\n let direction;\n switch (term) {\n case 'TOP':\n case 'TOP_LEFT':\n case 'TOP_RIGHT':\n direction = DIRECTION_UP;\n break;\n case 'BOTTOM':\n case 'BOTTOM_LEFT':\n case 'BOTTOM_RIGHT':\n direction = DIRECTION_DOWN;\n break;\n case 'LEFT':\n direction = DIRECTION_LEFT;\n break;\n case 'RIGHT':\n direction = DIRECTION_RIGHT;\n break;\n default:\n }\n\n const bounds = widget.bounds;\n const position = this.getPosition(widget, term);\n\n const distanceLeft = position.x - bounds.x;\n const distanceRight = bounds.x + bounds.width - position.x;\n const distanceTop = position.y - bounds.y;\n const distanceBottom = bounds.y + bounds.height - position.y;\n if (Math.min(distanceLeft, distanceRight) < Math.min(distanceTop, distanceBottom)) {\n direction = distanceLeft < distanceRight ? DIRECTION_LEFT : DIRECTION_RIGHT;\n } else {\n direction = distanceTop < distanceBottom ? DIRECTION_UP : DIRECTION_DOWN;\n }\n\n return {\n x: position.x,\n y: position.y,\n direction,\n };\n }\n\n private getPosition(widget: Widget, term: string): Point {\n switch (term) {\n case 'LEFT':\n return {\n x: widget.holderX,\n y: widget.holderY + (widget.holderHeight / 2),\n };\n case 'TOP':\n return {\n x: widget.holderX + (widget.holderWidth / 2),\n y: widget.holderY,\n };\n case 'RIGHT':\n return {\n x: widget.holderX + widget.holderWidth,\n y: widget.holderY + (widget.holderHeight / 2),\n };\n case 'BOTTOM':\n return {\n x: widget.holderX + (widget.holderWidth / 2),\n y: widget.holderY + widget.holderHeight,\n };\n case 'TOP_LEFT':\n return {\n x: widget.holderX,\n y: widget.holderY,\n };\n case 'TOP_RIGHT':\n return {\n x: widget.holderX + widget.holderWidth,\n y: widget.holderY,\n };\n case 'BOTTOM_LEFT':\n return {\n x: widget.holderX,\n y: widget.holderY + widget.holderHeight,\n };\n case 'BOTTOM_RIGHT':\n return {\n x: widget.holderX + widget.holderWidth,\n y: widget.holderY + widget.holderHeight,\n };\n default:\n const idx = parseInt(term, 10);\n let pointsProperty = widget.properties.getProperty('points');\n if (pointsProperty) {\n let points = pointsProperty.value as Point[];\n points = scalePoints(points, this.scale);\n return points[idx];\n } else {\n throw Error(`Unexpected term ${term}`);\n }\n }\n }\n\n private route(from: RoutePoint, to: RoutePoint): Point[] {\n let xDiff = from.x - to.x;\n let yDiff = from.y - to.y;\n let point: Point = { x: 0, y: 0 };\n let dir;\n let pos;\n let path: Point[] = [];\n const { tolxtol, tol, minDist } = this;\n\n if (((xDiff * xDiff) < tolxtol) && ((yDiff * yDiff) < tolxtol)) {\n return [{ x: to.x, y: to.y }];\n }\n\n if (from.direction === DIRECTION_LEFT) {\n if ((xDiff > 0) && ((yDiff * yDiff) < tol) && (to.direction === DIRECTION_RIGHT)) {\n point = to;\n dir = to.direction;\n }\n else {\n if (xDiff < 0) {\n point = { x: from.x - minDist, y: from.y };\n }\n else if (((yDiff > 0) && (to.direction === DIRECTION_DOWN)) || ((yDiff < 0) && (to.direction === DIRECTION_UP))) {\n point = { x: to.x, y: from.y };\n }\n else if (from.direction === to.direction) {\n pos = Math.min(from.x, to.x) - minDist;\n point = { x: pos, y: from.y };\n }\n else {\n point = { x: from.x - (xDiff / 2), y: from.y };\n }\n\n if (yDiff > 0) {\n dir = DIRECTION_UP;\n }\n else {\n dir = DIRECTION_DOWN;\n }\n }\n }\n else if (from.direction === DIRECTION_RIGHT) {\n if ((xDiff < 0) && ((yDiff * yDiff) < tol) && (to.direction === DIRECTION_LEFT)) {\n point = to;\n dir = to.direction;\n }\n else {\n if (xDiff > 0) {\n point = { x: from.x + minDist, y: from.y };\n }\n else if (((yDiff > 0) && (to.direction === DIRECTION_DOWN)) || ((yDiff < 0) && (to.direction === DIRECTION_UP))) {\n point = { x: to.x, y: from.y };\n }\n else if (from.direction === to.direction) {\n pos = Math.max(from.x, to.x) + minDist;\n point = { x: pos, y: from.y };\n }\n else {\n point = { x: from.x - (xDiff / 2), y: from.y };\n }\n\n if (yDiff > 0) {\n dir = DIRECTION_UP;\n }\n else {\n dir = DIRECTION_DOWN;\n }\n }\n }\n else if (from.direction === DIRECTION_DOWN) {\n if (((xDiff * xDiff) < tol) && (yDiff < 0) && (to.direction === DIRECTION_UP)) {\n point = to;\n dir = to.direction;\n }\n else {\n if (yDiff > 0) {\n point = { x: from.x, y: from.y + minDist };\n }\n else if (((xDiff > 0) && (to.direction === DIRECTION_RIGHT)) || ((xDiff < 0) && (to.direction === DIRECTION_LEFT))) {\n point = { x: from.x, y: to.y };\n }\n else if (from.direction === to.direction) {\n pos = Math.max(from.y, to.y) + minDist;\n point = { x: from.x, y: pos };\n }\n else {\n point = { x: from.x, y: from.y - (yDiff / 2) };\n }\n\n if (xDiff > 0) {\n dir = DIRECTION_LEFT;\n }\n else {\n dir = DIRECTION_RIGHT;\n }\n }\n }\n else if (from.direction === DIRECTION_UP) {\n if (((xDiff * xDiff) < tol) && (yDiff > 0) && (to.direction === DIRECTION_DOWN)) {\n point = to;\n dir = to.direction;\n }\n else {\n if (yDiff < 0) {\n point = { x: from.x, y: from.y - minDist };\n }\n else if (((xDiff > 0) && (to.direction === DIRECTION_RIGHT)) || ((xDiff < 0) && (to.direction === DIRECTION_LEFT))) {\n point = { x: from.x, y: to.y };\n }\n else if (from.direction === to.direction) {\n pos = Math.min(from.y, to.y) - minDist;\n point = { x: from.x, y: pos };\n }\n else {\n point = { x: from.x, y: from.y - (yDiff / 2) };\n }\n\n if (xDiff > 0) {\n dir = DIRECTION_LEFT;\n }\n else {\n dir = DIRECTION_RIGHT;\n }\n }\n }\n\n const fromAnchor: RoutePoint = { ...point, direction: dir as any };\n path = path.concat(this.route(fromAnchor, to));\n path.push(from);\n return path;\n }\n\n private drawStartArrow(g: Graphics, startPoint: Point, endPoint: Point) {\n const ctx = g.ctx;\n if (this.arrows === 1 || this.arrows === 3) { // From or Both\n const arrowPoints = this.calculateArrowPoints(startPoint, endPoint);\n arrowPoints[2] = endPoint;\n if (this.fillArrow) {\n ctx.fillStyle = this.lineColor.toString();\n ctx.beginPath();\n for (let i = 0; i < arrowPoints.length; i++) {\n if (i === 0) {\n ctx.moveTo(arrowPoints[i].x, arrowPoints[i].y);\n } else {\n ctx.lineTo(arrowPoints[i].x, arrowPoints[i].y);\n }\n }\n ctx.fill();\n } else {\n ctx.strokeStyle = this.lineColor.toString();\n ctx.lineWidth = this.lineWidth;\n ctx.beginPath();\n ctx.moveTo(endPoint.x, endPoint.y);\n ctx.lineTo(arrowPoints[0].x, arrowPoints[0].y);\n ctx.moveTo(endPoint.x, endPoint.y);\n ctx.lineTo(arrowPoints[1].x, arrowPoints[1].y);\n ctx.stroke();\n }\n }\n }\n\n private drawStopArrow(g: Graphics, startPoint: Point, endPoint: Point) {\n const ctx = g.ctx;\n if (this.arrows === 2 || this.arrows === 3) { // To or Both\n const arrowPoints = this.calculateArrowPoints(startPoint, endPoint);\n arrowPoints[2] = endPoint;\n\n if (this.fillArrow) {\n ctx.fillStyle = this.lineColor.toString();\n ctx.beginPath();\n for (let i = 0; i < arrowPoints.length; i++) {\n if (i === 0) {\n ctx.moveTo(arrowPoints[i].x, arrowPoints[i].y);\n } else {\n ctx.lineTo(arrowPoints[i].x, arrowPoints[i].y);\n }\n }\n ctx.fill();\n } else {\n ctx.strokeStyle = this.lineColor.toString();\n ctx.lineWidth = this.lineWidth;\n ctx.beginPath();\n ctx.moveTo(endPoint.x, endPoint.y);\n ctx.lineTo(arrowPoints[0].x, arrowPoints[0].y);\n ctx.moveTo(endPoint.x, endPoint.y);\n ctx.lineTo(arrowPoints[1].x, arrowPoints[1].y);\n ctx.stroke();\n }\n }\n }\n\n private calculateArrowPoints(startPoint: Point, endPoint: Point): Point[] {\n const ppE = convertCartesianToPolar(endPoint, startPoint);\n const angle = Math.PI / 10;\n\n const ppR = new PolarPoint(this.arrowLength, ppE.theta - angle);\n const ppL = new PolarPoint(this.arrowLength, ppE.theta + angle);\n\n // Intersection point between arrow and line.\n const ppI = new PolarPoint(Math.floor(this.arrowLength * Math.cos(angle)), ppE.theta);\n\n const pR = translatePoint(ppR.toPoint(), endPoint.x, endPoint.y);\n const pL = translatePoint(ppL.toPoint(), endPoint.x, endPoint.y);\n const pI = translatePoint(ppI.toPoint(), endPoint.x, endPoint.y);\n return [pR, pL, pI];\n }\n\n get minDist() { return this.scale * 20; }\n get tol() { return this.scale * 0.1; }\n get tolxtol() { return this.scale * 0.01; }\n\n get name(): string { return this.properties.getValue(PROP_NAME); }\n get arrows(): number { return this.properties.getValue(PROP_ARROWS); }\n get fillArrow(): boolean { return this.properties.getValue(PROP_FILL_ARROW); }\n get arrowLength(): number {\n return this.scale * this.properties.getValue(PROP_ARROW_LENGTH);\n }\n get lineColor(): Color { return this.properties.getValue(PROP_LINE_COLOR); }\n get lineStyle(): number { return this.properties.getValue(PROP_LINE_STYLE); }\n get lineWidth(): number {\n return this.scale * this.properties.getValue(PROP_LINE_WIDTH);\n }\n get router(): number { return this.properties.getValue(PROP_ROUTER); }\n get sourceTerm(): string { return this.properties.getValue(PROP_SRC_TERM); }\n get sourceWuid(): string { return this.properties.getValue(PROP_SRC_WUID); }\n get targetTerm(): string { return this.properties.getValue(PROP_TGT_TERM); }\n get targetWuid(): string { return this.properties.getValue(PROP_TGT_WUID); }\n get points(): Point[] {\n return scalePoints(this.properties.getValue(PROP_POINTS), this.scale);\n }\n}\n","import { Display } from '../../Display';\nimport { Graphics } from '../../Graphics';\nimport { Bounds } from '../../positioning';\nimport { AutoScaleWidgetsProperty } from '../../properties';\nimport { AutoScaleWidgets } from '../../scale';\nimport { XMLNode } from '../../XMLNode';\nimport { AbstractContainerWidget } from './AbstractContainerWidget';\nimport { Connection } from './Connection';\n\nlet DID_SEQUENCE = 0;\n\nconst PROP_AUTO_SCALE_WIDGETS = 'auto_scale_widgets';\n\nexport class DisplayWidget extends AbstractContainerWidget {\n\n constructor(display: Display, parent?: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new AutoScaleWidgetsProperty(PROP_AUTO_SCALE_WIDGETS));\n }\n\n parseNode(node: XMLNode) {\n super.parseNode(node);\n\n const displayId = DID_SEQUENCE++;\n this.macros.set('DID', `DID_${displayId}`);\n const displayName = this.properties.getValue('name');\n this.macros.set('DNAME', displayName);\n\n for (const widgetNode of node.getNodes('widget')) {\n const kind = widgetNode.getString('widget_type');\n const widget = this.display.createWidget(kind, this);\n if (widget) {\n widget.parseNode(widgetNode);\n this.widgets.push(widget);\n }\n }\n for (const connectionNode of node.getNodes('connection')) {\n const connection = new Connection(this.display);\n connection.parseNode(connectionNode);\n this.connections.push(connection);\n }\n }\n\n draw(g: Graphics) {\n for (const widget of this.widgets.filter(w => w.visible)) {\n widget.drawHolder(g);\n widget.draw(g);\n widget.drawDecoration(g);\n }\n for (const connection of this.connections) {\n connection.draw(g);\n }\n for (const widget of this.widgets.filter(w => w.visible)) {\n widget.drawOverlay(g);\n }\n }\n\n measureContentBounds(scaled: boolean): Bounds {\n let x1 = 0;\n let y1 = 0;\n let x2 = 0;\n let y2 = 0;\n for (const widget of this.widgets.filter(w => w.visible)) {\n const bounds = scaled ? widget.bounds : widget.unscaledBounds;\n x1 = Math.min(x1, bounds.x);\n y1 = Math.min(y1, bounds.y);\n x2 = Math.max(x2, bounds.x + bounds.width);\n y2 = Math.max(y2, bounds.y + bounds.height);\n }\n return { x: x1, y: y1, width: x2 - x1, height: y2 - y1 };\n }\n\n get autoScaleWidgets(): AutoScaleWidgets {\n return this.properties.getValue(PROP_AUTO_SCALE_WIDGETS);\n }\n}\n","import { Display } from '../../Display';\nimport { Graphics } from '../../Graphics';\nimport { IntProperty, StringProperty } from '../../properties';\nimport { XMLNode } from '../../XMLNode';\nimport { AbstractContainerWidget } from './AbstractContainerWidget';\nimport { DisplayWidget } from './DisplayWidget';\n\nlet LCID_SEQUENCE = 0;\n\nconst PROP_GROUP_NAME = 'group_name';\nconst PROP_OPI_FILE = 'opi_file';\nconst PROP_RESIZE_BEHAVIOR = 'resize_behaviour';\n\nexport class LinkingContainer extends AbstractContainerWidget {\n\n private linkedDisplay?: DisplayWidget;\n resolvedOpiFile?: string;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new StringProperty(PROP_GROUP_NAME));\n this.properties.add(new StringProperty(PROP_OPI_FILE));\n this.properties.add(new IntProperty(PROP_RESIZE_BEHAVIOR, 0));\n }\n\n parseNode(node: XMLNode) {\n super.parseNode(node);\n\n const linkingContainerId = LCID_SEQUENCE++;\n this.macros.set('LCID', `LCID_${linkingContainerId}`);\n }\n\n init() {\n if (this.opiFile) {\n this.resolvedOpiFile = this.display.resolvePath(this.opiFile);\n fetch(this.resolvedOpiFile, {\n // Send cookies too.\n // Old versions of Firefox do not do this automatically.\n credentials: 'same-origin'\n }).then(response => {\n if (response.ok) {\n response.text().then(source => {\n this.linkedDisplay = new DisplayWidget(this.display, this);\n const displayNode = XMLNode.parseFromXML(source);\n this.linkedDisplay.parseNode(displayNode);\n this.requestRepaint();\n });\n }\n });\n }\n }\n\n draw(g: Graphics) {\n if (!this.transparent) {\n g.fillRect({\n ... this.area,\n color: this.backgroundColor,\n });\n }\n\n const linkedWidget = this.getLinkedWidget();\n if (this.linkedDisplay && linkedWidget) {\n // Copy the opi background over the full container area\n g.fillRect({\n ... this.area,\n color: this.linkedDisplay.backgroundColor,\n });\n\n // This is complicated. Notes for future self:\n // -------------------------------------------\n // 1) To be compatible with Yamcs Studio, we ignore the declared\n // width/height of the linked display. Instead we measure\n // the real content bounds.\n //\n // 2) Do not use canvas scaling. It leads to bad quality when resampling\n // to the intended dimension. Instead scale all individual draw\n // operations, and make sure the offscreen canvas can eventually\n // be copied to the main canvas without needing a resampling.\n //\n // 3) Scaled drawing as described by (2) may need to be done in\n // combination with an active scale at display level (for example\n // user has zoomed in or out). Therefore, a relativeScale is calculated\n // in comparison to bounds scaled only by display zoom.\n\n\n if (this.resizeBehavior === 0) { // FIT_OPI_TO_CONTAINER\n const contentBounds = this.linkedDisplay.measureContentBounds(false /* unscaled */);\n let { width: sw, height: sh } = contentBounds;\n\n // Scale using display zoom only. This avoids including relativeScale that\n // we set later.\n // TODO maybe this does not yet support nested linking containers.\n const zoom = this.display.scale;\n sw *= zoom;\n sh *= zoom;\n\n // Calculate fit pre-draw\n const ratio = sw / sh;\n let fitw = this.width;\n let fith = fitw / ratio;\n let relativeScale = fitw / sw;\n if (fith > this.height) {\n fith = this.height;\n fitw = fith * ratio;\n relativeScale = fith / sw;\n }\n this.linkedDisplay.relativeScale = relativeScale;\n\n const offscreen = g.createChild(Math.ceil(fitw), Math.ceil(fith));\n offscreen.translate(contentBounds.x, contentBounds.y);\n this.linkedDisplay.draw(offscreen);\n g.copy(offscreen, this.x, this.y);\n } else if (this.resizeBehavior === 1) { // FIT_CONTAINER_TO_OPI\n console.warn('Unsupported resize behavior of LinkingContainer', this.resizeBehavior);\n } else if (this.resizeBehavior === 2) { // CROP OPI\n const contentBounds = this.linkedDisplay.measureContentBounds(true /* scaled */);\n const offscreen = g.createChild(contentBounds.width, contentBounds.height);\n offscreen.translate(contentBounds.x, contentBounds.y);\n\n this.linkedDisplay.draw(offscreen);\n g.copy(offscreen, this.x, this.y);\n } else if (this.resizeBehavior === 3) { // SCROLL OPI\n console.warn('Unsupported resize behavior of LinkingContainer', this.resizeBehavior);\n }\n }\n }\n\n getLinkedWidget() {\n if (this.linkedDisplay && this.groupName !== '') { // Careful, \"0\" is a valid group name.\n return this.linkedDisplay.findWidgetByName(this.groupName);\n }\n return this.linkedDisplay;\n }\n\n get widgets() { return this.linkedDisplay ? this.linkedDisplay.widgets : []; }\n get connections() { return this.linkedDisplay ? this.linkedDisplay.connections : []; }\n\n findWidget(wuid: string) {\n if (this.linkedDisplay) {\n return this.linkedDisplay.findWidget(wuid);\n }\n }\n\n get opiFile(): string { return this.properties.getValue(PROP_OPI_FILE); }\n get groupName(): string { return this.properties.getValue(PROP_GROUP_NAME); }\n get resizeBehavior(): number { return this.properties.getValue(PROP_RESIZE_BEHAVIOR); }\n}\n","import { Display } from './Display';\nimport { Widget } from './Widget';\nimport { LinkingContainer } from './widgets/others/LinkingContainer';\n\nexport interface PathResolver {\n resolve(file: string, widget?: Widget): string;\n}\n\nexport class DefaultPathResolver implements PathResolver {\n\n constructor(private display: Display) {\n }\n\n resolve(path: string, widget?: Widget) {\n if (path.startsWith('/')) {\n return `${this.display.absPrefix}${path.slice(1)}`;\n } else if (path.startsWith('http://') || path.startsWith('https://')) {\n return path;\n } else {\n if (widget) {\n let parent = widget.parent;\n while (parent) {\n if (parent instanceof LinkingContainer) {\n const opiFile = parent.resolvedOpiFile!;\n const idx = opiFile.lastIndexOf('/') + 1;\n const relPrefix = opiFile.substring(0, idx);\n return `${relPrefix}${path}`;\n }\n parent = parent.parent;\n }\n }\n return `${this.display.relPrefix}${path}`;\n }\n }\n}\n","import * as ast from './ast';\n\nexport interface DataSourceStatus {\n value: any;\n acquisitionStatus: any;\n}\n\nexport class CompiledFormula {\n // 'compiled' here really means 'parsed'.\n // The only reuse optimization is the AST.\n\n private pvValues = new Map<string, DataSourceStatus>();\n\n constructor(public pvName: string, private formula: ast.Formula) {\n }\n\n updateDataSource(pvName: string, status: DataSourceStatus) {\n this.pvValues.set(pvName, status);\n }\n\n clearState() {\n this.pvValues.clear();\n }\n\n getPVNames(): string[] {\n const expression = this.formula.expression;\n const pvNames: string[] = [];\n this.getExpressionParameters(expression, pvNames);\n return pvNames;\n }\n\n private getExpressionParameters(expression: ast.Expression, pvNames: string[]) {\n switch (expression.type) {\n case 'ParameterLiteral':\n if (pvNames.indexOf(expression.value) === -1) {\n pvNames.push(expression.value);\n }\n break;\n case 'ConditionalExpression':\n this.getExpressionParameters(expression.consequent, pvNames);\n if (expression.alternate) {\n this.getExpressionParameters(expression.alternate, pvNames);\n }\n break;\n case 'BinaryExpression':\n this.getExpressionParameters(expression.left, pvNames);\n this.getExpressionParameters(expression.right, pvNames);\n break;\n case 'LogicalExpression':\n this.getExpressionParameters(expression.left, pvNames);\n this.getExpressionParameters(expression.right, pvNames);\n break;\n case 'UnaryExpression':\n this.getExpressionParameters(expression.argument, pvNames);\n break;\n case 'CallExpression':\n for (const argument of expression.arguments) {\n this.getExpressionParameters(argument, pvNames);\n }\n break;\n }\n }\n\n execute(): any {\n const expression = this.formula.expression;\n return this.executeExpression(expression);\n }\n\n private executeExpression(expression: ast.Expression): any {\n switch (expression.type) {\n case 'BooleanLiteral':\n return expression.value;\n case 'ParameterLiteral':\n const pval = this.pvValues.get(expression.value);\n return pval ? pval.value : undefined;\n case 'ConstantLiteral':\n return expression.value;\n case 'NumericLiteral':\n return expression.value;\n case 'StringLiteral':\n return expression.value;\n case 'ConditionalExpression':\n return this.executeConditionalExpression(expression);\n case 'BinaryExpression':\n return this.executeBinaryExpression(expression);\n case 'LogicalExpression':\n return this.executeLogicalExpression(expression);\n case 'UnaryExpression':\n return this.executeUnaryExpression(expression);\n case 'CallExpression':\n return this.executeCallExpression(expression);\n default:\n throw new Error('Unexpected expression type');\n }\n }\n\n private executeBinaryExpression(expression: ast.BinaryExpression): any {\n const left = this.executeExpression(expression.left);\n const right = this.executeExpression(expression.right);\n switch (expression.operator) {\n case '+':\n return left + right;\n case '-':\n return left - right;\n case '*':\n return left * right;\n case '/':\n return left / right;\n case '^':\n return Math.pow(left, right);\n case '%':\n return left % right;\n case '==':\n return left === right;\n case '!=':\n return left !== right;\n case '<=':\n return left <= right;\n case '<':\n return left < right;\n case '>=':\n return left >= right;\n case '>':\n return left > right;\n default:\n throw new Error(`Unexpected binary operator ${expression.operator}`);\n }\n }\n\n private executeLogicalExpression(expression: ast.LogicalExpression): any {\n const left = this.executeExpression(expression.left);\n const right = this.executeExpression(expression.right);\n switch (expression.operator) {\n case '&&':\n return left && right;\n case '||':\n return left || right;\n default:\n throw new Error(`Unexpected logical operator ${expression.operator}`);\n }\n }\n\n private executeConditionalExpression(expression: ast.ConditionalExpression): any {\n const test = this.executeExpression(expression.test);\n const consequent = this.executeExpression(expression.consequent);\n if (expression.alternate === undefined) {\n return test ? consequent : null;\n } else {\n const alternate = this.executeExpression(expression.alternate);\n return test ? consequent : alternate;\n }\n }\n\n private executeUnaryExpression(expression: ast.UnaryExpression): any {\n const argument = this.executeExpression(expression.argument);\n switch (expression.operator) {\n case '-':\n return -argument;\n case '+':\n return argument;\n default:\n throw new Error(`Unexpected unary operator ${expression.operator}`);\n }\n }\n\n private executeCallExpression(expression: ast.CallExpression): any {\n const symbol = expression.callee.name;\n const args: any[] = [];\n for (const a of expression.arguments) {\n args.push(this.executeExpression(a));\n }\n switch (symbol) {\n case 'abs':\n return Math.abs(args[0]);\n case 'acos':\n return Math.acos(args[0]);\n case 'asin':\n return Math.asin(args[0]);\n case 'atan':\n return Math.atan(args[0]);\n case 'cbrt':\n return Math.cbrt(args[0]);\n case 'ceil':\n return Math.ceil(args[0]);\n case 'cos':\n return Math.cos(args[0]);\n case 'cosh':\n return Math.cosh(args[0]);\n case 'exp':\n return Math.exp(args[0]);\n case 'floor':\n return Math.floor(args[0]);\n case 'log':\n return Math.log(args[0]);\n case 'log10':\n return Math.log10(args[0]);\n case 'round':\n return Math.round(args[0]);\n case 'signum':\n return Math.sign(args[0]);\n case 'sin':\n return Math.sin(args[0]);\n case 'sinh':\n return Math.sinh(args[0]);\n case 'sqrt':\n return Math.sqrt(args[0]);\n case 'tan':\n return Math.tan(args[0]);\n case 'tanh':\n return Math.tanh(args[0]);\n case 'toDegrees':\n return args[0] * 180 / Math.PI;\n case 'toRadians':\n return args[0] / 180 * Math.PI;\n case 'parameterAcquisitionStatus':\n return this.callParameterAcquisitionStatus(args[0]);\n default:\n throw new Error(`Unsupported function '${symbol}'`);\n }\n }\n\n private callParameterAcquisitionStatus(parameter: string) {\n const status = this.pvValues.get(parameter);\n if (status) {\n return status.acquisitionStatus;\n }\n }\n}\n","// Generated by Peggy 1.2.0.\n//\n// https://peggyjs.org/\n\nfunction peg$subclass(child, parent) {\n function C() { this.constructor = child; }\n C.prototype = parent.prototype;\n child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n var self = Error.call(this, message);\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n }\n self.expected = expected;\n self.found = found;\n self.location = location;\n self.name = \"SyntaxError\";\n return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n padString = padString || \" \";\n if (str.length > targetLength) { return str; }\n targetLength -= str.length;\n padString += padString.repeat(targetLength);\n return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n var str = \"Error: \" + this.message;\n if (this.location) {\n var src = null;\n var k;\n for (k = 0; k < sources.length; k++) {\n if (sources[k].source === this.location.source) {\n src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n break;\n }\n }\n var s = this.location.start;\n var loc = this.location.source + \":\" + s.line + \":\" + s.column;\n if (src) {\n var e = this.location.end;\n var filler = peg$padEnd(\"\", s.line.toString().length);\n var line = src[s.line - 1];\n var last = s.line === e.line ? e.column : line.length + 1;\n str += \"\\n --> \" + loc + \"\\n\"\n + filler + \" |\\n\"\n + s.line + \" | \" + line + \"\\n\"\n + filler + \" | \" + peg$padEnd(\"\", s.column - 1)\n + peg$padEnd(\"\", last - s.column, \"^\");\n } else {\n str += \"\\n at \" + loc;\n }\n }\n return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n var DESCRIBE_EXPECTATION_FNS = {\n literal: function(expectation) {\n return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n },\n\n class: function(expectation) {\n var escapedParts = expectation.parts.map(function(part) {\n return Array.isArray(part)\n ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n : classEscape(part);\n });\n\n return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts + \"]\";\n },\n\n any: function() {\n return \"any character\";\n },\n\n end: function() {\n return \"end of input\";\n },\n\n other: function(expectation) {\n return expectation.description;\n }\n };\n\n function hex(ch) {\n return ch.charCodeAt(0).toString(16).toUpperCase();\n }\n\n function literalEscape(s) {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, \"\\\\\\\"\")\n .replace(/\\0/g, \"\\\\0\")\n .replace(/\\t/g, \"\\\\t\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/[\\x00-\\x0F]/g, function(ch) { return \"\\\\x0\" + hex(ch); })\n .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\" + hex(ch); });\n }\n\n function classEscape(s) {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\]/g, \"\\\\]\")\n .replace(/\\^/g, \"\\\\^\")\n .replace(/-/g, \"\\\\-\")\n .replace(/\\0/g, \"\\\\0\")\n .replace(/\\t/g, \"\\\\t\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/[\\x00-\\x0F]/g, function(ch) { return \"\\\\x0\" + hex(ch); })\n .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\" + hex(ch); });\n }\n\n function describeExpectation(expectation) {\n return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n }\n\n function describeExpected(expected) {\n var descriptions = expected.map(describeExpectation);\n var i, j;\n\n descriptions.sort();\n\n if (descriptions.length > 0) {\n for (i = 1, j = 1; i < descriptions.length; i++) {\n if (descriptions[i - 1] !== descriptions[i]) {\n descriptions[j] = descriptions[i];\n j++;\n }\n }\n descriptions.length = j;\n }\n\n switch (descriptions.length) {\n case 1:\n return descriptions[0];\n\n case 2:\n return descriptions[0] + \" or \" + descriptions[1];\n\n default:\n return descriptions.slice(0, -1).join(\", \")\n + \", or \"\n + descriptions[descriptions.length - 1];\n }\n }\n\n function describeFound(found) {\n return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n }\n\n return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n options = options !== undefined ? options : {};\n\n var peg$FAILED = {};\n var peg$source = options.grammarSource;\n\n var peg$startRuleFunctions = { Start: peg$parseStart };\n var peg$startRuleFunction = peg$parseStart;\n\n var peg$c0 = \"=\";\n var peg$c1 = \" \";\n var peg$c2 = \"\\t\";\n var peg$c3 = \"false\";\n var peg$c4 = \"true\";\n var peg$c5 = \"pi\";\n var peg$c6 = \"e\";\n var peg$c7 = \"_\";\n var peg$c8 = \".\";\n var peg$c9 = \"0\";\n var peg$c10 = \"\\\"\";\n var peg$c11 = \"'\";\n var peg$c12 = \"(\";\n var peg$c13 = \")\";\n var peg$c14 = \"-\";\n var peg$c15 = \"+\";\n var peg$c16 = \",\";\n var peg$c17 = \"*\";\n var peg$c18 = \"/\";\n var peg$c19 = \"^\";\n var peg$c20 = \"%\";\n var peg$c21 = \"<=\";\n var peg$c22 = \">=\";\n var peg$c23 = \"<\";\n var peg$c24 = \">\";\n var peg$c25 = \"==\";\n var peg$c26 = \"!=\";\n var peg$c27 = \"&&\";\n var peg$c28 = \"||\";\n\n var peg$r0 = /^[a-zA-Z]/;\n var peg$r1 = /^[a-zA-Z0-9_]/;\n var peg$r2 = /^[0-9]/;\n var peg$r3 = /^[1-9]/;\n var peg$r4 = /^[^\\n\\r\\f\"]/;\n var peg$r5 = /^[^\\n\\r\\f']/;\n\n var peg$e0 = peg$literalExpectation(\"=\", false);\n var peg$e1 = peg$literalExpectation(\" \", false);\n var peg$e2 = peg$literalExpectation(\"\\t\", false);\n var peg$e3 = peg$literalExpectation(\"false\", true);\n var peg$e4 = peg$literalExpectation(\"true\", true);\n var peg$e5 = peg$literalExpectation(\"PI\", true);\n var peg$e6 = peg$literalExpectation(\"E\", true);\n var peg$e7 = peg$otherExpectation(\"identifier\");\n var peg$e8 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"]], false, false);\n var peg$e9 = peg$literalExpectation(\"_\", false);\n var peg$e10 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\"], false, false);\n var peg$e11 = peg$otherExpectation(\"boolean\");\n var peg$e12 = peg$otherExpectation(\"constant\");\n var peg$e13 = peg$otherExpectation(\"number\");\n var peg$e14 = peg$literalExpectation(\".\", false);\n var peg$e15 = peg$literalExpectation(\"0\", false);\n var peg$e16 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n var peg$e17 = peg$classExpectation([[\"1\", \"9\"]], false, false);\n var peg$e18 = peg$otherExpectation(\"string\");\n var peg$e19 = peg$literalExpectation(\"\\\"\", false);\n var peg$e20 = peg$classExpectation([\"\\n\", \"\\r\", \"\\f\", \"\\\"\"], true, false);\n var peg$e21 = peg$otherExpectation(\"parameter\");\n var peg$e22 = peg$literalExpectation(\"'\", false);\n var peg$e23 = peg$classExpectation([\"\\n\", \"\\r\", \"\\f\", \"'\"], true, false);\n var peg$e24 = peg$literalExpectation(\"(\", false);\n var peg$e25 = peg$literalExpectation(\")\", false);\n var peg$e26 = peg$literalExpectation(\"-\", false);\n var peg$e27 = peg$literalExpectation(\"+\", false);\n var peg$e28 = peg$literalExpectation(\",\", false);\n var peg$e29 = peg$literalExpectation(\"*\", false);\n var peg$e30 = peg$literalExpectation(\"/\", false);\n var peg$e31 = peg$literalExpectation(\"^\", false);\n var peg$e32 = peg$literalExpectation(\"%\", false);\n var peg$e33 = peg$literalExpectation(\"<=\", false);\n var peg$e34 = peg$literalExpectation(\">=\", false);\n var peg$e35 = peg$literalExpectation(\"<\", false);\n var peg$e36 = peg$literalExpectation(\">\", false);\n var peg$e37 = peg$literalExpectation(\"==\", false);\n var peg$e38 = peg$literalExpectation(\"!=\", false);\n var peg$e39 = peg$literalExpectation(\"&&\", false);\n var peg$e40 = peg$literalExpectation(\"||\", false);\n\n var peg$f0 = function(formula) { return formula; };\n var peg$f1 = function(expression) {\n return {\n type: 'Formula',\n expression: expression\n };\n };\n var peg$f2 = function(symbol) {\n return symbol;\n };\n var peg$f3 = function(head, tail) {\n return {\n type: 'Symbol',\n name: head + tail.join('')\n };\n };\n var peg$f4 = function() { return { type: 'BooleanLiteral', value: true }; };\n var peg$f5 = function() { return { type: 'BooleanLiteral', value: false }; };\n var peg$f6 = function() { return { type: 'ConstantLiteral', value: Math.PI }; };\n var peg$f7 = function() { return { type: 'ConstantLiteral', value: Math.E }; };\n var peg$f8 = function() {\n return { type: 'NumericLiteral', value: parseFloat(text()) };\n };\n var peg$f9 = function(chars) {\n return { type: 'StringLiteral', value: chars.join('') };\n };\n var peg$f10 = function(chars) {\n return { type: 'ParameterLiteral', value: chars.join('') };\n };\n var peg$f11 = function(expression) { return expression; };\n var peg$f12 = function(operator, argument) {\n return {\n type: 'UnaryExpression',\n operator: operator,\n argument: argument,\n };\n };\n var peg$f13 = function(callee, args) {\n return {\n type: 'CallExpression',\n callee: callee,\n arguments: args\n };\n };\n var peg$f14 = function(args) {\n return optionalList(extractOptional(args, 0));\n };\n var peg$f15 = function(head, tail) {\n return buildList(head, tail, 3);\n };\n var peg$f16 = function(head, tail) {\n return buildBinaryExpression(head, tail);\n };\n var peg$f17 = function(head, tail) {\n return buildLogicalExpression(head, tail);\n };\n\n var peg$currPos = 0;\n var peg$savedPos = 0;\n var peg$posDetailsCache = [{ line: 1, column: 1 }];\n var peg$maxFailPos = 0;\n var peg$maxFailExpected = [];\n var peg$silentFails = 0;\n\n var peg$result;\n\n if (\"startRule\" in options) {\n if (!(options.startRule in peg$startRuleFunctions)) {\n throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n }\n\n peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n }\n\n function text() {\n return input.substring(peg$savedPos, peg$currPos);\n }\n\n function offset() {\n return peg$savedPos;\n }\n\n function range() {\n return {\n source: peg$source,\n start: peg$savedPos,\n end: peg$currPos\n };\n }\n\n function location() {\n return peg$computeLocation(peg$savedPos, peg$currPos);\n }\n\n function expected(description, location) {\n location = location !== undefined\n ? location\n : peg$computeLocation(peg$savedPos, peg$currPos);\n\n throw peg$buildStructuredError(\n [peg$otherExpectation(description)],\n input.substring(peg$savedPos, peg$currPos),\n location\n );\n }\n\n function error(message, location) {\n location = location !== undefined\n ? location\n : peg$computeLocation(peg$savedPos, peg$currPos);\n\n throw peg$buildSimpleError(message, location);\n }\n\n function peg$literalExpectation(text, ignoreCase) {\n return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n }\n\n function peg$classExpectation(parts, inverted, ignoreCase) {\n return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n }\n\n function peg$anyExpectation() {\n return { type: \"any\" };\n }\n\n function peg$endExpectation() {\n return { type: \"end\" };\n }\n\n function peg$otherExpectation(description) {\n return { type: \"other\", description: description };\n }\n\n function peg$computePosDetails(pos) {\n var details = peg$posDetailsCache[pos];\n var p;\n\n if (details) {\n return details;\n } else {\n p = pos - 1;\n while (!peg$posDetailsCache[p]) {\n p--;\n }\n\n details = peg$posDetailsCache[p];\n details = {\n line: details.line,\n column: details.column\n };\n\n while (p < pos) {\n if (input.charCodeAt(p) === 10) {\n details.line++;\n details.column = 1;\n } else {\n details.column++;\n }\n\n p++;\n }\n\n peg$posDetailsCache[pos] = details;\n\n return details;\n }\n }\n\n function peg$computeLocation(startPos, endPos) {\n var startPosDetails = peg$computePosDetails(startPos);\n var endPosDetails = peg$computePosDetails(endPos);\n\n return {\n source: peg$source,\n start: {\n offset: startPos,\n line: startPosDetails.line,\n column: startPosDetails.column\n },\n end: {\n offset: endPos,\n line: endPosDetails.line,\n column: endPosDetails.column\n }\n };\n }\n\n function peg$fail(expected) {\n if (peg$currPos < peg$maxFailPos) { return; }\n\n if (peg$currPos > peg$maxFailPos) {\n peg$maxFailPos = peg$currPos;\n peg$maxFailExpected = [];\n }\n\n peg$maxFailExpected.push(expected);\n }\n\n function peg$buildSimpleError(message, location) {\n return new peg$SyntaxError(message, null, null, location);\n }\n\n function peg$buildStructuredError(expected, found, location) {\n return new peg$SyntaxError(\n peg$SyntaxError.buildMessage(expected, found),\n expected,\n found,\n location\n );\n }\n\n function peg$parseStart() {\n var s0, s1, s2, s3, s4;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 61) {\n s1 = peg$c0;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e0); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n s3 = peg$parseFormula();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n peg$savedPos = s0;\n s0 = peg$f0(s3);\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseFormula() {\n var s0, s1;\n\n s0 = peg$currPos;\n s1 = peg$parseLogicalExpression();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$f1(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parse_() {\n var s0, s1;\n\n s0 = [];\n s1 = peg$parseWhiteSpace();\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n s1 = peg$parseWhiteSpace();\n }\n\n return s0;\n }\n\n function peg$parseWhiteSpace() {\n var s0;\n\n if (input.charCodeAt(peg$currPos) === 32) {\n s0 = peg$c1;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e1); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 9) {\n s0 = peg$c2;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e2); }\n }\n }\n\n return s0;\n }\n\n function peg$parseFALSE() {\n var s0;\n\n if (input.substr(peg$currPos, 5).toLowerCase() === peg$c3) {\n s0 = input.substr(peg$currPos, 5);\n peg$currPos += 5;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e3); }\n }\n\n return s0;\n }\n\n function peg$parseTRUE() {\n var s0;\n\n if (input.substr(peg$currPos, 4).toLowerCase() === peg$c4) {\n s0 = input.substr(peg$currPos, 4);\n peg$currPos += 4;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e4); }\n }\n\n return s0;\n }\n\n function peg$parsePI() {\n var s0;\n\n if (input.substr(peg$currPos, 2).toLowerCase() === peg$c5) {\n s0 = input.substr(peg$currPos, 2);\n peg$currPos += 2;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e5); }\n }\n\n return s0;\n }\n\n function peg$parseE() {\n var s0;\n\n if (input.substr(peg$currPos, 1).toLowerCase() === peg$c6) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e6); }\n }\n\n return s0;\n }\n\n function peg$parseIdentifier() {\n var s0, s1;\n\n s0 = peg$currPos;\n s1 = peg$parseIdentifierSymbol();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$f2(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parseIdentifierSymbol() {\n var s0, s1, s2, s3;\n\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = peg$parseIdentifierStart();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$parseIdentifierPart();\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parseIdentifierPart();\n }\n peg$savedPos = s0;\n s0 = peg$f3(s1, s2);\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e7); }\n }\n\n return s0;\n }\n\n function peg$parseIdentifierStart() {\n var s0;\n\n if (peg$r0.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e8); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 95) {\n s0 = peg$c7;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e9); }\n }\n }\n\n return s0;\n }\n\n function peg$parseIdentifierPart() {\n var s0;\n\n if (peg$r1.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e10); }\n }\n\n return s0;\n }\n\n function peg$parseLiteral() {\n var s0;\n\n s0 = peg$parseBooleanLiteral();\n if (s0 === peg$FAILED) {\n s0 = peg$parseConstantLiteral();\n if (s0 === peg$FAILED) {\n s0 = peg$parseNumericLiteral();\n if (s0 === peg$FAILED) {\n s0 = peg$parseStringLiteral();\n if (s0 === peg$FAILED) {\n s0 = peg$parseParameterLiteral();\n }\n }\n }\n }\n\n return s0;\n }\n\n function peg$parseBooleanLiteral() {\n var s0, s1;\n\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = peg$parseTRUE();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$f4();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parseFALSE();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$f5();\n }\n s0 = s1;\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e11); }\n }\n\n return s0;\n }\n\n function peg$parseConstantLiteral() {\n var s0, s1;\n\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = peg$parsePI();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$f6();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parseE();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$f7();\n }\n s0 = s1;\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e12); }\n }\n\n return s0;\n }\n\n function peg$parseNumericLiteral() {\n var s0, s1, s2, s3, s4;\n\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = peg$parseDecimalIntegerLiteral();\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 46) {\n s2 = peg$c8;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e14); }\n }\n if (s2 !== peg$FAILED) {\n s3 = [];\n s4 = peg$parseDecimalDigit();\n while (s4 !== peg$FAILED) {\n s3.push(s4);\n s4 = peg$parseDecimalDigit();\n }\n peg$savedPos = s0;\n s0 = peg$f8();\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 46) {\n s1 = peg$c8;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e14); }\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$parseDecimalDigit();\n if (s3 !== peg$FAILED) {\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parseDecimalDigit();\n }\n } else {\n s2 = peg$FAILED;\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s0 = peg$f8();\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parseDecimalIntegerLiteral();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$f8();\n }\n s0 = s1;\n }\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e13); }\n }\n\n return s0;\n }\n\n function peg$parseDecimalIntegerLiteral() {\n var s0, s1, s2, s3;\n\n if (input.charCodeAt(peg$currPos) === 48) {\n s0 = peg$c9;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e15); }\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parseNonZeroDigit();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$parseDecimalDigit();\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parseDecimalDigit();\n }\n s1 = [s1, s2];\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n\n return s0;\n }\n\n function peg$parseDecimalDigit() {\n var s0;\n\n if (peg$r2.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e16); }\n }\n\n return s0;\n }\n\n function peg$parseNonZeroDigit() {\n var s0;\n\n if (peg$r3.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e17); }\n }\n\n return s0;\n }\n\n function peg$parseStringLiteral() {\n var s0, s1, s2, s3;\n\n peg$silentFails++;\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 34) {\n s1 = peg$c10;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e19); }\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n if (peg$r4.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e20); }\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n if (peg$r4.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e20); }\n }\n }\n if (input.charCodeAt(peg$currPos) === 34) {\n s3 = peg$c10;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e19); }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s0 = peg$f9(s2);\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e18); }\n }\n\n return s0;\n }\n\n function peg$parseParameterLiteral() {\n var s0, s1, s2, s3;\n\n peg$silentFails++;\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 39) {\n s1 = peg$c11;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e22); }\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n if (peg$r5.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e23); }\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n if (peg$r5.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e23); }\n }\n }\n if (input.charCodeAt(peg$currPos) === 39) {\n s3 = peg$c11;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e22); }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s0 = peg$f10(s2);\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e21); }\n }\n\n return s0;\n }\n\n function peg$parsePrimaryExpression() {\n var s0, s1, s2, s3, s4, s5;\n\n s0 = peg$parseLiteral();\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 40) {\n s1 = peg$c12;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e24); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n s3 = peg$parseLogicalExpression();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (input.charCodeAt(peg$currPos) === 41) {\n s5 = peg$c13;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e25); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s0 = peg$f11(s3);\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n\n return s0;\n }\n\n function peg$parseUnaryExpression() {\n var s0, s1, s2, s3, s4;\n\n s0 = peg$parsePrimaryExpression();\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parseUnaryOperator();\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n s3 = peg$parseUnaryExpression();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n peg$savedPos = s0;\n s0 = peg$f12(s1, s3);\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n\n return s0;\n }\n\n function peg$parseUnaryOperator() {\n var s0;\n\n if (input.charCodeAt(peg$currPos) === 45) {\n s0 = peg$c14;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e26); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 43) {\n s0 = peg$c15;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e27); }\n }\n }\n\n return s0;\n }\n\n function peg$parseCallExpression() {\n var s0, s1, s2, s3;\n\n s0 = peg$currPos;\n s1 = peg$parseIdentifier();\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n s3 = peg$parseArguments();\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s0 = peg$f13(s1, s3);\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$parseUnaryExpression();\n }\n\n return s0;\n }\n\n function peg$parseArguments() {\n var s0, s1, s2, s3, s4, s5;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 40) {\n s1 = peg$c12;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e24); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n s3 = peg$currPos;\n s4 = peg$parseArgumentList();\n if (s4 !== peg$FAILED) {\n s5 = peg$parse_();\n s4 = [s4, s5];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n if (s3 === peg$FAILED) {\n s3 = null;\n }\n if (input.charCodeAt(peg$currPos) === 41) {\n s4 = peg$c13;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e25); }\n }\n if (s4 !== peg$FAILED) {\n peg$savedPos = s0;\n s0 = peg$f14(s3);\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseArgumentList() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n\n s0 = peg$currPos;\n s1 = peg$parseLogicalExpression();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c16;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e28); }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n s7 = peg$parseLogicalExpression();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c16;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e28); }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n s7 = peg$parseLogicalExpression();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n peg$savedPos = s0;\n s0 = peg$f15(s1, s2);\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseMultiplicativeExpression() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n\n s0 = peg$currPos;\n s1 = peg$parseCallExpression();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (input.charCodeAt(peg$currPos) === 42) {\n s5 = peg$c17;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e29); }\n }\n if (s5 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 47) {\n s5 = peg$c18;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e30); }\n }\n if (s5 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 94) {\n s5 = peg$c19;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e31); }\n }\n if (s5 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 37) {\n s5 = peg$c20;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e32); }\n }\n }\n }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n s7 = peg$parseCallExpression();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (input.charCodeAt(peg$currPos) === 42) {\n s5 = peg$c17;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e29); }\n }\n if (s5 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 47) {\n s5 = peg$c18;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e30); }\n }\n if (s5 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 94) {\n s5 = peg$c19;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e31); }\n }\n if (s5 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 37) {\n s5 = peg$c20;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e32); }\n }\n }\n }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n s7 = peg$parseCallExpression();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n peg$savedPos = s0;\n s0 = peg$f16(s1, s2);\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseAdditiveExpression() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n\n s0 = peg$currPos;\n s1 = peg$parseMultiplicativeExpression();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (input.charCodeAt(peg$currPos) === 43) {\n s5 = peg$c15;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e27); }\n }\n if (s5 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 45) {\n s5 = peg$c14;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e26); }\n }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n s7 = peg$parseMultiplicativeExpression();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (input.charCodeAt(peg$currPos) === 43) {\n s5 = peg$c15;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e27); }\n }\n if (s5 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 45) {\n s5 = peg$c14;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e26); }\n }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n s7 = peg$parseMultiplicativeExpression();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n peg$savedPos = s0;\n s0 = peg$f16(s1, s2);\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseRelationalExpression() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n\n s0 = peg$currPos;\n s1 = peg$parseAdditiveExpression();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (input.substr(peg$currPos, 2) === peg$c21) {\n s5 = peg$c21;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e33); }\n }\n if (s5 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c22) {\n s5 = peg$c22;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e34); }\n }\n if (s5 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 60) {\n s5 = peg$c23;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e35); }\n }\n if (s5 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 62) {\n s5 = peg$c24;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e36); }\n }\n }\n }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n s7 = peg$parseAdditiveExpression();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (input.substr(peg$currPos, 2) === peg$c21) {\n s5 = peg$c21;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e33); }\n }\n if (s5 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c22) {\n s5 = peg$c22;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e34); }\n }\n if (s5 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 60) {\n s5 = peg$c23;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e35); }\n }\n if (s5 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 62) {\n s5 = peg$c24;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e36); }\n }\n }\n }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n s7 = peg$parseAdditiveExpression();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n peg$savedPos = s0;\n s0 = peg$f16(s1, s2);\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseEqualityExpression() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n\n s0 = peg$currPos;\n s1 = peg$parseRelationalExpression();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (input.substr(peg$currPos, 2) === peg$c25) {\n s5 = peg$c25;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e37); }\n }\n if (s5 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c26) {\n s5 = peg$c26;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e38); }\n }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n s7 = peg$parseRelationalExpression();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (input.substr(peg$currPos, 2) === peg$c25) {\n s5 = peg$c25;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e37); }\n }\n if (s5 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c26) {\n s5 = peg$c26;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e38); }\n }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n s7 = peg$parseRelationalExpression();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n peg$savedPos = s0;\n s0 = peg$f16(s1, s2);\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseLogicalExpression() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n\n s0 = peg$currPos;\n s1 = peg$parseEqualityExpression();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (input.substr(peg$currPos, 2) === peg$c27) {\n s5 = peg$c27;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e39); }\n }\n if (s5 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c28) {\n s5 = peg$c28;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e40); }\n }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n s7 = peg$parseEqualityExpression();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (input.substr(peg$currPos, 2) === peg$c27) {\n s5 = peg$c27;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e39); }\n }\n if (s5 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c28) {\n s5 = peg$c28;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$e40); }\n }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n s7 = peg$parseEqualityExpression();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n peg$savedPos = s0;\n s0 = peg$f17(s1, s2);\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n\n function extractList(list, index) {\n return list.map(function(element) { return element[index]; });\n }\n\n function extractOptional(optional, index) {\n return optional ? optional[index] : null;\n }\n\n function buildList(head, tail, index) {\n return [head].concat(extractList(tail, index));\n }\n\n function buildBinaryExpression(head, tail) {\n return tail.reduce(function(result, element) {\n return {\n type: 'BinaryExpression',\n operator: element[1],\n left: result,\n right: element[3]\n };\n }, head);\n }\n\n function buildLogicalExpression(head, tail) {\n return tail.reduce(function(result, element) {\n return {\n type: 'LogicalExpression',\n operator: element[1],\n left: result,\n right: element[3]\n };\n }, head);\n }\n\n function optionalList(value) {\n return value !== null ? value : [];\n }\n\n\n peg$result = peg$startRuleFunction();\n\n if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n return peg$result;\n } else {\n if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n peg$fail(peg$endExpectation());\n }\n\n throw peg$buildStructuredError(\n peg$maxFailExpected,\n peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n peg$maxFailPos < input.length\n ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n );\n }\n}\n\nexport {\n peg$SyntaxError as SyntaxError,\n peg$parse as parse\n};\n","import * as ast from './ast';\nimport { CompiledFormula } from './CompiledFormula';\nimport { parse } from './parser';\n\nexport class FormulaCompiler {\n\n compile(formulaString: string) {\n const formula = parse(formulaString, {}) as ast.Formula;\n // console.log(JSON.stringify(formula, null, 2));\n return new CompiledFormula(formulaString, formula);\n }\n\n execute(formulaString: string) {\n const compiledFormula = this.compile(formulaString);\n return compiledFormula.execute();\n }\n}\n","import { CompiledFormula } from './formulas/CompiledFormula';\nimport { FormulaCompiler } from './formulas/FormulaCompiler';\nimport { PV } from './PV';\nimport { PVProvider } from './PVProvider';\n\nexport class FormulaPVProvider implements PVProvider {\n\n private pvs = new Map<string, FormulaPV>();\n\n canProvide(pvName: string) {\n return pvName.startsWith('=');\n }\n\n startProviding(pvs: PV[]) {\n for (const pv of pvs) {\n this.pvs.set(pv.name, new FormulaPV(pv));\n }\n }\n\n stopProviding(pvs: PV[]) {\n for (const pv of pvs) {\n this.pvs.delete(pv.name);\n }\n }\n\n isNavigable() {\n return false;\n }\n\n shutdown() {\n }\n}\n\nclass FormulaPV {\n\n compiledFormula: CompiledFormula;\n\n constructor(readonly pv: PV) {\n const compiler = new FormulaCompiler();\n this.compiledFormula = compiler.compile(pv.name);\n for (const pvName of this.compiledFormula.getPVNames()) {\n const pvDependency = pv.pvEngine.createPV(pvName);\n this.compiledFormula.updateDataSource(pvDependency.name, {\n value: pvDependency.value,\n acquisitionStatus: 'good', // TODO ?\n });\n pv.pvEngine.addListener(pvName, () => {\n this.compiledFormula.updateDataSource(pvName, {\n value: pv.pvEngine.getValue(pvName),\n acquisitionStatus: 'good', // TODO ?\n });\n this.trigger();\n });\n }\n this.trigger();\n }\n\n trigger() {\n const result = this.compiledFormula.execute();\n this.pv.pvEngine.setValue(new Date(), this.pv.name, result);\n }\n}\n","import { PV } from './PV';\nimport { PVEngine } from './PVEngine';\n\nexport class LocalPV extends PV {\n\n constructor(name: string, pvEngine: PVEngine, readonly initializer?: any) {\n super(name, pvEngine);\n this.writable = true;\n }\n}\n","import { Display } from '../Display';\nimport { Property } from '../properties';\nimport { Rule } from '../rules';\nimport { ScriptEngine } from '../scripting/ScriptEngine';\nimport { Script } from '../scripts';\nimport { Widget } from '../Widget';\nimport { LocalPV } from './LocalPV';\nimport { AlarmSeverity, PV, PVListener } from './PV';\nimport { PVProvider } from './PVProvider';\nimport { Sample } from './Sample';\n\nconst PV_PATTERN = /(loc\\:\\/\\/[^\\(]+)(\\((.*)\\))?/;\n\nfunction stripInitializer(pvName: string) {\n if (!pvName.startsWith('loc://')) {\n return pvName;\n }\n const match = pvName.match(PV_PATTERN);\n return match ? match[1] : pvName;\n}\n\nexport class PVEngine {\n\n private rules: RuleInstance[] = [];\n private scripts: ScriptInstance[] = [];\n private pvs = new Map<string, PV>();\n\n private providers: PVProvider[] = [];\n readonly scriptLibraries: { [key: string]: any; } = {};\n\n private listeners = new Map<string, PVListener[]>();\n\n constructor(private display: Display) {\n }\n\n /**\n * To be called following display parse.\n * It triggers an update on all listeners whose PV already has\n * a value (for example because of loc initializer or formula).\n *\n * It is important to do this after the full display is parsed,\n * because some scripts may require the presence of certain\n * widgets.\n */\n init() {\n for (const entry of this.listeners.entries()) {\n const pv = this.pvs.get(entry[0]);\n if (pv && pv.value !== null && pv.value !== undefined) {\n for (const listener of entry[1]) {\n listener();\n }\n }\n }\n }\n\n clearState() {\n this.disconnectAll();\n this.rules = [];\n this.scripts = [];\n this.listeners.clear();\n }\n\n getPVNames() {\n return [... this.pvs.keys()];\n }\n\n hasPV(pvName: string) {\n const stripped = stripInitializer(pvName);\n return this.pvs.has(stripped);\n }\n\n getPV(pvName: string) {\n const stripped = stripInitializer(pvName);\n return this.pvs.get(stripped);\n }\n\n disconnectAll() {\n for (const provider of this.providers) {\n const toBeStopped = [];\n for (const pv of this.pvs.values()) {\n if (provider.canProvide(pv.name)) {\n toBeStopped.push(pv);\n }\n }\n if (toBeStopped.length) {\n provider.stopProviding(toBeStopped);\n }\n }\n this.pvs.clear();\n }\n\n createPV(pvName: string) {\n if (pvName.startsWith('loc://')) {\n return this.createLocalPV(pvName);\n }\n\n let pv = this.pvs.get(pvName);\n if (pv) {\n return pv;\n }\n\n pv = new PV(pvName, this);\n this.pvs.set(pvName, pv);\n\n for (const provider of this.providers) {\n if (provider.canProvide(pvName)) {\n pv.navigable = provider.isNavigable();\n provider.startProviding([pv]);\n return pv;\n }\n }\n\n console.warn(`No provider for PV ${pvName}`);\n pv.disconnected = true;\n return pv;\n }\n\n requestRepaint() {\n this.display.requestRepaint();\n }\n\n private createLocalPV(pvName: string) {\n const match = pvName.match(PV_PATTERN);\n let initializer: any;\n if (match) {\n pvName = match[1];\n if (match[3] !== undefined) {\n const spec = match[3];\n if (spec.startsWith('\"') && spec.endsWith('\"')) {\n initializer = spec.substring(1, spec.length - 1);\n } else if (spec.indexOf(',') !== -1) {\n initializer = spec.split(',').map(part => Number(part.trim()));\n } else {\n initializer = Number(spec);\n }\n }\n }\n\n let pv = this.pvs.get(pvName);\n let mayInitialize = false;\n if (pv) {\n const localPV = pv as LocalPV;\n if (localPV.initializer !== undefined\n && initializer !== undefined\n && !this.initializerEquals(localPV.initializer, initializer)) {\n console.warn(`PV ${pvName} is defined with different ` +\n `initializers: ${localPV.initializer} !== ${initializer}`);\n } else if (localPV.initializer === undefined && initializer !== undefined) {\n mayInitialize = true;\n }\n }\n if (!pv) {\n pv = new LocalPV(pvName, this, initializer);\n this.pvs.set(pvName, pv);\n mayInitialize = true;\n }\n\n if (mayInitialize && initializer !== undefined) {\n this.setValue(new Date(), pvName, initializer);\n }\n return pv;\n }\n\n private initializerEquals(a: any, b: any) {\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n } else {\n return a === b;\n }\n }\n\n getValue(pvName: string) {\n const stripped = stripInitializer(pvName);\n const pv = this.pvs.get(stripped);\n if (pv) {\n return pv.value;\n }\n }\n\n setValue(time: Date, pvName: string, value: any, severity = AlarmSeverity.NONE) {\n const stripped = stripInitializer(pvName);\n const pv = this.pvs.get(stripped);\n if (pv) {\n pv.setSample({ time, value, severity });\n for (const listener of this.listeners.get(pvName) || []) {\n listener();\n }\n } else {\n throw new Error(`Cannot set value of unknown PV ${pvName}`);\n }\n }\n\n setValues(samples: Map<string, Sample>) {\n // Bundle triggers so that if a listener is listening to\n // multiple received PVs, it only triggers once (i.e. scripts).\n const triggeredListeners: PVListener[] = [];\n\n for (const pvName of samples.keys()) {\n const pv = this.pvs.get(pvName);\n if (pv) {\n pv.setSample(samples.get(pvName)!);\n for (const listener of this.listeners.get(pvName) || []) {\n triggeredListeners.push(listener);\n }\n } else {\n console.warn(`Received an update for unknown pv ${pvName}`);\n }\n }\n\n for (const listener of triggeredListeners) {\n listener();\n }\n }\n\n createScript(widget: Widget, model: Script, scriptText: string) {\n const pvs: PV[] = [];\n for (const input of model.inputs) {\n const pvName = widget.expandMacro(input.pvName);\n pvs.push(this.createPV(pvName));\n }\n const script = new ScriptInstance(widget, model, scriptText, pvs);\n this.scripts.push(script);\n\n for (let i = 0; i < model.inputs.length; i++) {\n const input = model.inputs[i];\n const triggerPV = pvs[i];\n if (input.trigger) {\n const pvName = widget.expandMacro(input.pvName);\n this.addListener(pvName, () => {\n if (model.checkConnect) {\n for (let j = 0; j < model.inputs.length; j++) {\n const pv = pvs[j];\n const isTrigger = model.inputs[j].trigger;\n const hasValue = pv.value !== null && pv.value !== undefined;\n if (pv.disconnected || (isTrigger && !hasValue)) {\n return;\n }\n }\n }\n script.scriptEngine.run(triggerPV);\n }, false);\n }\n }\n }\n\n createRule(widget: Widget, model: Rule) {\n const pvs = [];\n for (const input of model.inputs) {\n const pvName = widget.expandMacro(input.pvName);\n pvs.push(this.createPV(pvName));\n }\n const rule = new RuleInstance(widget, model, pvs);\n this.rules.push(rule);\n\n const listener = () => rule.scriptEngine.run();\n\n for (const input of model.inputs) {\n if (input.trigger) {\n const pvName = widget.expandMacro(input.pvName);\n this.addListener(pvName, listener, false);\n }\n }\n }\n\n addProvider(provider: PVProvider) {\n this.providers.push(provider);\n }\n\n addScriptLibrary(name: string, library: any) {\n this.scriptLibraries[name] = library;\n }\n\n addListener(pvName: string, listener: PVListener, mayTriggerNow = true) {\n const stripped = stripInitializer(pvName);\n const listeners = this.listeners.get(stripped);\n if (listeners) {\n listeners.push(listener);\n } else {\n this.listeners.set(stripped, [listener]);\n }\n\n // We don't want this always. For example during initial setup\n // this should not trigger, because some scripts may rely on all\n // widgets being initialized already.\n if (mayTriggerNow) {\n const pv = this.pvs.get(stripped);\n if (pv && pv.value !== null && pv.value !== undefined) {\n listener();\n }\n }\n }\n\n removeListener(pvName: string, listener: PVListener) {\n const stripped = stripInitializer(pvName);\n const listeners = this.listeners.get(stripped);\n if (listeners) {\n const idx = listeners.indexOf(listener);\n if (idx !== -1) {\n listeners.splice(idx, 1);\n }\n }\n }\n}\n\nclass ScriptInstance {\n\n scriptEngine: ScriptEngine;\n\n constructor(readonly widget: Widget, readonly script: Script, readonly text: string, pvs: PV[]) {\n this.scriptEngine = new ScriptEngine(widget, text, pvs);\n }\n}\n\nclass RuleInstance {\n\n scriptEngine: ScriptEngine;\n\n constructor(readonly widget: Widget, readonly rule: Rule, pvs: PV[]) {\n let scriptText = '';\n const property = widget.properties.getProperty(rule.propertyName);\n if (!property) {\n throw new Error(`Cannot create rule for unsupported property ${rule.propertyName}`);\n }\n if (rule.expressions.length) {\n let usesDoubles = false;\n let usesInts = false;\n let usesStrings = false;\n let usesSeverities = false;\n for (const expr of rule.expressions) {\n if (expr.expression.match(/pv[0-9]+/)) {\n usesDoubles = true;\n }\n if (rule.outputExpression && expr.outputValue.toString().match(/pv[0-9]+/)) {\n usesDoubles = true;\n }\n if (expr.expression.indexOf('pvInt') !== -1) {\n usesInts = true;\n }\n if (rule.outputExpression && expr.outputValue.toString().indexOf('pvInt') !== -1) {\n usesInts = true;\n }\n if (expr.expression.indexOf('pvStr') !== -1) {\n usesStrings = true;\n }\n if (rule.outputExpression && expr.outputValue.toString().indexOf('pvStr') !== -1) {\n usesStrings = true;\n }\n if (expr.expression.indexOf('pvSev') !== -1) {\n usesSeverities = true;\n }\n if (rule.outputExpression && expr.outputValue.toString().indexOf('pvSev') !== -1) {\n usesSeverities = true;\n }\n }\n // This does not seem to make much sense, but it is ported as-is\n // from the desktop application.\n for (let i = 0; i < pvs.length; i++) {\n if (usesDoubles) {\n scriptText += `var pv${i} = PVUtil.getDouble(pvs[${i}]);\\n`;\n }\n if (usesInts) {\n scriptText += `var pvInt${i} = PVUtil.getLong(pvs[${i}]);\\n`;\n }\n if (usesStrings) {\n scriptText += `var pvStr${i} = PVUtil.getString(pvs[${i}]);\\n`;\n }\n if (usesSeverities) {\n scriptText += `var pvSev${i} = PVUtil.getSeverity(pvs[${i}]);\\n`;\n }\n }\n for (let i = 0; i < rule.expressions.length; i++) {\n const expr = rule.expressions[i].expression;\n const outputValue = rule.expressions[i].outputValue;\n if (i > 0) {\n scriptText += 'else ';\n }\n scriptText += `if (${expr}) widget.setPropertyValue(\"${rule.propertyName}\", `;\n if (rule.outputExpression) {\n scriptText += `${outputValue});\\n`;\n } else {\n const outputValueStr = this.printScriptValue(property, outputValue);\n scriptText += `${outputValueStr});\\n`;\n }\n }\n const defaultValue = property.value;\n const defaultValueStr = this.printScriptValue(property, defaultValue);\n scriptText += `else widget.setPropertyValue(\"${rule.propertyName}\", `;\n scriptText += `${defaultValueStr});\\n`;\n }\n\n this.scriptEngine = new ScriptEngine(widget, scriptText, pvs);\n }\n\n private printScriptValue(property: Property<any>, value: any) {\n if (value === null || value === undefined) {\n return 'null';\n } else {\n return property.printScriptValue(value);\n }\n }\n}\n","import { AlarmSeverity, PV } from './PV';\n\nexport abstract class SimGenerator {\n\n private timer?: number;\n\n constructor(readonly pv: PV, private interval: number, initialValue?: any) {\n if (initialValue !== undefined) {\n pv.pvEngine.setValue(new Date(), pv.name, initialValue);\n }\n if (this.interval > 0) {\n this.timer = window.setInterval(() => {\n this.generateSample(new Date());\n }, interval);\n }\n }\n\n protected emit(time: Date, value: any) {\n let severity = AlarmSeverity.NONE;\n if (this.pv.lowerAlarmLimit !== undefined && value < this.pv.lowerAlarmLimit) {\n severity = AlarmSeverity.MAJOR;\n } else if (this.pv.upperAlarmLimit !== undefined && value > this.pv.upperAlarmLimit) {\n severity = AlarmSeverity.MAJOR;\n } else if (this.pv.lowerWarningLimit !== undefined && value < this.pv.lowerWarningLimit) {\n severity = AlarmSeverity.MINOR;\n } else if (this.pv.upperWarningLimit !== undefined && value > this.pv.upperWarningLimit) {\n severity = AlarmSeverity.MINOR;\n }\n this.pv.pvEngine.setValue(time, this.pv.name, value, severity);\n }\n\n stop() {\n window.clearInterval(this.timer);\n }\n\n abstract generateSample(time: Date): void;\n}\n\nexport class ConstantGenerator extends SimGenerator {\n\n constructor(pv: PV, initialValue: any) {\n super(pv, -1, initialValue);\n }\n\n generateSample() { }\n}\n\n/**\n * Generates an alternating boolean value\n */\nexport class Flipflop extends SimGenerator {\n\n private state = true;\n\n constructor(pv: PV, interval: number) {\n super(pv, interval);\n }\n\n generateSample(time: Date) {\n this.state = !this.state;\n this.emit(time, !this.state);\n }\n}\n\n/**\n * Generates random floats in the range [min, max]\n */\nexport class Noise extends SimGenerator {\n\n constructor(pv: PV, private min: number, private max: number, interval: number) {\n super(pv, interval);\n const range = this.max - this.min;\n pv.units = 'x';\n pv.lowerDisplayLimit = min;\n pv.lowerAlarmLimit = min + range * 0.1;\n pv.lowerWarningLimit = min + range * 0.2;\n pv.upperWarningLimit = min + range * 0.8;\n pv.upperAlarmLimit = min + range * 0.9;\n pv.upperDisplayLimit = max;\n }\n\n generateSample(time: Date) {\n const value = Math.random() * (this.max - this.min) + this.min;\n this.emit(time, value);\n }\n}\n\n/**\n * Generates random values in the range [min, max]\n */\nexport class GaussianNoise extends SimGenerator {\n\n constructor(pv: PV, private avg: number, private stddev: number, interval: number) {\n super(pv, interval);\n pv.units = 'x';\n pv.lowerDisplayLimit = avg - 4 * stddev;\n pv.lowerAlarmLimit = avg - 2 * stddev;\n pv.lowerWarningLimit = avg - stddev;\n pv.upperWarningLimit = avg + stddev;\n pv.upperAlarmLimit = avg + 2 * stddev;\n pv.upperDisplayLimit = avg + 4 * stddev;\n }\n\n generateSample(time: Date) {\n let x1;\n let x2;\n let rad;\n do {\n x1 = 2 * Math.random() - 1;\n x2 = 2 * Math.random() - 1;\n rad = x1 * x1 + x2 * x2;\n } while (rad >= 1 || rad === 0);\n const c = Math.sqrt(-2 * Math.log(rad) / rad);\n const gaussian = x1 * c;\n this.emit(time, this.avg + gaussian * this.stddev);\n }\n}\n\n/**\n * Generate sine samples between min and max.\n * Warning limits are set at 80%, and alarm limits at 90%.\n */\nexport class Sine extends SimGenerator {\n\n private currentValue = 0;\n\n constructor(pv: PV, private min: number, private max: number, private samplesPerCycle: number, interval: number) {\n super(pv, interval);\n const range = this.max - this.min;\n pv.units = 'x';\n pv.lowerDisplayLimit = min;\n pv.lowerAlarmLimit = min + range * 0.1;\n pv.lowerWarningLimit = min + range * 0.2;\n pv.upperWarningLimit = min + range * 0.8;\n pv.upperAlarmLimit = min + range * 0.9;\n pv.upperDisplayLimit = max;\n }\n\n generateSample(time: Date) {\n const range = this.max - this.min;\n const value = Math.sin(this.currentValue * 2 * Math.PI / this.samplesPerCycle) * range / 2 + this.min + (range / 2);\n this.currentValue++;\n this.emit(time, value);\n }\n}\n\nexport class Ramp extends SimGenerator {\n\n private currentValue = 0;\n\n constructor(pv: PV, private min: number, private max: number, private inc: number, interval: number) {\n super(pv, interval);\n if (inc >= 0) {\n this.currentValue = min - inc;\n } else {\n this.currentValue = max - inc;\n }\n const range = this.max - this.min;\n pv.units = 'x';\n pv.lowerDisplayLimit = min;\n pv.lowerAlarmLimit = min + range * 0.1;\n pv.lowerWarningLimit = min + range * 0.2;\n pv.upperWarningLimit = min + range * 0.8;\n pv.upperAlarmLimit = min + range * 0.9;\n pv.upperDisplayLimit = max;\n }\n\n generateSample(time: Date) {\n this.currentValue = this.currentValue + this.inc;\n if (this.currentValue > this.max) {\n this.currentValue = this.min;\n }\n if (this.currentValue < this.min) {\n this.currentValue = this.max;\n }\n this.emit(time, this.currentValue);\n }\n}\n","import { PV } from './PV';\nimport { PVProvider } from './PVProvider';\nimport { ConstantGenerator, GaussianNoise, Noise, Ramp, SimGenerator, Sine } from './sim';\n\nconst PV_PATTERN = /sim\\:\\/\\/([a-zA-Z]+)(\\((.*)\\))?/;\n\nexport class SimulatedPVProvider implements PVProvider {\n\n private pvs = new Map<string, SimulatedPV>();\n\n canProvide(pvName: string) {\n return pvName.startsWith('sim://');\n }\n\n startProviding(pvs: PV[]) {\n for (const pv of pvs) {\n const wrapped = new SimulatedPV(pv);\n this.pvs.set(pv.name, wrapped);\n }\n }\n\n stopProviding(pvs: PV[]) {\n for (const pv of pvs) {\n const match = this.pvs.get(pv.name);\n if (match) {\n match.fn.stop();\n this.pvs.delete(pv.name);\n }\n }\n }\n\n isNavigable() {\n return false;\n }\n\n shutdown() {\n for (const pv of this.pvs.values()) {\n pv.fn.stop();\n }\n }\n}\n\nclass SimulatedPV {\n\n fn: SimGenerator;\n\n constructor(readonly pv: PV) {\n const match = pv.name.match(PV_PATTERN);\n if (match) {\n const args = match[3] ? match[3].split(',') : [];\n for (let i = 0; i < args.length; i++) {\n args[i] = args[i].trim();\n }\n this.fn = this.createGenerator(match[1], args);\n } else {\n console.warn(`Unexpected pattern for PV ${pv.name}`);\n this.fn = new ConstantGenerator(pv, undefined);\n }\n }\n\n private createGenerator(fnName: string, args: string[]) {\n switch (fnName) {\n case 'const':\n const constValue = this.saferEval(args[0]);\n return new ConstantGenerator(this.pv, constValue);\n case 'gaussianNoise':\n return this.createGaussianNoise(args);\n case 'noise':\n return this.createNoise(args);\n case 'ramp':\n return this.createRamp(args);\n case 'sine':\n return this.createSine(args);\n default:\n console.warn(`Unexpected function ${fnName} for PV ${this.pv.name}`);\n return new ConstantGenerator(this.pv, undefined);\n }\n }\n\n private saferEval(obj: any) { // Preserve type of strings and numbers\n return Function('\"use strict\";return (' + obj + ')')();\n }\n\n private createNoise(args: string[]) {\n if (args.length === 0) {\n return new Noise(this.pv, -5, 5, 1000);\n } else {\n const min = parseFloat(args[0]);\n const max = parseFloat(args[1]);\n const interval = parseFloat(args[2]) * 1000;\n return new Noise(this.pv, min, max, interval);\n }\n }\n\n private createGaussianNoise(args: string[]) {\n if (args.length === 0) {\n return new GaussianNoise(this.pv, 0, 1, 100);\n } else {\n const avg = parseFloat(args[0]);\n const stddev = parseFloat(args[1]);\n const interval = parseFloat(args[2]) * 1000;\n return new GaussianNoise(this.pv, avg, stddev, interval);\n }\n }\n\n private createRamp(args: string[]) {\n let ramp: Ramp;\n if (args.length === 0) {\n ramp = new Ramp(this.pv, -5, 5, 1, 1000);\n } else if (args.length === 3) {\n const min = parseFloat(args[0]);\n const max = parseFloat(args[1]);\n const interval = parseFloat(args[2]) * 1000;\n ramp = new Ramp(this.pv, min, max, 1, interval);\n } else if (args.length === 4) {\n const min = parseFloat(args[0]);\n const max = parseFloat(args[1]);\n const step = parseFloat(args[2]);\n const interval = parseFloat(args[3]) * 1000;\n ramp = new Ramp(this.pv, min, max, step, interval);\n } else {\n console.warn(`Unexpected ramp arguments for PV ${this.pv.name}`);\n return new ConstantGenerator(this.pv, undefined);\n }\n\n return ramp;\n }\n\n private createSine(args: string[]) {\n let sine: Sine;\n if (args.length === 0) {\n sine = new Sine(this.pv, -5, 5, 10, 1000);\n } else if (args.length === 3) {\n const min = parseFloat(args[0]);\n const max = parseFloat(args[1]);\n const interval = parseFloat(args[2]) * 1000;\n sine = new Sine(this.pv, min, max, 10, interval);\n } else if (args.length === 4) {\n const min = parseFloat(args[0]);\n const max = parseFloat(args[1]);\n const samplesPerCycle = parseFloat(args[2]);\n const interval = parseFloat(args[3]) * 1000;\n sine = new Sine(this.pv, min, max, samplesPerCycle, interval);\n } else {\n console.warn(`Unexpected sine arguments for PV ${this.pv.name}`);\n return new ConstantGenerator(this.pv, undefined);\n }\n\n return sine;\n }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics, Path } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { BooleanProperty, FontProperty, IntProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_FONT = 'font';\nconst PROP_PUSH_ACTION_INDEX = 'push_action_index';\nconst PROP_RELEASE_ACTION_INDEX = 'release_action_index';\nconst PROP_TOGGLE_BUTTON = 'toggle_button';\nconst PROP_IMAGE = 'image';\n\nexport class ActionButton extends Widget {\n\n private areaRegion?: HitRegionSpecification;\n\n private pushed = false;\n\n private imageElement?: HTMLImageElement;\n private imageLoaded = false;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new BooleanProperty(PROP_TOGGLE_BUTTON));\n this.properties.add(new IntProperty(PROP_PUSH_ACTION_INDEX));\n this.properties.add(new IntProperty(PROP_RELEASE_ACTION_INDEX));\n this.properties.add(new StringProperty(PROP_IMAGE));\n }\n\n init() {\n if (this.image) {\n this.imageElement = new Image();\n this.imageElement.onload = () => {\n this.imageLoaded = true;\n this.requestRepaint();\n };\n this.imageElement.src = this.resolvePath(this.image);\n }\n\n this.areaRegion = {\n id: `${this.wuid}-area`,\n mouseDown: () => {\n if (!this.toggleButton) {\n this.pushed = true;\n this.requestRepaint();\n }\n },\n mouseOut: () => {\n this.pushed = false;\n this.requestRepaint();\n },\n mouseUp: () => {\n if (!this.toggleButton) {\n this.pushed = false;\n this.requestRepaint();\n }\n },\n click: () => {\n this.executeAction(this.pushed ? this.releaseActionIndex! : this.pushActionIndex);\n if (this.toggleButton) {\n this.pushed = !this.pushed;\n }\n },\n tooltip: () => this.tooltip,\n cursor: 'pointer'\n };\n }\n\n draw(g: Graphics) {\n const ctx = g.ctx;\n const { scale } = this;\n\n g.fillRect({\n ...this.area,\n color: this.backgroundColor,\n });\n\n const hitRegion = g.addHitRegion(this.areaRegion!);\n hitRegion.addRect(this.x, this.y, this.width, this.height);\n\n const lineWidth = 1 * scale;\n\n const top = this.holderY + (lineWidth / 2);\n const left = this.holderX + (lineWidth / 2);\n const bottom = this.holderY + this.holderHeight - lineWidth + (lineWidth / 2);\n const right = this.holderX + this.holderWidth - lineWidth + (lineWidth / 2);\n\n g.strokePath({\n lineWidth,\n color: this.pushed ? Color.BUTTON_LIGHTEST : Color.BLACK,\n path: new Path(right, bottom)\n .lineTo(right, top)\n .moveTo(right, bottom)\n .lineTo(left, bottom),\n });\n\n g.strokePath({\n lineWidth,\n color: this.pushed ? this.backgroundColor : Color.BUTTON_DARKER,\n path: new Path(right - lineWidth, bottom - lineWidth)\n .lineTo(right - lineWidth, top + lineWidth)\n .moveTo(right - lineWidth, bottom - lineWidth)\n .lineTo(left + lineWidth, bottom - lineWidth),\n });\n\n g.strokePath({\n lineWidth,\n color: this.pushed ? Color.BLACK : Color.BUTTON_LIGHTEST,\n path: new Path(left, top)\n .lineTo(right - lineWidth, top)\n .moveTo(left, top)\n .lineTo(left, bottom - lineWidth),\n });\n\n g.strokePath({\n lineWidth,\n color: this.pushed ? Color.BUTTON_DARKER : this.backgroundColor,\n path: new Path(left + lineWidth, top + lineWidth)\n .lineTo(right - lineWidth - lineWidth, top + lineWidth)\n .moveTo(left + lineWidth, top + lineWidth)\n .lineTo(left + lineWidth, bottom - lineWidth - lineWidth),\n });\n\n const lines = this.text.split('\\n');\n\n ctx.fillStyle = this.foregroundColor.toString();\n ctx.font = this.font.getFontString();\n\n // Calculate available space in height and width\n let x;\n let y;\n if (this.imageElement && this.imageLoaded) {\n const textWidth = ctx.measureText(lines[0]).width;\n const textHeight = this.font.height;\n\n const naturalHeight = this.imageElement.naturalHeight * scale;\n const naturalWidth = this.imageElement.naturalWidth * scale;\n\n const hratio = (this.height - naturalHeight) / textHeight;\n const wratio = (this.width - naturalWidth) / textWidth;\n const magicSpacer = 5 * scale;\n if (wratio > hratio) { // Text right of icon\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'left';\n x = this.x + (this.width - textWidth) / 2 + magicSpacer;\n y = this.y + (this.height / 2);\n\n const imageX = this.x + (this.width - textWidth) / 2 - naturalWidth;\n const imageY = this.y + (this.height - naturalHeight) / 2;\n ctx.drawImage(this.imageElement, imageX, imageY, naturalWidth, naturalHeight);\n } else { // Text under icon\n ctx.textAlign = 'center';\n ctx.textBaseline = 'top';\n const contentHeight = textHeight + naturalHeight;\n x = this.x + (this.width / 2);\n y = this.y + (this.height - contentHeight) / 2 + naturalHeight;\n const imageX = this.x + (this.width - naturalWidth) / 2;\n const imageY = this.y + (this.height - contentHeight) / 2;\n ctx.drawImage(this.imageElement, imageX, imageY, naturalWidth, naturalHeight);\n }\n\n if (this.pushed) {\n x += 1 * scale;\n y += 1 * scale;\n }\n ctx.fillText(lines[0], x, y);\n } else {\n ctx.textAlign = 'start';\n ctx.textBaseline = 'top';\n\n let maxWidth = 0;\n for (const line of lines) {\n const textWidth = ctx.measureText(line).width;\n maxWidth = Math.max(maxWidth, textWidth);\n }\n\n x = this.x + (this.width - maxWidth) / 2;\n\n const textHeight = lines.length * this.font.height\n + ((lines.length - 1) * this.font.height * 0.2);\n y = this.y + ((this.height - textHeight) / 2);\n\n for (const line of lines) {\n let textX = x;\n let textY = y;\n if (this.pushed) {\n textX += 1 * scale;\n textY += 1 * scale;\n }\n ctx.fillText(line, textX, textY);\n y += this.font.height * 1.2; // Roughly\n }\n }\n }\n\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n get image(): string { return this.properties.getValue(PROP_IMAGE); }\n get toggleButton(): boolean { return this.properties.getValue(PROP_TOGGLE_BUTTON); }\n get pushActionIndex(): number { return this.properties.getValue(PROP_PUSH_ACTION_INDEX); }\n get releaseActionIndex(): number { return this.properties.getValue(PROP_RELEASE_ACTION_INDEX); }\n\n // Some widget instances don't seem to have this property and use a specific default.\n get backgroundColor(): Color {\n const prop = this.properties.getProperty('background_color');\n if (prop && prop.value !== Color.TRANSPARENT) {\n return prop.value;\n } else {\n return Color.BUTTON;\n }\n }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics, Path } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { Bounds } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FontProperty, IntProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_BIT = 'bit';\nconst PROP_DATA_TYPE = 'data_type';\nconst PROP_EFFECT_3D = 'effect_3d';\nconst PROP_FONT = 'font';\nconst PROP_OFF_COLOR = 'off_color';\nconst PROP_OFF_LABEL = 'off_label';\nconst PROP_OFF_STATE = 'off_state';\nconst PROP_ON_COLOR = 'on_color';\nconst PROP_ON_LABEL = 'on_label';\nconst PROP_ON_STATE = 'on_state';\nconst PROP_PUSH_ACTION_INDEX = 'push_action_index';\nconst PROP_RELEASE_ACTION_INDEX = 'released_action_index'; // with 'd'\nconst PROP_SHOW_LED = 'show_led';\nconst PROP_SHOW_BOOLEAN_LABEL = 'show_boolean_label';\nconst PROP_SQUARE_BUTTON = 'square_button';\nconst PROP_TOGGLE_BUTTON = 'toggle_button';\n\nexport class BooleanButton extends Widget {\n\n private hovered = false;\n private manualToggleState = false; // Without PV\n\n private areaRegion?: HitRegionSpecification;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new IntProperty(PROP_BIT));\n this.properties.add(new IntProperty(PROP_DATA_TYPE));\n this.properties.add(new BooleanProperty(PROP_SQUARE_BUTTON));\n this.properties.add(new BooleanProperty(PROP_SHOW_LED));\n this.properties.add(new BooleanProperty(PROP_EFFECT_3D));\n this.properties.add(new ColorProperty(PROP_ON_COLOR));\n this.properties.add(new StringProperty(PROP_ON_LABEL));\n this.properties.add(new StringProperty(PROP_ON_STATE));\n this.properties.add(new ColorProperty(PROP_OFF_COLOR));\n this.properties.add(new StringProperty(PROP_OFF_LABEL));\n this.properties.add(new StringProperty(PROP_OFF_STATE));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new BooleanProperty(PROP_TOGGLE_BUTTON));\n this.properties.add(new IntProperty(PROP_PUSH_ACTION_INDEX));\n this.properties.add(new IntProperty(PROP_RELEASE_ACTION_INDEX));\n this.properties.add(new BooleanProperty(PROP_SHOW_BOOLEAN_LABEL));\n }\n\n init() {\n this.areaRegion = {\n id: `${this.wuid}-area`,\n mouseDown: () => {\n if (this.toggleButton) {\n this.booleanValue ? this.toggleOff() : this.toggleOn();\n } else {\n this.toggleOn();\n }\n this.requestRepaint();\n },\n mouseEnter: () => {\n this.hovered = true;\n this.requestRepaint();\n },\n mouseUp: () => {\n if (this.booleanValue && !this.toggleButton) {\n this.toggleOff();\n this.requestRepaint();\n }\n },\n mouseOut: () => {\n if (this.booleanValue && !this.toggleButton) {\n this.toggleOff();\n }\n this.hovered = false;\n this.requestRepaint();\n },\n tooltip: () => this.tooltip,\n cursor: 'pointer'\n };\n }\n\n private toggleOn() {\n this.manualToggleState = true;\n if (this.pv && this.pv.writable) {\n if (this.dataType === 0) { // Bit\n if (this.bit < 0) {\n this.display.pvEngine.setValue(new Date(), this.pv.name, 1);\n } else {\n const value = this.pv.value | (1 << this.bit);\n this.display.pvEngine.setValue(new Date(), this.pv.name, value);\n }\n } else {\n this.display.pvEngine.setValue(new Date(), this.pv.name, this.onState);\n }\n }\n this.executeAction(this.pushActionIndex);\n }\n\n private toggleOff() {\n this.manualToggleState = false;\n if (this.pv && this.pv.writable) {\n if (this.dataType === 0) { // Bit\n if (this.bit < 0) {\n this.display.pvEngine.setValue(new Date(), this.pv.name, 0);\n } else {\n const value = this.pv.value & ~(1 << this.bit);\n this.display.pvEngine.setValue(new Date(), this.pv.name, value);\n }\n } else {\n this.display.pvEngine.setValue(new Date(), this.pv.name, this.offState);\n }\n }\n if (this.releaseActionIndex !== undefined) {\n this.executeAction(this.releaseActionIndex);\n }\n }\n\n get booleanValue() {\n if (this.pv && this.pv.value !== undefined) {\n if (this.dataType === 0) { // Bit\n if (this.bit < 0) {\n return Boolean(this.pv?.toNumber());\n } else {\n return ((this.pv?.value >> this.bit) & 1) > 0;\n }\n } else if (this.dataType === 1) { // Enum\n return this.pv.toString() === this.onState;\n } else {\n return false;\n }\n } else {\n return this.manualToggleState;\n }\n }\n\n draw(g: Graphics) {\n const toggled = this.booleanValue;\n\n if (this.squareButton) {\n this.drawSquare(g, toggled);\n } else {\n this.drawEllipse(g, toggled);\n }\n\n // Foreground\n if (this.width > this.height) {\n this.drawHorizontal(g, toggled);\n } else {\n this.drawVertical(g, toggled);\n }\n\n if (this.showBooleanLabel) {\n g.fillText({\n x: this.x + (this.width / 2),\n y: this.y + (this.height / 2),\n font: this.font,\n color: this.foregroundColor,\n align: 'center',\n baseline: 'middle',\n text: toggled ? this.onLabel : this.offLabel,\n });\n }\n }\n\n private drawSquare(g: Graphics, toggled: boolean) {\n g.fillRect({\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n color: Color.DARK_GRAY,\n });\n\n const area = g.addHitRegion(this.areaRegion!);\n area.addRect(this.x, this.y, this.width, this.height);\n\n const lineWidth = 2 * this.scale;\n const tlColor = toggled ? Color.DARK_GRAY : Color.WHITE;\n const brColor = toggled ? Color.WHITE : Color.DARK_GRAY;\n if (this.effect3d) {\n g.fillPath({\n color: tlColor,\n path: new Path(this.x, this.y)\n .lineTo(this.x, this.y + this.height)\n .lineTo(this.x + lineWidth, this.y + this.height - lineWidth)\n .lineTo(this.x + lineWidth, this.y + lineWidth)\n .lineTo(this.x + this.width - lineWidth, this.y + lineWidth)\n .lineTo(this.x + this.width, this.y)\n .closePath()\n });\n\n g.fillPath({\n color: brColor,\n path: new Path(this.x, this.y + this.height)\n .lineTo(this.x + this.width, this.y + this.height)\n .lineTo(this.x + this.width, this.y)\n .lineTo(this.x + this.width - lineWidth, this.y + lineWidth)\n .lineTo(this.x + this.width - lineWidth, this.y + this.height - lineWidth)\n .lineTo(this.x + lineWidth, this.y + this.height - lineWidth)\n .closePath()\n });\n }\n\n let color = this.backgroundColor;\n if (this.hovered) {\n color = this.backgroundColor.mixWith(Color.WHITE, 0.5);\n }\n g.fillRect({\n x: this.x + lineWidth,\n y: this.y + lineWidth,\n width: this.width - lineWidth - lineWidth,\n height: this.height - lineWidth - lineWidth,\n color,\n });\n }\n\n private drawEllipse(g: Graphics, toggled: boolean) {\n const { scale } = this;\n if (this.effect3d) {\n const a = this.width / 2;\n const b = this.height / 2;\n const w = Math.sqrt(a * a + b * b);\n const x1 = this.x + a + (b - a - w) / 2 - (1 * scale);\n const y1 = this.y + b - (b - a + w) / 2 - (1 * scale);\n const x2 = this.x + a + (b - a + w) / 2 + (5 * scale);\n const y2 = this.y + b - (b - a - w) / 2 + (5 * scale);\n\n const gradient = g.createLinearGradient(x1, y1, x2, y2);\n if (toggled) {\n gradient.addColorStop(0, Color.DARK_GRAY.toString());\n gradient.addColorStop(1, Color.WHITE.toString());\n } else {\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, Color.DARK_GRAY.toString());\n }\n g.ctx.fillStyle = gradient;\n } else if (toggled) {\n g.ctx.fillStyle = Color.WHITE.toString();\n } else {\n g.ctx.fillStyle = Color.DARK_GRAY.toString();\n }\n\n const x = this.x + (this.width / 2);\n const y = this.y + (this.height / 2);\n const rx = this.width / 2;\n const ry = this.height / 2;\n g.ctx.beginPath();\n g.ctx.ellipse(x, y, rx, ry, 0, 0, 2 * Math.PI);\n g.ctx.fill();\n\n const area = g.addHitRegion(this.areaRegion!);\n area.addEllipse(x, y, rx, ry, 0, 0, 2 * Math.PI);\n\n if (this.hovered) {\n g.ctx.fillStyle = this.backgroundColor.mixWith(Color.WHITE, 0.5).toString();\n } else {\n g.ctx.fillStyle = this.backgroundColor.toString();\n }\n g.ctx.beginPath();\n g.ctx.ellipse(x, y, rx - (scale * 2), ry - (scale * 2), 0, 0, 2 * Math.PI);\n g.ctx.fill();\n }\n\n private drawHorizontal(g: Graphics, toggled: boolean) {\n const { scale } = this;\n if (this.showLed) {\n let diameter: number;\n if (this.squareButton) {\n diameter = Math.floor(0.3 * (this.width + this.height) / 2);\n if (diameter > Math.min(this.width, this.height)) {\n diameter = Math.min(this.width, this.height) - (2 * scale);\n }\n } else {\n diameter = Math.floor(0.25 * (this.width + this.height) / 2);\n if (diameter > Math.min(this.width, this.height)) {\n diameter = Math.min(this.width, this.height) - (8 * scale);\n }\n }\n const ledArea: Bounds = {\n x: Math.floor(this.x + this.width * 0.79999 - diameter / 2),\n y: Math.floor(this.y + this.height / 2 - diameter / 2),\n width: diameter,\n height: diameter\n };\n\n const cx = ledArea.x + (ledArea.width / 2);\n const cy = ledArea.y + (ledArea.height / 2);\n const rx = ledArea.width / 2;\n const ry = ledArea.height / 2;\n const ledColor = toggled ? this.onColor : this.offColor;\n\n g.fillEllipse({ cx, cy, rx, ry, color: ledColor });\n\n if (this.effect3d) {\n const gradient = g.createLinearGradient(\n ledArea.x, ledArea.y, ledArea.x + ledArea.width, ledArea.y + ledArea.height);\n gradient.addColorStop(0, 'white');\n gradient.addColorStop(1, ledColor.withAlpha(0).toString());\n g.ctx.beginPath();\n g.ctx.ellipse(cx, cy, rx, ry, 0, 0, 2 * Math.PI);\n g.ctx.fillStyle = gradient;\n g.ctx.fill();\n }\n }\n }\n\n private drawVertical(g: Graphics, toggled: boolean) {\n const { scale } = this;\n if (this.showLed) {\n let diameter: number;\n if (this.squareButton) {\n diameter = Math.floor(0.3 * (this.width + this.height) / 2);\n if (diameter > Math.min(this.width, this.height)) {\n diameter = Math.min(this.width, this.height) - (2 * scale);\n }\n } else {\n diameter = Math.floor(0.25 * (this.width + this.height) / 2);\n if (diameter > Math.min(this.width, this.height)) {\n diameter = Math.min(this.width, this.height) - (8 * scale);\n }\n }\n const ledArea: Bounds = {\n x: Math.floor(this.x + this.width / 2 - diameter / 2),\n y: Math.floor(this.y + ((1 - 0.79999) * this.height) - diameter / 2),\n width: diameter,\n height: diameter\n };\n\n const ledColor = toggled ? this.onColor : this.offColor;\n const cx = ledArea.x + (ledArea.width / 2);\n const cy = ledArea.y + (ledArea.height / 2);\n const rx = ledArea.width / 2;\n const ry = ledArea.height / 2;\n g.fillEllipse({ cx, cy, rx, ry, color: ledColor });\n\n if (this.effect3d) {\n const gradient = g.createLinearGradient(\n ledArea.x, ledArea.y, ledArea.x + ledArea.width, ledArea.y + ledArea.height);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, ledColor.withAlpha(0).toString());\n g.ctx.beginPath();\n g.ctx.ellipse(cx, cy, rx, ry, 0, 0, 2 * Math.PI);\n g.ctx.fillStyle = gradient;\n g.ctx.fill();\n }\n }\n }\n\n get bit(): number { return this.properties.getValue(PROP_BIT); }\n get dataType(): number { return this.properties.getValue(PROP_DATA_TYPE); }\n get toggleButton(): boolean { return this.properties.getValue(PROP_TOGGLE_BUTTON); }\n get pushActionIndex(): number { return this.properties.getValue(PROP_PUSH_ACTION_INDEX); }\n get releaseActionIndex(): number { return this.properties.getValue(PROP_RELEASE_ACTION_INDEX); }\n get squareButton(): boolean { return this.properties.getValue(PROP_SQUARE_BUTTON); }\n get showLed(): boolean { return this.properties.getValue(PROP_SHOW_LED); }\n get showBooleanLabel(): boolean { return this.properties.getValue(PROP_SHOW_BOOLEAN_LABEL); }\n get effect3d(): boolean { return this.properties.getValue(PROP_EFFECT_3D); }\n get onColor(): Color { return this.properties.getValue(PROP_ON_COLOR); }\n get onLabel(): string { return this.properties.getValue(PROP_ON_LABEL); }\n get onState(): string { return this.properties.getValue(PROP_ON_STATE); }\n get offColor(): Color { return this.properties.getValue(PROP_OFF_COLOR); }\n get offLabel(): string { return this.properties.getValue(PROP_OFF_LABEL); }\n get offState(): string { return this.properties.getValue(PROP_OFF_STATE); }\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Graphics, Path } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { Bounds } from '../../positioning';\nimport { BooleanProperty, ColorProperty, IntProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_BIT = 'bit';\nconst PROP_DATA_TYPE = 'data_type';\nconst PROP_EFFECT_3D = 'effect_3d';\nconst PROP_OFF_COLOR = 'off_color';\nconst PROP_OFF_LABEL = 'off_label';\nconst PROP_OFF_STATE = 'off_state';\nconst PROP_ON_COLOR = 'on_color';\nconst PROP_ON_LABEL = 'on_label';\nconst PROP_ON_STATE = 'on_state';\nconst PROP_PUSH_ACTION_INDEX = 'push_action_index';\nconst PROP_RELEASE_ACTION_INDEX = 'released_action_index'; // with 'd'\nconst PROP_TOGGLE_BUTTON = 'toggle_button';\n\nexport class BooleanSwitch extends Widget {\n\n private manualToggleState = false; // Without PV\n\n private shaftRegion?: HitRegionSpecification;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new IntProperty(PROP_BIT));\n this.properties.add(new IntProperty(PROP_DATA_TYPE));\n this.properties.add(new BooleanProperty(PROP_EFFECT_3D));\n this.properties.add(new ColorProperty(PROP_ON_COLOR));\n this.properties.add(new StringProperty(PROP_ON_LABEL));\n this.properties.add(new StringProperty(PROP_ON_STATE));\n this.properties.add(new ColorProperty(PROP_OFF_COLOR));\n this.properties.add(new StringProperty(PROP_OFF_LABEL));\n this.properties.add(new StringProperty(PROP_OFF_STATE));\n this.properties.add(new IntProperty(PROP_PUSH_ACTION_INDEX));\n this.properties.add(new IntProperty(PROP_RELEASE_ACTION_INDEX));\n this.properties.add(new BooleanProperty(PROP_TOGGLE_BUTTON));\n }\n\n init() {\n this.shaftRegion = {\n id: `${this.wuid}-shaft`,\n mouseDown: () => {\n if (this.toggleButton) {\n this.booleanValue ? this.toggleOff() : this.toggleOn();\n } else {\n this.toggleOn();\n }\n this.requestRepaint();\n },\n mouseUp: () => {\n if (this.booleanValue && !this.toggleButton) {\n this.toggleOff();\n this.requestRepaint();\n }\n },\n mouseOut: () => {\n if (this.booleanValue && !this.toggleButton) {\n this.toggleOff();\n this.requestRepaint();\n }\n },\n tooltip: () => this.tooltip,\n cursor: 'pointer'\n };\n }\n\n private toggleOn() {\n this.manualToggleState = true;\n if (this.pv && this.pv.writable) {\n if (this.dataType === 0) { // Bit\n if (this.bit < 0) {\n this.display.pvEngine.setValue(new Date(), this.pv.name, 1);\n } else {\n const value = this.pv.value | (1 << this.bit);\n this.display.pvEngine.setValue(new Date(), this.pv.name, value);\n }\n } else {\n this.display.pvEngine.setValue(new Date(), this.pv.name, this.onState);\n }\n }\n this.executeAction(this.pushActionIndex);\n }\n\n private toggleOff() {\n this.manualToggleState = false;\n if (this.pv && this.pv.writable) {\n if (this.dataType === 0) { // Bit\n if (this.bit < 0) {\n this.display.pvEngine.setValue(new Date(), this.pv.name, 0);\n } else {\n const value = this.pv.value & ~(1 << this.bit);\n this.display.pvEngine.setValue(new Date(), this.pv.name, value);\n }\n } else {\n this.display.pvEngine.setValue(new Date(), this.pv.name, this.offState);\n }\n }\n if (this.releaseActionIndex !== undefined) {\n this.executeAction(this.releaseActionIndex);\n }\n }\n\n get booleanValue() {\n if (this.pv && this.pv.value !== undefined) {\n if (this.dataType === 0) { // Bit\n if (this.bit < 0) {\n return Boolean(this.pv?.toNumber());\n } else {\n return ((this.pv?.value >> this.bit) & 1) > 0;\n }\n } else if (this.dataType === 1) { // Enum\n return this.pv.toString() === this.onState;\n } else {\n return false;\n }\n } else {\n return this.manualToggleState;\n }\n }\n\n draw(g: Graphics) {\n const toggled = this.booleanValue;\n\n if (this.width > this.height) {\n this.drawHorizontal(g, toggled);\n } else {\n this.drawVertical(g, toggled);\n }\n }\n\n private drawHorizontal(g: Graphics, toggled: boolean) {\n let areaWidth = this.width;\n let areaHeight = this.height;\n if (areaHeight > areaWidth / 2) {\n areaHeight = Math.floor(this.width / 2);\n } else {\n areaWidth = Math.floor(2 * this.height);\n }\n\n const pedBounds = {\n x: Math.floor((63.0 / 218.0) * areaWidth),\n y: 0,\n width: areaHeight / 2,\n height: areaHeight / 2,\n };\n this.drawPedestal(g, pedBounds, toggled);\n\n const largeWidth = Math.floor((35.0 / 218.0) * areaWidth);\n const largeHeight = Math.floor((45.0 / 105.0) * areaHeight);\n const smallWidth = Math.floor((43.0 / 218.0) * areaWidth);\n const smallHeight = Math.floor((35.0 / 105.0) * areaHeight);\n\n const smallMove = Math.floor((1.0 / 7.0) * pedBounds.width);\n\n if (toggled) {\n const onLargeBounds: Bounds = {\n x: 2 * pedBounds.x + pedBounds.width - largeWidth,\n y: pedBounds.height / 2 - largeHeight / 2,\n width: largeWidth,\n height: largeHeight\n };\n const onSmallBounds: Bounds = {\n x: pedBounds.x + pedBounds.width / 2 - smallWidth / 2 + smallMove,\n y: pedBounds.y + pedBounds.height / 2 - smallHeight / 2,\n width: smallWidth,\n height: smallHeight,\n };\n this.drawHorizontalBar(g, onSmallBounds, onLargeBounds, true);\n } else {\n const offLargeBounds: Bounds = {\n x: 0,\n y: pedBounds.height / 2 - largeHeight / 2,\n width: largeWidth,\n height: largeHeight,\n };\n const offSmallBounds: Bounds = {\n x: pedBounds.x + pedBounds.width / 2 - smallWidth / 2 - smallMove,\n y: pedBounds.y + pedBounds.height / 2 - smallHeight / 2,\n width: smallWidth,\n height: smallHeight,\n };\n this.drawHorizontalBar(g, offSmallBounds, offLargeBounds, false);\n }\n }\n\n private drawVertical(g: Graphics, toggled: boolean) {\n let areaWidth = this.width;\n let areaHeight = this.height;\n if (areaWidth > areaHeight / 2) {\n areaWidth = Math.floor(this.height / 2);\n } else {\n areaHeight = Math.floor(2 * this.width);\n }\n\n const pedBounds = {\n x: 0,\n y: Math.floor((63.0 / 218.0) * areaHeight),\n width: areaWidth / 2,\n height: areaWidth / 2,\n };\n this.drawPedestal(g, pedBounds, toggled);\n\n const largeWidth = Math.floor((45.0 / 105.0) * areaWidth);\n const largeHeight = Math.floor((35.0 / 218.0) * areaHeight);\n const smallWidth = Math.floor((35.0 / 105.0) * areaWidth);\n const smallHeight = Math.floor((43.0 / 218.0) * areaHeight);\n\n if (toggled) {\n const onLargeBounds: Bounds = {\n x: pedBounds.width / 2 - largeWidth / 2,\n y: 0,\n width: largeWidth,\n height: largeHeight\n };\n const onSmallBounds: Bounds = {\n x: pedBounds.x + pedBounds.width / 2 - smallWidth / 2,\n y: pedBounds.y + pedBounds.height / 2 - smallHeight / 2,\n width: smallWidth,\n height: smallHeight,\n };\n onSmallBounds.y -= Math.floor((1.0 / 7.0) * pedBounds.height);\n this.drawVerticalBar(g, onSmallBounds, onLargeBounds, true);\n } else {\n const barHeight = pedBounds.y + pedBounds.height / 2 + smallHeight / 2 + (2 * this.scale);\n const offLargeBounds: Bounds = {\n x: pedBounds.width / 2 - largeWidth / 2,\n y: pedBounds.y + pedBounds.height / 2 - smallHeight / 2 + barHeight - largeHeight,\n width: largeWidth,\n height: largeHeight,\n };\n const offSmallBounds: Bounds = {\n x: pedBounds.x + pedBounds.width / 2 - smallWidth / 2,\n y: pedBounds.y + pedBounds.height / 2 - smallHeight / 2,\n width: smallWidth,\n height: smallHeight,\n };\n offSmallBounds.y += Math.floor((1.0 / 7.0) * pedBounds.height);\n this.drawVerticalBar(g, offSmallBounds, offLargeBounds, false);\n }\n }\n\n private drawPedestal(g: Graphics, bounds: Bounds, toggled: boolean) {\n let cx = this.x + bounds.x + (bounds.width / 2);\n let cy = this.y + bounds.y + (bounds.height / 2);\n let rx = bounds.width / 2;\n let ry = bounds.height / 2;\n g.ctx.fillStyle = this.effect3d ? Color.WHITE.toString() : Color.GRAY.toString();\n g.ctx.beginPath();\n g.ctx.ellipse(cx, cy, rx, ry, 0, 0, 2 * Math.PI);\n g.ctx.fill();\n\n if (this.effect3d) {\n const gradient = g.createLinearGradient(this.x + bounds.x, this.y + bounds.y,\n this.x + bounds.x + bounds.width, this.y + bounds.y + bounds.height);\n\n if (toggled) {\n gradient.addColorStop(0, `rgba(255,255,255,${10 / 255})`);\n gradient.addColorStop(1, `rgba(0,0,0,${100 / 255})`);\n } else {\n gradient.addColorStop(0, 'rgba(0,0,0,0)');\n gradient.addColorStop(1, `rgba(0,0,0,${150 / 255})`);\n }\n g.ctx.fillStyle = gradient;\n g.ctx.fill();\n }\n }\n\n private drawHorizontalBar(g: Graphics, sm: Bounds, lg: Bounds, booleanValue: boolean) {\n let stopOpacity1 = (booleanValue ? 0 : 10) / 255;\n let stopOpacity2 = (booleanValue ? 150 : 220) / 255;\n\n const gradient = g.createLinearGradient(this.x + lg.x, this.y + lg.y, this.x + lg.x, this.y + lg.y + lg.height);\n gradient.addColorStop(0, `rgba(0,0,0,${stopOpacity1})`);\n gradient.addColorStop(1, `rgba(0,0,0,${stopOpacity2})`);\n\n const shaftRegion = g.addHitRegion(this.shaftRegion!);\n\n /*\n * Small end\n */\n let cx = this.x + sm.x + (sm.width / 2);\n let cy = this.y + sm.y + (sm.height / 2);\n let rx = sm.width / 2;\n let ry = sm.height / 2;\n g.ctx.beginPath();\n g.ctx.ellipse(cx, cy, rx, ry, 0, 0, 2 * Math.PI);\n\n shaftRegion.addEllipse(cx, cy, rx, ry, 0, 0, 2 * Math.PI);\n\n g.ctx.fillStyle = booleanValue ? this.onColor.toString() : this.offColor.toString();\n g.ctx.fill();\n if (this.effect3d) {\n g.ctx.fillStyle = gradient;\n g.ctx.fill();\n }\n\n /*\n * Bar\n */\n const points = [\n Math.round(this.x + lg.x + lg.width / 2), Math.round(this.y + lg.y),\n Math.round(this.x + lg.x + lg.width / 2), Math.round(this.y + lg.y + lg.height),\n Math.round(this.x + sm.x + sm.width / 2), Math.round(this.y + sm.y + sm.height),\n Math.round(this.x + sm.x + sm.width / 2), Math.round(this.y + sm.y),\n ];\n g.ctx.beginPath();\n g.ctx.moveTo(points[0], points[1]);\n g.ctx.lineTo(points[2], points[3]);\n g.ctx.lineTo(points[4], points[5]);\n g.ctx.lineTo(points[6], points[7]);\n g.ctx.closePath();\n\n shaftRegion.addPath(new Path(points[0], points[1])\n .lineTo(points[2], points[3])\n .lineTo(points[4], points[5])\n .lineTo(points[6], points[7])\n .closePath());\n\n g.ctx.fillStyle = booleanValue ? this.onColor.toString() : this.offColor.toString();\n g.ctx.fill();\n if (this.effect3d) {\n g.ctx.fillStyle = gradient;\n g.ctx.fill();\n }\n\n /*\n * Large end\n */\n cx = this.x + lg.x + (lg.width / 2);\n cy = this.y + lg.y + (lg.height / 2);\n rx = lg.width / 2;\n ry = lg.height / 2;\n g.ctx.beginPath();\n g.ctx.ellipse(cx, cy, rx, ry, 0, 0, 2 * Math.PI);\n\n shaftRegion.addEllipse(cx, cy, rx, ry, 0, 0, 2 * Math.PI);\n\n g.ctx.fillStyle = booleanValue ? this.onColor.toString() : this.offColor.toString();\n g.ctx.fill();\n if (this.effect3d) {\n const { scale } = this;\n const w = Math.sqrt(rx * rx + ry * ry);\n const wp = ry - rx;\n const x1 = this.x + lg.x + rx + (wp - w) / 2 - (1 * scale);\n const y1 = this.x + lg.y + ry - (wp + w) / 2 - (1 * scale);\n const x2 = this.x + lg.x + rx + (wp + w) / 2 + (5 * scale);\n const y2 = this.x + lg.y + ry - (wp - w) / 2 + (5 * scale);\n const gradient = g.createLinearGradient(x1, y1, x2, y2);\n gradient.addColorStop(0, `rgba(0,0,0,${stopOpacity1})`);\n gradient.addColorStop(1, `rgba(0,0,0,${stopOpacity2})`);\n g.ctx.fillStyle = gradient;\n g.ctx.fill();\n }\n }\n\n private drawVerticalBar(g: Graphics, sm: Bounds, lg: Bounds, booleanValue: boolean) {\n const gradient = g.createLinearGradient(this.x + lg.x, this.y + lg.y, this.x + lg.x + lg.width, this.y + lg.y);\n gradient.addColorStop(0, `rgba(0,0,0,${10 / 255})`);\n gradient.addColorStop(1, `rgba(0,0,0,${booleanValue ? 210 / 255 : 160 / 255})`);\n\n const shaftRegion = g.addHitRegion(this.shaftRegion!);\n\n /*\n * Small end\n */\n let cx = this.x + sm.x + (sm.width / 2);\n let cy = this.y + sm.y + (sm.height / 2);\n g.ctx.beginPath();\n g.ctx.ellipse(cx, cy, sm.width / 2, sm.height / 2, 0, 0, 2 * Math.PI);\n\n shaftRegion.addEllipse(cx, cy, sm.width / 2, sm.height / 2, 0, 0, 2 * Math.PI);\n\n g.ctx.fillStyle = (booleanValue) ? this.onColor.toString() : this.offColor.toString();\n g.ctx.fill();\n if (this.effect3d) {\n g.ctx.fillStyle = gradient;\n g.ctx.fill();\n }\n\n /*\n * Bar\n */\n const points = [\n Math.round(this.x + lg.x), Math.round(this.y + lg.y + lg.height / 2),\n Math.round(this.x + lg.x + lg.width), Math.round(this.y + lg.y + lg.height / 2),\n Math.round(this.x + sm.x + sm.width), Math.round(this.y + sm.y + sm.height / 2),\n Math.round(this.x + sm.x), Math.round(this.y + sm.y + sm.height / 2)\n ];\n g.ctx.beginPath();\n g.ctx.moveTo(points[0], points[1]);\n g.ctx.lineTo(points[2], points[3]);\n g.ctx.lineTo(points[4], points[5]);\n g.ctx.lineTo(points[6], points[7]);\n g.ctx.closePath();\n\n shaftRegion.addPath(new Path(points[0], points[1])\n .lineTo(points[2], points[3])\n .lineTo(points[4], points[5])\n .lineTo(points[6], points[7])\n .closePath());\n\n g.ctx.fillStyle = (booleanValue) ? this.onColor.toString() : this.offColor.toString();\n g.ctx.fill();\n if (this.effect3d) {\n g.ctx.fillStyle = gradient;\n g.ctx.fill();\n }\n\n /*\n * Large end\n */\n cx = this.x + lg.x + (lg.width / 2);\n cy = this.y + lg.y + (lg.height / 2);\n const rx = lg.width / 2;\n const ry = lg.height / 2;\n g.ctx.beginPath();\n g.ctx.ellipse(cx, cy, rx, ry, 0, 0, 2 * Math.PI);\n\n shaftRegion.addEllipse(cx, cy, rx, ry, 0, 0, 2 * Math.PI);\n\n g.ctx.fillStyle = (booleanValue) ? this.onColor.toString() : this.offColor.toString();\n g.ctx.fill();\n if (this.effect3d) {\n const gradient = g.createLinearGradient(this.x + lg.x, this.y + lg.y, this.x + lg.width, this.y + lg.height);\n gradient.addColorStop(0, `rgba(0,0,0,${(booleanValue ? 5 : 10) / 255})`);\n gradient.addColorStop(1, `rgba(0,0,0,${(booleanValue ? 180 : 160) / 255})`);\n g.ctx.fillStyle = gradient;\n g.ctx.fill();\n }\n }\n\n get bit(): number { return this.properties.getValue(PROP_BIT); }\n get dataType(): number { return this.properties.getValue(PROP_DATA_TYPE); }\n get toggleButton(): boolean { return this.properties.getValue(PROP_TOGGLE_BUTTON); }\n get pushActionIndex(): number { return this.properties.getValue(PROP_PUSH_ACTION_INDEX); }\n get releaseActionIndex(): number { return this.properties.getValue(PROP_RELEASE_ACTION_INDEX); }\n get effect3d(): boolean { return this.properties.getValue(PROP_EFFECT_3D); }\n get onColor(): Color { return this.properties.getValue(PROP_ON_COLOR); }\n get onLabel(): string { return this.properties.getValue(PROP_ON_LABEL); }\n get onState(): string { return this.properties.getValue(PROP_ON_STATE); }\n get offColor(): Color { return this.properties.getValue(PROP_OFF_COLOR); }\n get offLabel(): string { return this.properties.getValue(PROP_OFF_LABEL); }\n get offState(): string { return this.properties.getValue(PROP_OFF_STATE); }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics, Path } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { Bounds } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FontProperty, IntProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_BIT = 'bit';\nconst PROP_ENABLED = 'enabled';\nconst PROP_FONT = 'font';\nconst PROP_LABEL = 'label';\nconst PROP_SELECTED_COLOR = 'selected_color';\n\nconst BOX_SIZE = 16;\nconst BOX_BORDER_COLOR = new Color(130, 130, 130);\nconst BOX_BACKGROUND_MIX_COLOR = new Color(94, 151, 230);\nconst GAP = 4;\n\nexport class CheckBox extends Widget {\n\n private hovered = false;\n private manualToggleState = false; // Without PV\n\n private areaRegion?: HitRegionSpecification;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new IntProperty(PROP_BIT));\n this.properties.add(new BooleanProperty(PROP_ENABLED));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new StringProperty(PROP_LABEL));\n this.properties.add(new ColorProperty(PROP_SELECTED_COLOR, new Color(64, 64, 64)));\n }\n\n init() {\n this.areaRegion = {\n id: `${this.wuid}-area`,\n mouseDown: () => {\n this.booleanValue ? this.toggleOff() : this.toggleOn();\n this.requestRepaint();\n },\n mouseEnter: () => {\n this.hovered = true;\n this.requestRepaint();\n },\n mouseOut: () => {\n this.hovered = false;\n this.requestRepaint();\n },\n tooltip: () => this.tooltip,\n cursor: 'pointer'\n };\n }\n\n private toggleOn() {\n this.manualToggleState = true;\n if (this.pv && this.pv.writable) {\n if (this.bit < 0) {\n this.display.pvEngine.setValue(new Date(), this.pv.name, 1);\n } else {\n const value = this.pv.value | (1 << this.bit);\n this.display.pvEngine.setValue(new Date(), this.pv.name, value);\n }\n }\n }\n\n private toggleOff() {\n this.manualToggleState = false;\n if (this.pv && this.pv.writable) {\n if (this.bit < 0) {\n this.display.pvEngine.setValue(new Date(), this.pv.name, 0);\n } else {\n const value = this.pv.value & ~(1 << this.bit);\n this.display.pvEngine.setValue(new Date(), this.pv.name, value);\n }\n }\n }\n\n get booleanValue() {\n if (this.pv && this.pv.value !== undefined) {\n if (this.bit < 0) {\n return Boolean(this.pv?.toNumber());\n } else {\n return ((this.pv?.value >> this.bit) & 1) > 0;\n }\n } else {\n return this.manualToggleState;\n }\n }\n\n draw(g: Graphics) {\n const area = g.addHitRegion(this.areaRegion!);\n area.addRect(this.x, this.y, this.width, this.height);\n\n const toggled = this.booleanValue;\n const { boxSize, gap, scale } = this;\n\n let backgroundColor = this.backgroundColor;\n if (this.hovered) {\n backgroundColor = backgroundColor.mixWith(BOX_BACKGROUND_MIX_COLOR, 0.7);\n }\n\n const box: Bounds = {\n x: this.x,\n y: this.y + (this.height / 2) - (boxSize / 2),\n width: boxSize,\n height: boxSize,\n };\n const gradient = g.createLinearGradient(box.x, box.y + (1 * scale), box.x, box.y + box.height);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, backgroundColor.toString());\n g.fillRect({\n ...box,\n rx: 2 * scale,\n ry: 2 * scale,\n gradient,\n });\n g.strokeRect({\n x: box.x + (0.5 * scale),\n y: box.y + (0.5 * scale),\n width: box.width - (1 * scale),\n height: box.height - (1 * scale),\n rx: 2 * scale,\n ry: 2 * scale,\n color: BOX_BORDER_COLOR,\n });\n\n if (toggled) {\n g.strokePath({\n lineWidth: 3 * scale,\n color: this.selectedColor,\n path: new Path(box.x + (3 * scale), box.y + Math.floor(boxSize * 0.45))\n .lineTo(box.x + Math.floor(boxSize * 0.45), box.y + boxSize * 3 / 4 - (1 * scale))\n .lineTo(box.x + boxSize - (2 * scale), box.y + (3 * scale))\n });\n }\n\n if (this.enabled) {\n g.fillText({\n x: box.x + box.width + gap,\n y: box.y + box.height / 2,\n align: 'left',\n baseline: 'middle',\n color: this.foregroundColor,\n font: this.font,\n text: this.label,\n });\n } else {\n g.fillText({\n x: box.x + box.width + gap + (1 * scale),\n y: box.y + box.height / 2 + (1 * scale),\n align: 'left',\n baseline: 'middle',\n color: Color.BUTTON_LIGHTEST,\n font: this.font,\n text: this.label,\n });\n g.fillText({\n x: box.x + box.width + gap,\n y: box.y + box.height / 2,\n align: 'left',\n baseline: 'middle',\n color: Color.BUTTON_DARKER,\n font: this.font,\n text: this.label,\n });\n }\n }\n\n get boxSize() {\n return this.scale * BOX_SIZE;\n }\n\n get gap() {\n return this.scale * GAP;\n }\n\n get bit(): number { return this.properties.getValue(PROP_BIT); }\n get enabled(): boolean { return this.properties.getValue(PROP_ENABLED); }\n get selectedColor(): Color { return this.properties.getValue(PROP_SELECTED_COLOR); }\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n get label(): string { return this.properties.getValue(PROP_LABEL); }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics, Path } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { Bounds } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FontProperty, StringListProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_ENABLED = 'enabled';\nconst PROP_FONT = 'font';\nconst PROP_HORIZONTAL = 'horizontal';\nconst PROP_ITEMS = 'items';\nconst PROP_ITEMS_FROM_PV = 'items_from_pv';\nconst PROP_SELECTED_COLOR = 'selected_color';\n\nexport class ChoiceButton extends Widget {\n\n private pushedItem?: number;\n\n private itemRegions: HitRegionSpecification[] = [];\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new BooleanProperty(PROP_ENABLED));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new BooleanProperty(PROP_HORIZONTAL));\n this.properties.add(new StringListProperty(PROP_ITEMS, []));\n this.properties.add(new BooleanProperty(PROP_ITEMS_FROM_PV));\n this.properties.add(new ColorProperty(PROP_SELECTED_COLOR));\n }\n\n init() {\n for (let i = 0; i < this.items.length; i++) {\n this.itemRegions.push({\n id: `${this.wuid}-item-${i}`,\n cursor: 'pointer',\n mouseDown: () => {\n this.pushedItem = i;\n this.requestRepaint();\n },\n mouseOut: () => {\n this.pushedItem = undefined;\n this.requestRepaint();\n },\n mouseUp: () => {\n this.pushedItem = undefined;\n this.requestRepaint();\n },\n click: () => {\n this.writeValue(this.items[i]);\n this.requestRepaint();\n },\n tooltip: () => this.tooltip,\n });\n }\n }\n\n draw(g: Graphics) {\n if (this.horizontal) {\n this.drawHorizontal(g);\n } else {\n this.drawVertical(g);\n }\n }\n\n private drawHorizontal(g: Graphics) {\n const avgWidth = this.area.width / this.items.length;\n let startX = this.area.x;\n for (let i = 0; i < this.items.length; i++) {\n const buttonBounds: Bounds = {\n x: startX,\n y: this.area.y,\n width: avgWidth,\n height: this.area.height,\n };\n startX += avgWidth;\n this.drawButton(g, buttonBounds, i);\n }\n }\n\n private drawVertical(g: Graphics) {\n const avgHeight = this.area.height / this.items.length;\n let startY = this.area.y;\n for (let i = 0; i < this.items.length; i++) {\n const buttonBounds: Bounds = {\n x: Math.round(this.area.x),\n y: Math.round(startY),\n width: Math.round(this.area.width),\n height: Math.round(avgHeight),\n };\n startY += avgHeight;\n this.drawButton(g, buttonBounds, i);\n }\n }\n\n private drawButton(g: Graphics, area: Bounds, itemIndex: number) {\n const selected = this.pv?.value === this.items[itemIndex];\n const pushed = selected || itemIndex === this.pushedItem;\n g.fillRect({\n ...area,\n color: selected ? this.selectedColor : this.backgroundColor,\n });\n\n const hitRegion = g.addHitRegion(this.itemRegions[itemIndex]);\n hitRegion.addRect(area.x, area.y, area.width, area.height);\n\n const lineWidth = 1 * this.scale;\n const top = area.y + (lineWidth / 2);\n const left = area.x + (lineWidth / 2);\n const bottom = area.y + area.height - lineWidth + (lineWidth / 2);\n const right = area.x + area.width - lineWidth + (lineWidth / 2);\n\n g.strokePath({\n lineWidth,\n color: pushed ? Color.BUTTON_LIGHTEST : Color.BLACK,\n path: new Path(right, bottom)\n .lineTo(right, top)\n .moveTo(right, bottom)\n .lineTo(left, bottom),\n });\n\n g.strokePath({\n lineWidth,\n color: pushed ? this.backgroundColor : Color.BUTTON_DARKER,\n path: new Path(right - lineWidth, bottom - lineWidth)\n .lineTo(right - lineWidth, top + lineWidth)\n .moveTo(right - lineWidth, bottom - lineWidth)\n .lineTo(left + lineWidth, bottom - lineWidth),\n });\n\n g.strokePath({\n lineWidth,\n color: pushed ? Color.BLACK : Color.BUTTON_LIGHTEST,\n path: new Path(left, top)\n .lineTo(right - lineWidth, top)\n .moveTo(left, top)\n .lineTo(left, bottom - lineWidth),\n });\n\n g.strokePath({\n lineWidth,\n color: pushed ? Color.BUTTON_DARKER : this.backgroundColor,\n path: new Path(left + lineWidth, top + lineWidth)\n .lineTo(right - lineWidth - lineWidth, top + lineWidth)\n .moveTo(left + lineWidth, top + lineWidth)\n .lineTo(left + lineWidth, bottom - lineWidth - lineWidth),\n });\n\n g.fillText({\n x: area.x + (area.width / 2),\n y: area.y + (area.height / 2),\n text: this.items[itemIndex],\n align: 'center',\n baseline: 'middle',\n color: this.foregroundColor,\n font: this.font,\n });\n }\n\n private writeValue(item: string) {\n if (this.pv && this.pv.writable) {\n this.display.pvEngine.setValue(new Date(), this.pv.name, item);\n }\n }\n\n get enabled(): boolean { return this.properties.getValue(PROP_ENABLED); }\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n get horizontal(): boolean { return this.properties.getValue(PROP_HORIZONTAL); }\n get items(): string[] { return this.properties.getValue(PROP_ITEMS); }\n get itemsFromPV(): boolean { return this.properties.getValue(PROP_ITEMS_FROM_PV); }\n get selectedColor(): Color { return this.properties.getValue(PROP_SELECTED_COLOR); }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics, Path } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { Point, shrink } from '../../positioning';\nimport { BooleanProperty, FontProperty, StringListProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_ENABLED = 'enabled';\nconst PROP_FONT = 'font';\nconst PROP_ITEMS = 'items';\nconst PROP_ITEMS_FROM_PV = 'items_from_pv';\n\nconst SELECTOR_WIDTH = 8;\n\nconst BORDER_COLOR = new Color(0, 0, 0, 0.1);\n\nexport class Combo extends Widget {\n\n private areaRegion?: HitRegionSpecification;\n private selectEl?: HTMLSelectElement;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new BooleanProperty(PROP_ENABLED));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new StringListProperty(PROP_ITEMS, []));\n this.properties.add(new BooleanProperty(PROP_ITEMS_FROM_PV));\n }\n\n init() {\n this.areaRegion = {\n id: `${this.wuid}-area`,\n tooltip: () => this.tooltip,\n };\n\n this.selectEl = document.createElement('select');\n this.selectEl.style.display = 'block';\n this.selectEl.style.position = 'absolute';\n this.selectEl.style.boxSizing = 'border-box';\n\n // Hide the select, but allow it still to be 'clickable', so\n // that the browser will display the option menu upon widget click.\n this.selectEl.style.opacity = '0';\n\n this.selectEl.addEventListener('change', () => {\n this.writeValue(this.selectEl?.value ?? '');\n });\n\n const emptyOptionEl = document.createElement('option');\n emptyOptionEl.disabled = true;\n emptyOptionEl.value = '';\n emptyOptionEl.defaultSelected = true;\n emptyOptionEl.text = ' -- select an option -- ';\n this.selectEl.add(emptyOptionEl);\n\n for (let i = 0; i < this.items.length; i++) {\n const optionEl = document.createElement('option');\n optionEl.value = this.items[i];\n optionEl.text = this.items[i];\n this.selectEl.add(optionEl);\n }\n\n this.display.rootPanel.appendChild(this.selectEl);\n }\n\n draw(g: Graphics) {\n let bounds = this.display.measureAbsoluteArea(this);\n\n this.selectEl!.style.display = 'block';\n this.selectEl!.style.left = `${bounds.x}px`;\n this.selectEl!.style.top = `${bounds.y}px`;\n this.selectEl!.style.width = `${bounds.width}px`;\n this.selectEl!.style.height = `${bounds.height}px`;\n\n bounds = shrink(this.bounds, 2 * this.scale);\n g.fillRect({\n ...bounds,\n color: this.backgroundColor,\n });\n g.strokeRect({\n ...bounds,\n color: BORDER_COLOR,\n crispen: true,\n });\n\n const area = g.addHitRegion(this.areaRegion!);\n area.addRect(bounds.x, bounds.y, bounds.width, bounds.height);\n\n if (this.pv?.value && this.items.indexOf(this.pv.value) !== -1) {\n g.fillText({\n x: (5 * this.scale) + bounds.x,\n y: bounds.y + (bounds.height / 2),\n align: 'left',\n baseline: 'middle',\n color: this.foregroundColor,\n font: this.font,\n text: this.pv?.value,\n });\n }\n\n const { selectorWidth } = this;\n const size = Math.min(bounds.height, selectorWidth / 2);\n const head: Point = {\n x: bounds.x + bounds.width - selectorWidth - (5 * this.scale) + (selectorWidth / 2),\n y: bounds.y + ((bounds.height - size) / 2) + size,\n };\n g.fillPath({\n color: this.foregroundColor,\n path: new Path(head.x, head.y)\n .lineTo(head.x - size, head.y - size)\n .lineTo(head.x + size, head.y - size)\n .closePath(),\n });\n }\n\n private writeValue(item: string) {\n if (this.pv && this.pv.writable) {\n this.display.pvEngine.setValue(new Date(), this.pv.name, item);\n }\n }\n\n hide() {\n if (this.selectEl) {\n this.selectEl.style.display = 'none';\n }\n }\n\n destroy() {\n if (this.selectEl) {\n this.display.rootPanel.removeChild(this.selectEl);\n this.selectEl = undefined;\n }\n }\n\n get selectorWidth() {\n return this.scale * SELECTOR_WIDTH;\n }\n\n get enabled(): boolean { return this.properties.getValue(PROP_ENABLED); }\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n get items(): string[] { return this.properties.getValue(PROP_ITEMS); }\n get itemsFromPV(): boolean { return this.properties.getValue(PROP_ITEMS_FROM_PV); }\n}\n","import { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { shrink } from '../../positioning';\nimport { BooleanProperty, FontProperty, IntProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_BIT = 'bit';\nconst PROP_DATA_TYPE = 'data_type';\nconst PROP_EFFECT_3D = 'effect_3d';\nconst PROP_FONT = 'font';\nconst PROP_OFF_IMAGE = 'off_image';\nconst PROP_OFF_LABEL = 'off_label';\nconst PROP_OFF_STATE = 'off_state';\nconst PROP_ON_IMAGE = 'on_image';\nconst PROP_ON_LABEL = 'on_label';\nconst PROP_ON_STATE = 'on_state';\nconst PROP_PUSH_ACTION_INDEX = 'push_action_index';\nconst PROP_RELEASE_ACTION_INDEX = 'released_action_index'; // with 'd'\nconst PROP_SHOW_BOOLEAN_LABEL = 'show_boolean_label';\nconst PROP_TOGGLE_BUTTON = 'toggle_button';\n\nexport class ImageBooleanButton extends Widget {\n\n private onImageElement?: HTMLImageElement;\n private onImageLoaded = false;\n\n private offImageElement?: HTMLImageElement;\n private offImageLoaded = false;\n\n private manualToggleState = false; // Without PV\n\n private areaRegion?: HitRegionSpecification;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new IntProperty(PROP_BIT));\n this.properties.add(new IntProperty(PROP_DATA_TYPE));\n this.properties.add(new BooleanProperty(PROP_EFFECT_3D));\n this.properties.add(new StringProperty(PROP_ON_IMAGE));\n this.properties.add(new StringProperty(PROP_ON_LABEL));\n this.properties.add(new StringProperty(PROP_ON_STATE));\n this.properties.add(new StringProperty(PROP_OFF_IMAGE));\n this.properties.add(new StringProperty(PROP_OFF_LABEL));\n this.properties.add(new StringProperty(PROP_OFF_STATE));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new BooleanProperty(PROP_TOGGLE_BUTTON));\n this.properties.add(new IntProperty(PROP_PUSH_ACTION_INDEX));\n this.properties.add(new IntProperty(PROP_RELEASE_ACTION_INDEX));\n this.properties.add(new BooleanProperty(PROP_SHOW_BOOLEAN_LABEL));\n }\n\n init() {\n this.onImageElement = new Image();\n this.onImageElement.onload = () => {\n this.onImageLoaded = true;\n this.requestRepaint();\n };\n this.offImageElement = new Image();\n this.offImageElement.onload = () => {\n this.offImageLoaded = true;\n this.requestRepaint();\n };\n\n if (this.onImage) {\n this.onImageElement.src = this.resolvePath(this.onImage);\n }\n if (this.offImage) {\n this.offImageElement.src = this.resolvePath(this.offImage);\n }\n\n this.areaRegion = {\n id: `${this.wuid}-area`,\n mouseDown: () => {\n if (this.toggleButton) {\n this.booleanValue ? this.toggleOff() : this.toggleOn();\n } else {\n this.toggleOn();\n }\n this.requestRepaint();\n },\n mouseUp: () => {\n if (this.booleanValue && !this.toggleButton) {\n this.toggleOff();\n this.requestRepaint();\n }\n },\n mouseOut: () => {\n if (this.booleanValue && !this.toggleButton) {\n this.toggleOff();\n this.requestRepaint();\n }\n },\n tooltip: () => this.tooltip,\n cursor: 'pointer'\n };\n }\n\n private toggleOn() {\n this.manualToggleState = true;\n if (this.pv && this.pv.writable) {\n if (this.dataType === 0) { // Bit\n if (this.bit < 0) {\n this.display.pvEngine.setValue(new Date(), this.pv.name, 1);\n } else {\n const value = this.pv.value | (1 << this.bit);\n this.display.pvEngine.setValue(new Date(), this.pv.name, value);\n }\n } else {\n this.display.pvEngine.setValue(new Date(), this.pv.name, this.onState);\n }\n }\n this.executeAction(this.pushActionIndex);\n }\n\n private toggleOff() {\n this.manualToggleState = false;\n if (this.pv && this.pv.writable) {\n if (this.dataType === 0) { // Bit\n if (this.bit < 0) {\n this.display.pvEngine.setValue(new Date(), this.pv.name, 0);\n } else {\n const value = this.pv.value & ~(1 << this.bit);\n this.display.pvEngine.setValue(new Date(), this.pv.name, value);\n }\n } else {\n this.display.pvEngine.setValue(new Date(), this.pv.name, this.offState);\n }\n }\n if (this.releaseActionIndex !== undefined) {\n this.executeAction(this.releaseActionIndex);\n }\n }\n\n get booleanValue() {\n if (this.pv && this.pv.value !== undefined) {\n if (this.dataType === 0) { // Bit\n if (this.bit < 0) {\n return Boolean(this.pv?.toNumber());\n } else {\n return ((this.pv?.value >> this.bit) & 1) > 0;\n }\n } else if (this.dataType === 1) { // Enum\n return this.pv.toString() === this.onState;\n } else {\n return false;\n }\n } else {\n return this.manualToggleState;\n }\n }\n\n draw(g: Graphics) {\n let bounds = this.bounds;\n if (this.borderAlarmSensitive) {\n bounds = shrink(bounds, 2 * this.scale, 2 * this.scale);\n }\n\n const toggled = this.booleanValue;\n if (toggled) {\n if (this.onImageLoaded) {\n g.ctx.drawImage(this.onImageElement!, bounds.x, bounds.y, bounds.width, bounds.height);\n }\n } else {\n if (this.offImageLoaded) {\n g.ctx.drawImage(this.offImageElement!, bounds.x, bounds.y, bounds.width, bounds.height);\n }\n }\n\n const area = g.addHitRegion(this.areaRegion!);\n area.addRect(bounds.x, bounds.y, bounds.width, bounds.height);\n\n if (this.showBooleanLabel) {\n g.fillText({\n x: this.x + (this.width / 2),\n y: this.y + (this.height / 2),\n font: this.font,\n color: this.foregroundColor,\n align: 'center',\n baseline: 'middle',\n text: toggled ? this.onLabel : this.offLabel,\n });\n }\n }\n\n get bit(): number { return this.properties.getValue(PROP_BIT); }\n get dataType(): number { return this.properties.getValue(PROP_DATA_TYPE); }\n get toggleButton(): boolean { return this.properties.getValue(PROP_TOGGLE_BUTTON); }\n get pushActionIndex(): number { return this.properties.getValue(PROP_PUSH_ACTION_INDEX); }\n get releaseActionIndex(): number { return this.properties.getValue(PROP_RELEASE_ACTION_INDEX); }\n get showBooleanLabel(): boolean { return this.properties.getValue(PROP_SHOW_BOOLEAN_LABEL); }\n get effect3d(): boolean { return this.properties.getValue(PROP_EFFECT_3D); }\n get onImage(): string { return this.properties.getValue(PROP_ON_IMAGE); }\n get onLabel(): string { return this.properties.getValue(PROP_ON_LABEL); }\n get onState(): string { return this.properties.getValue(PROP_ON_STATE); }\n get offImage(): string { return this.properties.getValue(PROP_OFF_IMAGE); }\n get offLabel(): string { return this.properties.getValue(PROP_OFF_LABEL); }\n get offState(): string { return this.properties.getValue(PROP_OFF_STATE); }\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { FontProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_FONT = 'font';\nconst PROP_LABEL = 'label';\n\nexport class MenuButton extends Widget {\n\n private areaRegion?: HitRegionSpecification;\n private selectEl?: HTMLSelectElement;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new StringProperty(PROP_LABEL));\n }\n\n init() {\n this.areaRegion = {\n id: `${this.wuid}-area`,\n tooltip: () => this.tooltip,\n cursor: 'pointer'\n };\n\n this.selectEl = document.createElement('select');\n this.selectEl.style.display = 'block';\n this.selectEl.style.position = 'absolute';\n this.selectEl.style.boxSizing = 'border-box';\n\n // Hide the select, but allow it still to be 'clickable', so\n // that the browser will display the option menu upon widget click.\n this.selectEl.style.opacity = '0';\n\n this.selectEl.addEventListener('change', evt => {\n const value = this.selectEl?.value;\n if (value) {\n // Avoid checkbox moving\n this.selectEl!.selectedIndex = 0;\n const idx = Number(value.substring('action-'.length));\n this.executeAction(idx);\n }\n });\n\n const emptyOptionEl = document.createElement('option');\n emptyOptionEl.disabled = true;\n emptyOptionEl.value = '';\n emptyOptionEl.defaultSelected = true;\n emptyOptionEl.text = ' -- select an option -- ';\n this.selectEl.add(emptyOptionEl);\n\n const actions = this.actions.actions;\n for (let i = 0; i < actions.length; i++) {\n const optionEl = document.createElement('option');\n optionEl.value = `action-${i}`;\n optionEl.text = actions[i]?.toString() ?? '';\n this.selectEl.add(optionEl);\n }\n\n this.display.rootPanel.appendChild(this.selectEl);\n }\n\n draw(g: Graphics) {\n const bounds = this.display.measureAbsoluteArea(this);\n\n this.selectEl!.style.display = 'block';\n this.selectEl!.style.left = `${bounds.x}px`;\n this.selectEl!.style.top = `${bounds.y}px`;\n this.selectEl!.style.width = `${bounds.width}px`;\n this.selectEl!.style.height = `${bounds.height}px`;\n\n const ctx = g.ctx;\n\n g.fillRect({\n ...this.area,\n color: this.backgroundColor,\n });\n\n const hitRegion = g.addHitRegion(this.areaRegion!);\n hitRegion.addRect(this.x, this.y, this.width, this.height);\n\n const lines = this.label.split('\\n');\n\n ctx.fillStyle = this.foregroundColor.toString();\n ctx.font = this.font.getFontString();\n\n // Calculate available space in height and width\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n let x = this.x + (this.width / 2);\n let y = this.y + (this.height / 2);\n\n ctx.fillText(lines[0], x, y);\n }\n\n hide() {\n if (this.selectEl) {\n this.selectEl.style.display = 'none';\n }\n }\n\n destroy() {\n if (this.selectEl) {\n this.display.rootPanel.removeChild(this.selectEl);\n this.selectEl = undefined;\n }\n }\n\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n\n // Some widget instances don't seem to have this property and use a specific default.\n get backgroundColor(): Color {\n const prop = this.properties.getProperty('background_color');\n if (prop && prop.value !== Color.TRANSPARENT) {\n return prop.value;\n } else {\n return Color.BUTTON;\n }\n }\n\n get label(): string { return this.properties.getValue(PROP_LABEL); }\n}\n","import { ActionButton } from './ActionButton';\n\n/**\n * This widget only exists in old displays.\n * On desktops, it's supposed to use the \"native\" OS widgets.\n *\n * Treating it like a regular ActionButton is good enough for us.\n */\nexport class NativeButton extends ActionButton {\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { Bounds } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FontProperty, StringListProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_ENABLED = 'enabled';\nconst PROP_FONT = 'font';\nconst PROP_HORIZONTAL = 'horizontal';\nconst PROP_ITEMS = 'items';\nconst PROP_ITEMS_FROM_PV = 'items_from_pv';\nconst PROP_SELECTED_COLOR = 'selected_color';\n\nconst RADIO_RADIUS = 7;\nconst DOT_RADIUS = 2;\nconst GAP = 4;\nconst RADIO_BORDER_COLOR = new Color(120, 120, 120);\nconst HOVER_MIX_COLOR = new Color(94, 151, 230);\n\nexport class RadioBox extends Widget {\n\n private hoveredItem?: number;\n\n private itemRegions: HitRegionSpecification[] = [];\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new BooleanProperty(PROP_ENABLED));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new BooleanProperty(PROP_HORIZONTAL));\n this.properties.add(new StringListProperty(PROP_ITEMS, []));\n this.properties.add(new BooleanProperty(PROP_ITEMS_FROM_PV));\n this.properties.add(new ColorProperty(PROP_SELECTED_COLOR));\n }\n\n init() {\n for (let i = 0; i < this.items.length; i++) {\n this.itemRegions.push({\n id: `${this.wuid}-item-${i}`,\n cursor: 'pointer',\n click: () => {\n this.writeValue(this.items[i]);\n this.requestRepaint();\n },\n mouseEnter: () => {\n this.hoveredItem = i;\n this.requestRepaint();\n },\n mouseOut: () => {\n this.hoveredItem = undefined;\n this.requestRepaint();\n },\n tooltip: () => this.tooltip,\n });\n }\n }\n\n draw(g: Graphics) {\n if (this.horizontal) {\n this.drawHorizontal(g);\n } else {\n this.drawVertical(g);\n }\n }\n\n private drawHorizontal(g: Graphics) {\n const avgWidth = this.area.width / this.items.length;\n let startX = this.area.x;\n for (let i = 0; i < this.items.length; i++) {\n const radioBounds: Bounds = {\n x: startX,\n y: this.area.y,\n width: avgWidth,\n height: this.area.height,\n };\n startX += avgWidth;\n this.drawRadio(g, radioBounds, i);\n }\n }\n\n private drawVertical(g: Graphics) {\n const avgHeight = this.area.height / this.items.length;\n let startY = this.area.y;\n for (let i = 0; i < this.items.length; i++) {\n const radioBounds: Bounds = {\n x: this.area.x,\n y: startY,\n width: this.area.width,\n height: avgHeight,\n };\n startY += avgHeight;\n this.drawRadio(g, radioBounds, i);\n }\n }\n\n private drawRadio(g: Graphics, area: Bounds, itemIndex: number) {\n const { radioRadius, dotRadius, gap } = this;\n let backgroundColor = this.backgroundColor;\n if (itemIndex === this.hoveredItem) {\n backgroundColor = backgroundColor.mixWith(HOVER_MIX_COLOR, 0.7);\n }\n\n const gradient = g.createLinearGradient(area.x, area.y, area.x + area.width, area.y + area.height);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, backgroundColor.toString());\n g.fillEllipse({\n cx: area.x + radioRadius,\n cy: area.y + (area.height / 2),\n rx: radioRadius,\n ry: radioRadius,\n gradient,\n });\n\n const lineWidth = 1 * this.scale;\n g.strokeEllipse({\n cx: area.x + radioRadius,\n cy: area.y + (area.height / 2),\n rx: radioRadius,\n ry: radioRadius,\n color: RADIO_BORDER_COLOR,\n lineWidth,\n });\n\n if (this.pv?.value === this.items[itemIndex]) {\n g.fillEllipse({\n cx: area.x + radioRadius,\n cy: area.y + (area.height / 2),\n rx: dotRadius + (lineWidth / 2),\n ry: dotRadius + (lineWidth / 2),\n color: this.selectedColor,\n });\n }\n\n const hitArea = g.addHitRegion(this.itemRegions[itemIndex]);\n hitArea.addRect(area.x, area.y, area.width, area.height);\n\n g.fillText({\n x: area.x + radioRadius + radioRadius + gap,\n y: area.y + (area.height / 2),\n text: this.items[itemIndex],\n align: 'left',\n baseline: 'middle',\n color: this.foregroundColor,\n font: this.font,\n });\n }\n\n private writeValue(item: string) {\n if (this.pv && this.pv.writable) {\n this.display.pvEngine.setValue(new Date(), this.pv.name, item);\n }\n }\n\n get radioRadius() {\n return this.scale * RADIO_RADIUS;\n }\n\n get dotRadius() {\n return this.scale * DOT_RADIUS;\n }\n\n get gap() {\n return this.scale * GAP;\n }\n\n get enabled(): boolean { return this.properties.getValue(PROP_ENABLED); }\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n get horizontal(): boolean { return this.properties.getValue(PROP_HORIZONTAL); }\n get items(): string[] { return this.properties.getValue(PROP_ITEMS); }\n get itemsFromPV(): boolean { return this.properties.getValue(PROP_ITEMS_FROM_PV); }\n get selectedColor(): Color { return this.properties.getValue(PROP_SELECTED_COLOR); }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics, Path } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { Bounds, Point, shrink } from '../../positioning';\nimport { BooleanProperty, FloatProperty, FontProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_ENABLED = 'enabled';\nconst PROP_FONT = 'font';\nconst PROP_MAXIMUM = 'maximum';\nconst PROP_MINIMUM = 'minimum';\nconst PROP_HORIZONTAL = 'horizontal';\nconst PROP_STEP_INCREMENT = 'step_increment';\nconst PROP_PAGE_INCREMENT = 'page_increment';\nconst PROP_BAR_LENGTH = 'bar_length';\nconst PROP_SHOW_VALUE_TIP = 'show_value_tip';\n\nconst BACKGROUND_COLOR = new Color(243, 243, 243);\nconst BUTTON_COLOR = new Color(232, 232, 231);\nconst REPEAT_INTERVAL = 150;\n\nexport class Scrollbar extends Widget {\n\n private decreaseRegion?: HitRegionSpecification;\n private decreasePressed = false;\n private increaseRegion?: HitRegionSpecification;\n private increasePressed = false;\n private pageDecreaseRegion?: HitRegionSpecification;\n private pageDecreasePressed = false;\n private pageIncreaseRegion?: HitRegionSpecification;\n private pageIncreasePressed = false;\n private thumbRegion?: HitRegionSpecification;\n\n // Value when a grab action is initiated\n private grabStartValue?: number;\n\n // Track width (excluding buttons and thumb)\n private dragRange?: number;\n\n private actionTimeout?: number;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new BooleanProperty(PROP_ENABLED));\n this.properties.add(new BooleanProperty(PROP_HORIZONTAL));\n this.properties.add(new BooleanProperty(PROP_SHOW_VALUE_TIP));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new FloatProperty(PROP_MAXIMUM));\n this.properties.add(new FloatProperty(PROP_MINIMUM));\n this.properties.add(new FloatProperty(PROP_STEP_INCREMENT));\n this.properties.add(new FloatProperty(PROP_PAGE_INCREMENT));\n this.properties.add(new FloatProperty(PROP_BAR_LENGTH));\n }\n\n init() {\n this.decreaseRegion = {\n id: `${this.wuid}-decrease`,\n mouseDown: () => {\n this.decreasePressed = true;\n this.stepDecreaseRepeatedly();\n },\n mouseUp: () => {\n window.clearTimeout(this.actionTimeout);\n this.decreasePressed = false;\n this.requestRepaint();\n },\n mouseOut: () => {\n window.clearTimeout(this.actionTimeout);\n this.decreasePressed = false;\n this.requestRepaint();\n },\n tooltip: () => this.tooltip,\n };\n this.increaseRegion = {\n id: `${this.wuid}-increase`,\n mouseDown: () => {\n this.increasePressed = true;\n this.stepIncreaseRepeatedly();\n },\n mouseUp: () => {\n window.clearTimeout(this.actionTimeout);\n this.increasePressed = false;\n this.requestRepaint();\n },\n mouseOut: () => {\n window.clearTimeout(this.actionTimeout);\n this.increasePressed = false;\n this.requestRepaint();\n },\n tooltip: () => this.tooltip,\n };\n this.thumbRegion = {\n id: `${this.wuid}-thumb`,\n mouseDown: () => {\n this.grabStartValue = this.getCoercedValue();\n },\n grab: (evt) => {\n const delta = this.horizontal ? evt.dx : evt.dy;\n const valueChange = (this.maximum - this.minimum) * delta / this.dragRange!;\n this.setCoercedValue(this.grabStartValue! + valueChange);\n this.requestRepaint();\n },\n tooltip: () => this.tooltip,\n };\n this.pageDecreaseRegion = {\n id: `${this.wuid}-page-decrease`,\n mouseDown: () => {\n this.pageDecreasePressed = true;\n this.pageDecreaseRepeatedly();\n },\n mouseUp: () => {\n window.clearTimeout(this.actionTimeout);\n this.pageDecreasePressed = false;\n this.requestRepaint();\n },\n mouseOut: () => {\n window.clearTimeout(this.actionTimeout);\n this.pageDecreasePressed = false;\n this.requestRepaint();\n },\n tooltip: () => this.tooltip,\n };\n this.pageIncreaseRegion = {\n id: `${this.wuid}-page-increase`,\n mouseDown: () => {\n this.pageIncreasePressed = true;\n this.pageIncreaseRepeatedly();\n },\n mouseUp: () => {\n window.clearTimeout(this.actionTimeout);\n this.pageIncreasePressed = false;\n this.requestRepaint();\n },\n mouseOut: () => {\n window.clearTimeout(this.actionTimeout);\n this.pageIncreasePressed = false;\n this.requestRepaint();\n },\n tooltip: () => this.tooltip,\n };\n }\n\n draw(g: Graphics) {\n if (this.horizontal) {\n this.drawHorizontal(g);\n } else {\n this.drawVertical(g);\n }\n }\n\n private drawHorizontal(g: Graphics) {\n const { scale } = this;\n const bounds = shrink(this.bounds, 2 * scale);\n g.fillRect({ ...bounds, color: BACKGROUND_COLOR });\n\n const buttonWidth = Math.min(bounds.height, bounds.width / 2);\n this.drawLeftButton(g, {\n x: bounds.x,\n y: bounds.y,\n width: buttonWidth,\n height: bounds.height,\n });\n this.drawRightButton(g, {\n x: bounds.x + bounds.width - buttonWidth,\n y: bounds.y,\n width: buttonWidth,\n height: bounds.height,\n });\n\n // Thumb\n const extent = this.barLength;\n const max = this.maximum + extent;\n const min = this.minimum;\n const totalRange = max - min;\n const valueRange = totalRange - extent;\n const trackWidth = bounds.width - buttonWidth - buttonWidth;\n const thumbWidth = Math.floor(Math.max(6 * scale, trackWidth * extent / totalRange));\n this.dragRange = trackWidth - thumbWidth;\n\n const currentValue = this.getCoercedValue();\n const leftTrackWidth = Math.floor((trackWidth - thumbWidth) * (currentValue - min) / valueRange);\n const rightTrackWidth = trackWidth - leftTrackWidth - thumbWidth;\n\n const thumbBounds: Bounds = {\n x: bounds.x + buttonWidth + leftTrackWidth,\n y: bounds.y,\n width: thumbWidth,\n height: bounds.height,\n };\n g.fillRect({ ...thumbBounds, color: BUTTON_COLOR });\n this.drawRaisedButtonBorder(g, thumbBounds);\n\n const area = g.addHitRegion(this.thumbRegion!);\n area.addRect(thumbBounds.x, thumbBounds.y, thumbBounds.width, thumbBounds.height);\n\n // Page decrease\n const pageDecreaseBounds: Bounds = {\n x: bounds.x + buttonWidth,\n y: bounds.y,\n width: leftTrackWidth,\n height: bounds.height,\n };\n const pageDecreaseArea = g.addHitRegion(this.pageDecreaseRegion!);\n pageDecreaseArea.addRect(pageDecreaseBounds.x, pageDecreaseBounds.y, pageDecreaseBounds.width, pageDecreaseBounds.height);\n if (this.pageDecreasePressed) {\n g.fillRect({ ...pageDecreaseBounds, color: Color.BLACK });\n }\n\n // Page increase\n const pageIncreaseBounds: Bounds = {\n x: bounds.x + buttonWidth + leftTrackWidth + thumbWidth,\n y: bounds.y,\n width: rightTrackWidth,\n height: bounds.height,\n };\n const pageIncreaseArea = g.addHitRegion(this.pageIncreaseRegion!);\n pageIncreaseArea.addRect(pageIncreaseBounds.x, pageIncreaseBounds.y, pageIncreaseBounds.width, pageIncreaseBounds.height);\n if (this.pageIncreasePressed) {\n g.fillRect({ ...pageIncreaseBounds, color: Color.BLACK });\n }\n }\n\n private drawVertical(g: Graphics) {\n const { scale } = this;\n const bounds = shrink(this.bounds, scale);\n g.fillRect({ ...bounds, color: BACKGROUND_COLOR });\n\n const buttonHeight = Math.min(bounds.width, bounds.height / 2);\n this.drawUpButton(g, {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: buttonHeight,\n });\n this.drawDownButton(g, {\n x: bounds.x,\n y: bounds.y + bounds.height - buttonHeight,\n width: bounds.width,\n height: buttonHeight,\n });\n\n // Thumb\n const extent = this.barLength;\n const max = this.maximum + extent;\n const min = this.minimum;\n const totalRange = max - min;\n const valueRange = totalRange - extent;\n const trackHeight = bounds.height - buttonHeight - buttonHeight;\n const thumbHeight = Math.floor(Math.max(6 * scale, trackHeight * extent / totalRange));\n this.dragRange = trackHeight - thumbHeight;\n\n const currentValue = this.getCoercedValue();\n const northTrackHeight = Math.floor((trackHeight - thumbHeight) * (currentValue - min) / valueRange);\n const southTrackHeight = trackHeight - northTrackHeight - thumbHeight;\n\n const thumbBounds: Bounds = {\n x: bounds.x,\n y: bounds.y + buttonHeight + northTrackHeight,\n width: bounds.width,\n height: thumbHeight,\n };\n g.fillRect({ ...thumbBounds, color: BUTTON_COLOR });\n this.drawRaisedButtonBorder(g, thumbBounds);\n\n const area = g.addHitRegion(this.thumbRegion!);\n area.addRect(thumbBounds.x, thumbBounds.y, thumbBounds.width, thumbBounds.height);\n\n // Page decrease\n const pageDecreaseBounds: Bounds = {\n x: bounds.x,\n y: bounds.y + buttonHeight,\n width: bounds.width,\n height: northTrackHeight,\n };\n const pageDecreaseArea = g.addHitRegion(this.pageDecreaseRegion!);\n pageDecreaseArea.addRect(pageDecreaseBounds.x, pageDecreaseBounds.y, pageDecreaseBounds.width, pageDecreaseBounds.height);\n if (this.pageDecreasePressed) {\n g.fillRect({ ...pageDecreaseBounds, color: Color.BLACK });\n }\n\n // Page increase\n const pageIncreaseBounds: Bounds = {\n x: bounds.x,\n y: bounds.y + buttonHeight + northTrackHeight + thumbHeight,\n width: bounds.width,\n height: southTrackHeight,\n };\n const pageIncreaseArea = g.addHitRegion(this.pageIncreaseRegion!);\n pageIncreaseArea.addRect(pageIncreaseBounds.x, pageIncreaseBounds.y, pageIncreaseBounds.width, pageIncreaseBounds.height);\n if (this.pageIncreasePressed) {\n g.fillRect({ ...pageIncreaseBounds, color: Color.BLACK });\n }\n }\n\n private drawLeftButton(g: Graphics, bounds: Bounds) {\n g.fillRect({ ...bounds, color: BUTTON_COLOR });\n this.decreasePressed ? this.drawPressedButtonBorder(g, bounds) : this.drawRaisedButtonBorder(g, bounds);\n\n const area = g.addHitRegion(this.decreaseRegion!);\n area.addRect(bounds.x, bounds.y, bounds.width, bounds.height);\n\n const triangleBounds = shrink(bounds, 3 * this.scale);\n let triangleSize = Math.min(triangleBounds.height / 2, triangleBounds.width);\n triangleBounds.x += (triangleBounds.width - triangleSize) / 2;\n triangleSize = Math.max(triangleSize, 1); // No negative\n\n const head: Point = { x: triangleBounds.x, y: triangleBounds.y + triangleBounds.height / 2 };\n g.fillPath({\n color: Color.BLACK,\n path: new Path(head.x, head.y)\n .lineTo(head.x + triangleSize, head.y - triangleSize)\n .lineTo(head.x + triangleSize, head.y + triangleSize)\n .closePath(),\n });\n }\n\n private drawRightButton(g: Graphics, bounds: Bounds) {\n g.fillRect({ ...bounds, color: BUTTON_COLOR });\n this.increasePressed ? this.drawPressedButtonBorder(g, bounds) : this.drawRaisedButtonBorder(g, bounds);\n\n const area = g.addHitRegion(this.increaseRegion!);\n area.addRect(bounds.x, bounds.y, bounds.width, bounds.height);\n\n const triangleBounds = shrink(bounds, 3 * this.scale);\n let triangleSize = Math.min(triangleBounds.height / 2, triangleBounds.width);\n triangleBounds.x += (triangleBounds.width - triangleSize) / 2;\n triangleSize = Math.max(triangleSize, 1); // No negative\n\n const head: Point = { x: triangleBounds.x + triangleSize, y: triangleBounds.y + triangleBounds.height / 2 };\n g.fillPath({\n color: Color.BLACK,\n path: new Path(head.x, head.y)\n .lineTo(head.x - triangleSize, head.y - triangleSize)\n .lineTo(head.x - triangleSize, head.y + triangleSize)\n .closePath(),\n });\n }\n\n private drawUpButton(g: Graphics, bounds: Bounds) {\n g.fillRect({ ...bounds, color: BUTTON_COLOR });\n this.decreasePressed ? this.drawPressedButtonBorder(g, bounds) : this.drawRaisedButtonBorder(g, bounds);\n\n const area = g.addHitRegion(this.decreaseRegion!);\n area.addRect(bounds.x, bounds.y, bounds.width, bounds.height);\n\n const triangleBounds = shrink(bounds, 3 * this.scale);\n let triangleSize = Math.min(triangleBounds.height, triangleBounds.width / 2);\n triangleBounds.y += (triangleBounds.height - triangleSize) / 2;\n triangleSize = Math.max(triangleSize, 1); // No negative\n\n const head: Point = { x: triangleBounds.x + triangleBounds.width / 2, y: triangleBounds.y };\n g.fillPath({\n color: Color.BLACK,\n path: new Path(head.x, head.y)\n .lineTo(head.x - triangleSize, head.y + triangleSize)\n .lineTo(head.x + triangleSize, head.y + triangleSize)\n .closePath(),\n });\n }\n\n private drawDownButton(g: Graphics, bounds: Bounds) {\n g.fillRect({ ...bounds, color: BUTTON_COLOR });\n this.increasePressed ? this.drawPressedButtonBorder(g, bounds) : this.drawRaisedButtonBorder(g, bounds);\n\n const area = g.addHitRegion(this.increaseRegion!);\n area.addRect(bounds.x, bounds.y, bounds.width, bounds.height);\n\n const triangleBounds = shrink(bounds, 3 * this.scale);\n let triangleSize = Math.min(triangleBounds.height, triangleBounds.width / 2);\n triangleBounds.y += (triangleBounds.height - triangleSize) / 2;\n triangleSize = Math.max(triangleSize, 1); // No negative\n\n const head: Point = { x: triangleBounds.x + triangleBounds.width / 2, y: triangleBounds.y + triangleSize };\n g.fillPath({\n color: Color.BLACK,\n path: new Path(head.x, head.y)\n .lineTo(head.x - triangleSize, head.y - triangleSize)\n .lineTo(head.x + triangleSize, head.y - triangleSize)\n .closePath(),\n });\n }\n\n private drawRaisedButtonBorder(g: Graphics, bounds: Bounds) {\n this.drawButtonBorder(g, bounds, Color.BUTTON_DARKEST, Color.BUTTON_DARKER,\n Color.BUTTON, Color.BUTTON_LIGHTEST);\n }\n\n private drawPressedButtonBorder(g: Graphics, bounds: Bounds) {\n this.drawButtonBorder(g, bounds, Color.BUTTON_LIGHTEST, Color.BUTTON_LIGHTEST,\n Color.BUTTON_DARKEST, Color.BUTTON_DARKER);\n }\n\n private drawButtonBorder(g: Graphics, bounds: Bounds, c1: Color, c2: Color, c3: Color, c4: Color) {\n const lineWidth = 1 * this.scale;\n const top = bounds.y + (lineWidth / 2);\n const left = bounds.x + (lineWidth / 2);\n const bottom = bounds.y + bounds.height - lineWidth + (lineWidth / 2);\n const right = bounds.x + bounds.width - lineWidth + (lineWidth / 2);\n g.strokePath({\n color: c1,\n path: new Path(right, bottom)\n .lineTo(right, top)\n .moveTo(right, bottom)\n .lineTo(left, bottom)\n });\n g.strokePath({\n color: c2,\n path: new Path(right - lineWidth, bottom - lineWidth)\n .lineTo(right - lineWidth, top + lineWidth)\n .moveTo(right - lineWidth, bottom - lineWidth)\n .lineTo(left + lineWidth, bottom - lineWidth)\n });\n g.strokePath({\n color: c3,\n path: new Path(left, top)\n .lineTo(right - lineWidth, top)\n .moveTo(left, top)\n .lineTo(left, bottom - lineWidth)\n });\n g.strokePath({\n color: c4,\n path: new Path(left + lineWidth, top + lineWidth)\n .lineTo(right - lineWidth - lineWidth, top + lineWidth)\n .moveTo(left + lineWidth, top + lineWidth)\n .lineTo(left + lineWidth, bottom - lineWidth - lineWidth)\n });\n }\n\n private stepIncreaseRepeatedly() {\n window.clearTimeout(this.actionTimeout);\n this.stepIncrease();\n this.requestRepaint();\n this.actionTimeout = window.setTimeout(() => this.stepIncreaseRepeatedly(), REPEAT_INTERVAL);\n }\n\n private stepDecreaseRepeatedly() {\n window.clearTimeout(this.actionTimeout);\n this.stepDecrease();\n this.requestRepaint();\n this.actionTimeout = window.setTimeout(() => this.stepDecreaseRepeatedly(), REPEAT_INTERVAL);\n }\n\n private stepIncrease() {\n const currentValue = this.pv?.value ?? (this.maximum - this.minimum) / 2;\n this.setCoercedValue(currentValue + this.stepIncrement);\n }\n\n private stepDecrease() {\n const currentValue = this.pv?.value ?? (this.maximum - this.minimum) / 2;\n this.setCoercedValue(currentValue - this.stepIncrement);\n }\n\n private pageIncreaseRepeatedly() {\n window.clearTimeout(this.actionTimeout);\n this.pageIncrease();\n this.requestRepaint();\n this.actionTimeout = window.setTimeout(() => this.pageIncreaseRepeatedly(), REPEAT_INTERVAL);\n }\n\n private pageDecreaseRepeatedly() {\n window.clearTimeout(this.actionTimeout);\n this.pageDecrease();\n this.requestRepaint();\n this.actionTimeout = window.setTimeout(() => this.pageDecreaseRepeatedly(), REPEAT_INTERVAL);\n }\n\n private pageIncrease() {\n const currentValue = this.pv?.value ?? (this.maximum - this.minimum) / 2;\n this.setCoercedValue(currentValue + this.pageIncrement);\n }\n\n private pageDecrease() {\n const currentValue = this.pv?.value ?? (this.maximum - this.minimum) / 2;\n this.setCoercedValue(currentValue - this.pageIncrement);\n }\n\n private setCoercedValue(value: number) {\n if (this.pv && this.pv.writable) {\n value = value < this.minimum ? this.minimum : (value > this.maximum ? this.maximum : value);\n this.display.pvEngine.setValue(new Date(), this.pv.name, value);\n }\n }\n\n private getCoercedValue() {\n const value = this.pv?.value ?? (this.maximum - this.minimum) / 2;\n return value < this.minimum ? this.minimum : (value > this.maximum ? this.maximum : value);\n }\n\n destroy() {\n window.clearTimeout(this.actionTimeout);\n }\n\n get enabled(): boolean { return this.properties.getValue(PROP_ENABLED); }\n get horizontal(): boolean { return this.properties.getValue(PROP_HORIZONTAL); }\n get showValueTip(): boolean { return this.properties.getValue(PROP_SHOW_VALUE_TIP); }\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n get minimum(): number { return this.properties.getValue(PROP_MINIMUM); }\n get maximum(): number { return this.properties.getValue(PROP_MAXIMUM); }\n get stepIncrement(): number { return this.properties.getValue(PROP_STEP_INCREMENT); }\n get pageIncrement(): number { return this.properties.getValue(PROP_PAGE_INCREMENT); }\n get barLength(): number { return this.properties.getValue(PROP_BAR_LENGTH); }\n}\n","import { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { BooleanProperty, FontProperty, IntProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_CONFIRM_MESSAGE = 'confirm_message';\nconst PROP_FONT = 'font';\nconst PROP_FORMAT_TYPE = 'format_type';\nconst PROP_HORIZONTAL_ALIGNMENT = 'horizontal_alignment';\nconst PROP_MULTILINE_INPUT = 'multiline_input';\nconst PROP_PASSWORD_INPUT = 'password_input';\nconst PROP_PRECISION = 'precision';\nconst PROP_PRECISION_FROM_PV = 'precision_from_pv';\nconst PROP_TEXT = 'text';\nconst PROP_VERTICAL_ALIGNMENT = 'vertical_alignment';\n\nexport class TextInput extends Widget {\n\n private areaRegion?: HitRegionSpecification;\n\n private inputEl?: HTMLInputElement | HTMLTextAreaElement;\n private editing = false;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new StringProperty(PROP_CONFIRM_MESSAGE));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new IntProperty(PROP_FORMAT_TYPE));\n this.properties.add(new IntProperty(PROP_HORIZONTAL_ALIGNMENT));\n this.properties.add(new BooleanProperty(PROP_MULTILINE_INPUT));\n this.properties.add(new BooleanProperty(PROP_PASSWORD_INPUT, false));\n this.properties.add(new IntProperty(PROP_PRECISION));\n this.properties.add(new BooleanProperty(PROP_PRECISION_FROM_PV));\n this.properties.add(new IntProperty(PROP_VERTICAL_ALIGNMENT, 1));\n }\n\n init() {\n if (this.text) {\n this.value = this.text;\n }\n this.areaRegion = {\n id: `${this.wuid}-area`,\n click: () => {\n if (this.pv && !this.pv.writable) {\n return;\n }\n this.editing = true;\n const bounds = this.display.measureAbsoluteArea(this);\n\n // Cover alarm-sensitive border\n bounds.x -= 2 * this.scale;\n bounds.y -= 2 * this.scale;\n bounds.width += 2 * this.scale;\n bounds.height += 2 * this.scale;\n this.inputEl!.value = this.pv?.value ?? this.value ?? '';\n this.inputEl!.style.display = 'block';\n this.inputEl!.style.position = 'absolute';\n this.inputEl!.style.boxSizing = 'border-box';\n this.inputEl!.style.left = `${bounds.x}px`;\n this.inputEl!.style.top = `${bounds.y}px`;\n this.inputEl!.style.width = `${bounds.width}px`;\n this.inputEl!.style.height = `${bounds.height}px`;\n this.inputEl!.autocomplete = 'off';\n if (this.multilineInput) {\n const multiInputEl = this.inputEl as HTMLTextAreaElement;\n multiInputEl.style.resize = 'none';\n } else {\n const singleInputEl = this.inputEl as HTMLInputElement;\n if (this.passwordInput) {\n singleInputEl.type = 'password';\n }\n }\n\n this.inputEl!.focus();\n this.inputEl!.select();\n },\n tooltip: () => this.tooltip,\n cursor: 'text',\n };\n\n this.inputEl = document.createElement(this.multilineInput ? 'textarea' : 'input');\n this.inputEl!.style.display = 'none';\n this.inputEl!.addEventListener('keyup', (evt: any) => {\n if (evt.key === 'Enter') {\n if (!this.multilineInput || evt.ctrlKey) { // Multiline input requires ctrl+key to confirm\n const value = this.inputEl?.value || '';\n if (!this.confirmMessage || confirm(this.confirmMessage)) {\n this.value = value;\n if (this.pv) {\n this.display.pvEngine.setValue(new Date(), this.pv.name, value);\n }\n this.inputEl!.style.display = 'none';\n this.editing = false;\n this.requestRepaint();\n } else {\n this.cancelInput();\n }\n }\n } else if (evt.key === 'Escape') {\n this.cancelInput();\n }\n });\n this.inputEl.addEventListener('blur', evt => {\n this.cancelInput();\n });\n this.display.rootPanel.appendChild(this.inputEl);\n }\n\n private cancelInput() {\n this.inputEl!.style.display = 'none';\n this.editing = false;\n this.requestRepaint();\n }\n\n draw(g: Graphics) {\n if (this.editing) {\n return;\n }\n\n const area = g.addHitRegion(this.areaRegion!);\n area.addRect(this.x, this.y, this.width, this.height);\n\n const ctx = g.ctx;\n if (!this.transparent) {\n g.fillRect({\n ... this.area,\n color: this.backgroundColor,\n });\n } else if (this.backgroundAlarmSensitive && this.alarm) {\n g.fillRect({\n ... this.area,\n color: this.alarmSensitiveBackgroundColor,\n });\n }\n\n // Draw text first to a temporary canvas, for clip reasons\n const tmpCanvas = document.createElement('canvas');\n tmpCanvas.width = this.area.width;\n tmpCanvas.height = this.area.height;\n const offscreenCtx = tmpCanvas.getContext('2d')!;\n\n offscreenCtx.fillStyle = this.alarmSensitiveForegroundColor.toString();\n offscreenCtx.font = this.font.getFontString();\n\n let x = this.x;\n if (this.horizAlignment === 0) { // LEFT\n offscreenCtx.textAlign = 'start';\n } else if (this.horizAlignment === 1) { // CENTER\n x += this.width / 2;\n offscreenCtx.textAlign = 'center';\n } else if (this.horizAlignment === 2) { // RIGHT\n x += this.width;\n offscreenCtx.textAlign = 'end';\n }\n\n let y = this.y;\n if (this.vertAlignment === 0) { // TOP\n offscreenCtx.textBaseline = 'top';\n } else if (this.vertAlignment === 1) { // MIDDLE\n y = y + (this.height / 2);\n offscreenCtx.textBaseline = 'middle';\n } else if (this.vertAlignment === 2) { // BOTTOM\n y = y + this.height;\n offscreenCtx.textBaseline = 'bottom';\n }\n\n let text = this.text;\n if (this.pv && this.pv.value !== undefined) {\n const precision = this.precisionFromPV ? this.pv.precision : this.precision;\n text = this.pv.formatValue(this.formatType, precision);\n }\n\n offscreenCtx.fillText(text, x - this.area.x, y - this.area.y);\n ctx.drawImage(tmpCanvas, this.area.x, this.area.y);\n }\n\n hide() {\n this.editing = false;\n if (this.inputEl) {\n this.inputEl.style.display = 'none';\n }\n }\n\n destroy() {\n if (this.inputEl) {\n this.display.rootPanel.removeChild(this.inputEl);\n this.inputEl = undefined;\n }\n }\n\n get value() {\n return this.text;\n }\n\n set value(value: any) {\n this.properties.setValue(PROP_TEXT, value);\n this.requestRepaint();\n }\n\n get confirmMessage(): string { return this.properties.getValue(PROP_CONFIRM_MESSAGE); }\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n get formatType(): number { return this.properties.getValue(PROP_FORMAT_TYPE); }\n get horizAlignment(): number { return this.properties.getValue(PROP_HORIZONTAL_ALIGNMENT); }\n get multilineInput(): boolean { return this.properties.getValue(PROP_MULTILINE_INPUT); }\n get passwordInput(): boolean { return this.properties.getValue(PROP_PASSWORD_INPUT); }\n get precision(): number { return this.properties.getValue(PROP_PRECISION); }\n get precisionFromPV(): boolean { return this.properties.getValue(PROP_PRECISION_FROM_PV); }\n get vertAlignment(): number { return this.properties.getValue(PROP_VERTICAL_ALIGNMENT); }\n}\n","import { Display } from '../../Display';\nimport { Graphics } from '../../Graphics';\nimport { toRadians } from '../../positioning';\nimport { BooleanProperty, IntProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_ALPHA = 'alpha';\nconst PROP_FILL = 'fill';\nconst PROP_LINE_WIDTH = 'line_width';\nconst PROP_LINE_STYLE = 'line_style';\nconst PROP_START_ANGLE = 'start_angle';\nconst PROP_TOTAL_ANGLE = 'total_angle';\n\nexport class Arc extends Widget {\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new IntProperty(PROP_ALPHA, 255));\n this.properties.add(new IntProperty(PROP_LINE_WIDTH));\n this.properties.add(new IntProperty(PROP_START_ANGLE));\n this.properties.add(new IntProperty(PROP_TOTAL_ANGLE));\n this.properties.add(new BooleanProperty(PROP_FILL));\n this.properties.add(new IntProperty(PROP_LINE_STYLE));\n }\n\n draw(g: Graphics) {\n g.ctx.globalAlpha = this.alpha / 255;\n this.drawShape(g);\n g.ctx.globalAlpha = 1;\n }\n\n private drawShape(g: Graphics) {\n const cx = this.x + (this.width / 2);\n const cy = this.y + (this.height / 2);\n const rx = this.width / 2;\n const ry = this.height / 2;\n\n const startAngle = -toRadians(this.startAngle);\n const endAngle = -toRadians(this.totalAngle + this.startAngle);\n\n if (this.fill) {\n // Path tricks to draw a wedge\n g.ctx.fillStyle = this.alarmSensitiveBackgroundColor.toString();\n g.ctx.beginPath();\n g.ctx.moveTo(cx, cy);\n g.ctx.ellipse(cx, cy, rx, ry, 0, startAngle, endAngle, true);\n g.ctx.closePath();\n g.ctx.fill();\n }\n\n if (this.lineWidth && this.totalAngle !== 0) {\n let dash;\n const { scale } = this;\n if (this.lineStyle === 0) { // Solid\n dash = [];\n } else if (this.lineStyle === 1) { // Dash\n dash = [6 * scale, 2 * scale];\n } else if (this.lineStyle === 2) { // Dot\n dash = [2 * scale, 2 * scale];\n } else {\n console.warn(`Unsupported arc line style ${this.lineStyle}`);\n }\n\n g.strokeEllipse({\n cx, cy, rx, ry, startAngle, endAngle,\n lineWidth: this.lineWidth,\n anticlockwise: true,\n color: this.alarmSensitiveForegroundColor,\n dash,\n });\n }\n }\n\n get alpha(): number { return this.properties.getValue(PROP_ALPHA); }\n get lineWidth(): number {\n return this.scale * this.properties.getValue(PROP_LINE_WIDTH);\n }\n get lineStyle(): number { return this.properties.getValue(PROP_LINE_STYLE); }\n get startAngle(): number { return this.properties.getValue(PROP_START_ANGLE); }\n get totalAngle(): number { return this.properties.getValue(PROP_TOTAL_ANGLE); }\n get fill(): boolean { return this.properties.getValue(PROP_FILL); }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Graphics } from '../../Graphics';\nimport { shrink } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FloatProperty, IntProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_ALPHA = 'alpha';\nconst PROP_BG_GRADIENT_COLOR = 'bg_gradient_color';\nconst PROP_FG_GRADIENT_COLOR = 'fg_gradient_color';\nconst PROP_FILL_LEVEL = 'fill_level';\nconst PROP_GRADIENT = 'gradient';\nconst PROP_HORIZONTAL_FILL = 'horizontal_fill';\nconst PROP_LINE_COLOR = 'line_color';\nconst PROP_LINE_WIDTH = 'line_width';\nconst PROP_LINE_STYLE = 'line_style';\n\nexport class Ellipse extends Widget {\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new IntProperty(PROP_ALPHA, 255));\n this.properties.add(new ColorProperty(PROP_BG_GRADIENT_COLOR));\n this.properties.add(new ColorProperty(PROP_FG_GRADIENT_COLOR));\n this.properties.add(new BooleanProperty(PROP_GRADIENT));\n this.properties.add(new IntProperty(PROP_LINE_WIDTH));\n this.properties.add(new FloatProperty(PROP_FILL_LEVEL));\n this.properties.add(new BooleanProperty(PROP_HORIZONTAL_FILL));\n this.properties.add(new ColorProperty(PROP_LINE_COLOR));\n this.properties.add(new IntProperty(PROP_LINE_STYLE));\n }\n\n draw(g: Graphics) {\n g.ctx.globalAlpha = this.alpha / 255;\n\n this.drawBackground(g);\n if (this.fillLevel) {\n this.drawFill(g);\n }\n\n g.ctx.globalAlpha = 1;\n }\n\n private drawBackground(g: Graphics) {\n const cx = this.x + (this.width / 2);\n const cy = this.y + (this.height / 2);\n const rx = this.width / 2;\n const ry = this.height / 2;\n\n if (!this.transparent) {\n const backgroundColor = this.alarmSensitiveBackgroundColor;\n if (this.gradient) {\n const x2 = this.horizontalFill ? this.x : this.x + this.width;\n const y2 = this.horizontalFill ? this.y + this.height : this.y;\n const gradient = g.createLinearGradient(this.x, this.y, x2, y2);\n gradient.addColorStop(0, this.backgroundGradientStartColor.toString());\n gradient.addColorStop(1, backgroundColor.toString());\n g.fillEllipse({ cx, cy, rx, ry, gradient });\n } else {\n g.fillEllipse({ cx, cy, rx, ry, color: backgroundColor });\n }\n }\n\n if (this.lineWidth) {\n if (this.lineStyle === 0) {\n g.strokeEllipse({\n cx, cy, rx, ry,\n color: this.lineColor,\n lineWidth: this.lineWidth,\n });\n } else if (this.lineStyle === 1) {\n g.strokeEllipse({\n cx, cy, rx, ry,\n color: this.lineColor,\n lineWidth: this.lineWidth,\n dash: [6 * this.scale, 2 * this.scale],\n });\n } else {\n console.warn(`Unsupported ellipse line style ${this.lineStyle}`);\n }\n }\n }\n\n private drawFill(g: Graphics) {\n const box = shrink(this, this.lineWidth);\n\n // Create a clip for the fill level\n g.ctx.save();\n if (this.horizontalFill) {\n const fillWidth = box.width * (this.fillLevel / 100);\n g.ctx.beginPath();\n g.ctx.rect(box.x, box.y, fillWidth, box.height);\n } else {\n const fillHeight = box.height * (this.fillLevel / 100);\n const fillY = box.y + box.height - fillHeight;\n g.ctx.beginPath();\n g.ctx.rect(box.x, fillY, box.width, box.height);\n }\n g.ctx.clip();\n\n // With clip active, draw the actual fill\n\n // Do not overlap shape border\n const cx = this.x + (this.width / 2);\n const cy = this.y + (this.height / 2);\n const rx = (this.width - this.lineWidth) / 2;\n const ry = (this.height - this.lineWidth) / 2;\n\n const foregroundColor = this.alarmSensitiveForegroundColor;\n if (this.gradient) {\n const x2 = this.horizontalFill ? this.x : this.x + this.width;\n const y2 = this.horizontalFill ? this.y + this.height : this.y;\n const gradient = g.createLinearGradient(this.x, this.y, x2, y2);\n gradient.addColorStop(0, this.foregroundGradientStartColor.toString());\n gradient.addColorStop(1, foregroundColor.toString());\n g.fillEllipse({ cx, cy, rx, ry, gradient });\n } else {\n g.fillEllipse({ cx, cy, rx, ry, color: foregroundColor });\n }\n\n // Reset clip\n g.ctx.restore();\n }\n\n get alpha(): number { return this.properties.getValue(PROP_ALPHA); }\n get lineWidth(): number {\n return this.scale * this.properties.getValue(PROP_LINE_WIDTH);\n }\n get fillLevel(): number { return this.properties.getValue(PROP_FILL_LEVEL); }\n get horizontalFill(): boolean { return this.properties.getValue(PROP_HORIZONTAL_FILL); }\n get lineColor(): Color { return this.properties.getValue(PROP_LINE_COLOR); }\n get lineStyle(): number { return this.properties.getValue(PROP_LINE_STYLE); }\n get gradient(): boolean { return this.properties.getValue(PROP_GRADIENT); }\n get backgroundGradientStartColor(): Color {\n return this.properties.getValue(PROP_BG_GRADIENT_COLOR);\n }\n get foregroundGradientStartColor(): Color {\n return this.properties.getValue(PROP_FG_GRADIENT_COLOR);\n }\n}\n","import { Display } from '../../Display';\nimport { Graphics } from '../../Graphics';\nimport { BooleanProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_IMAGE_FILE = 'image_file';\nconst PROP_NO_ANIMATION = 'no_animation';\nconst PROP_TRANSPARENCY = 'transparency';\n\nexport class ImageWidget extends Widget {\n\n private currentImageFile?: string;\n private imageElement?: HTMLImageElement;\n private imageSnapshot?: HTMLCanvasElement;\n private imageLoading = false;\n private imageLoaded = false;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new StringProperty(PROP_IMAGE_FILE));\n this.properties.add(new StringProperty(PROP_NO_ANIMATION));\n this.properties.add(new BooleanProperty(PROP_TRANSPARENCY, true));\n }\n\n init() {\n this.imageElement = new Image(this.width, this.height); // Using optional size for image\n this.imageElement.onload = () => {\n this.snapshotImage(this.imageElement!);\n this.imageLoading = false;\n this.imageLoaded = true;\n this.requestRepaint();\n };\n\n this.triggerImageLoad();\n }\n\n draw(g: Graphics) {\n if (this.imageFile && this.currentImageFile !== this.imageFile) {\n this.triggerImageLoad();\n }\n\n if (!this.transparency) {\n g.ctx.fillStyle = this.backgroundColor.toString();\n g.ctx.fillRect(this.x, this.y, this.width, this.height);\n }\n\n if (this.imageLoading && this.imageSnapshot) {\n // Draw the old image while a new one is still loading, this prevents\n // a flash between consecutive images.\n g.ctx.drawImage(this.imageSnapshot!, this.x, this.y, this.width, this.height);\n } else if (this.imageLoaded) {\n if (this.noAnimation) {\n g.ctx.drawImage(this.imageSnapshot!, this.x, this.y, this.width, this.height);\n } else {\n // Note that GIF animation through canvas does not seem to work in Chrome.\n // In Safari it is working.\n g.ctx.drawImage(this.imageElement!, this.x, this.y, this.width, this.height);\n }\n }\n }\n\n private triggerImageLoad() {\n this.imageLoading = true;\n this.imageLoaded = false;\n if (this.imageElement && this.imageFile) {\n this.currentImageFile = this.imageFile;\n this.imageElement.src = this.resolvePath(this.imageFile);\n }\n }\n\n // Used to \"stop\" the animation of animated gifs.\n private snapshotImage(image: HTMLImageElement) {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n canvas.width = image.naturalWidth;\n canvas.height = image.naturalHeight;\n ctx.drawImage(image, 0, 0);\n this.imageSnapshot = canvas;\n }\n\n get transparency(): boolean { return this.properties.getValue(PROP_TRANSPARENCY); }\n get imageFile(): string { return this.properties.getValue(PROP_IMAGE_FILE); }\n get noAnimation(): boolean { return this.properties.getValue(PROP_NO_ANIMATION); }\n}\n","import { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics } from '../../Graphics';\nimport { BooleanProperty, FontProperty, IntProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_FONT = 'font';\nconst PROP_HORIZONTAL_ALIGNMENT = 'horizontal_alignment';\nconst PROP_VERTICAL_ALIGNMENT = 'vertical_alignment';\nconst PROP_WRAP_WORDS = 'wrap_words';\n\nexport class Label extends Widget {\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new IntProperty(PROP_HORIZONTAL_ALIGNMENT));\n this.properties.add(new IntProperty(PROP_VERTICAL_ALIGNMENT));\n this.properties.add(new BooleanProperty(PROP_WRAP_WORDS));\n }\n\n draw(g: Graphics) {\n const ctx = g.ctx;\n if (!this.transparent) {\n g.fillRect({\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n color: this.backgroundColor,\n });\n }\n\n const lines = this.wrapText(g, this.text, this.width);\n\n ctx.fillStyle = this.foregroundColor.toString();\n ctx.font = this.font.getFontString();\n\n // Canvas does not do multiline string. So\n // we manually calculate each line position.\n ctx.textAlign = 'start';\n ctx.textBaseline = 'top';\n\n // TODO should horizontal center not be line by line?\n let maxWidth = 0;\n for (const line of lines) {\n const textWidth = ctx.measureText(line).width;\n maxWidth = Math.max(maxWidth, textWidth);\n }\n\n let x = this.x;\n if (this.horizAlignment === 1) { // CENTER\n x = this.x + (this.width - maxWidth) / 2;\n } else if (this.horizAlignment === 2) { // RIGHT\n x = this.x + (this.width - maxWidth);\n }\n\n const textHeight = lines.length * this.font.height\n + ((lines.length - 1) * this.font.height * 0.2);\n\n let y = this.y;\n if (this.vertAlignment === 1) { // MIDDLE\n y += ((this.height - textHeight) / 2);\n } else if (this.vertAlignment === 2) { // BOTTOM\n y += this.height - textHeight;\n }\n\n for (const line of lines) {\n ctx.fillText(line, x, y);\n y += this.font.height * 1.2; // Roughly\n }\n }\n\n private wrapText(g: Graphics, text: string, maxWidth: number) {\n let lines: string[] = [];\n for (const line of text.split('\\n')) {\n lines = lines.concat(this.wrapLine(g, line, maxWidth));\n }\n return lines;\n }\n\n private wrapLine(g: Graphics, text: string, maxWidth: number) {\n if (!text) {\n return [''];\n }\n const lines = [];\n let result;\n let i;\n let j;\n let width = 0;\n while (text.length) {\n for (i = text.length; g.measureText(text.substr(0, i), this.font).width > maxWidth; i--);\n\n result = text.substr(0, i);\n\n if (i !== text.length)\n for (j = 0; result.indexOf(' ', j) !== -1; j = result.indexOf(' ', j) + 1);\n\n lines.push(result.substr(0, j || result.length));\n width = Math.max(width, g.measureText(lines[lines.length - 1], this.font).width);\n text = text.substr(lines[lines.length - 1].length, text.length);\n }\n return lines;\n }\n\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n get horizAlignment(): number { return this.properties.getValue(PROP_HORIZONTAL_ALIGNMENT); }\n get vertAlignment(): number { return this.properties.getValue(PROP_VERTICAL_ALIGNMENT); }\n get wrapWords(): boolean { return this.properties.getValue(PROP_WRAP_WORDS); }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Graphics, Path } from '../../Graphics';\nimport { Point, scalePoints, translatePoints } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FloatProperty, IntProperty, PointsProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_ALPHA = 'alpha';\nconst PROP_FILL_LEVEL = 'fill_level';\nconst PROP_HORIZONTAL_FILL = 'horizontal_fill';\nconst PROP_LINE_COLOR = 'line_color';\nconst PROP_LINE_STYLE = 'line_style';\nconst PROP_LINE_WIDTH = 'line_width';\nconst PROP_POINTS = 'points';\n\nexport class Polygon extends Widget {\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new IntProperty(PROP_ALPHA, 255));\n this.properties.add(new IntProperty(PROP_LINE_WIDTH));\n this.properties.add(new FloatProperty(PROP_FILL_LEVEL));\n this.properties.add(new BooleanProperty(PROP_HORIZONTAL_FILL));\n this.properties.add(new ColorProperty(PROP_LINE_COLOR));\n this.properties.add(new IntProperty(PROP_LINE_STYLE));\n this.properties.add(new PointsProperty(PROP_POINTS, []));\n }\n\n init() {\n this.addPropertyListener('x', (newValue, oldValue) => {\n const unscaledPoints = this.properties.getValue(PROP_POINTS);\n const newPoints = translatePoints(unscaledPoints, newValue - oldValue, 0);\n this.properties.setValue(PROP_POINTS, newPoints);\n this.requestRepaint();\n });\n\n this.addPropertyListener('y', (newValue, oldValue) => {\n const unscaledPoints = this.properties.getValue(PROP_POINTS);\n const newPoints = translatePoints(unscaledPoints, 0, newValue - oldValue);\n this.properties.setValue(PROP_POINTS, newPoints);\n this.requestRepaint();\n });\n }\n\n draw(g: Graphics) {\n const { scale } = this;\n g.ctx.globalAlpha = this.alpha / 255;\n\n const path = Path.fromPoints(this.points).closePath();\n if (!this.transparent) {\n const backgroundColor = this.alarmSensitiveBackgroundColor;\n g.fillPath({ path, color: backgroundColor });\n }\n\n if (this.lineWidth) {\n if (this.lineStyle === 0) {\n g.strokePath({\n path,\n lineWidth: this.lineWidth,\n color: this.lineColor,\n });\n } else if (this.lineStyle === 2) {\n g.strokePath({\n path,\n lineWidth: this.lineWidth,\n color: this.lineColor,\n dash: [6 * scale, 2 * scale],\n });\n } else {\n console.warn(`Unsupported polygon line style ${this.lineStyle}`);\n }\n }\n\n if (this.fillLevel) {\n this.drawFill(g, path);\n }\n\n g.ctx.globalAlpha = 1;\n }\n\n private drawFill(g: Graphics, path: Path) {\n let fillY = this.y;\n let fillWidth = this.width;\n let fillHeight = this.height;\n if (this.horizontalFill) {\n fillWidth *= (this.fillLevel / 100);\n } else {\n fillHeight *= (this.fillLevel / 100);\n fillY += fillHeight;\n }\n\n // Create a clip for the fill level\n g.ctx.save();\n let x = this.x - (this.lineWidth / 2);\n let y = fillY - (this.lineWidth / 2);\n let width = fillWidth + this.lineWidth;\n let height = fillHeight + this.lineWidth;\n g.ctx.beginPath();\n g.ctx.rect(x, y, width, height);\n g.ctx.clip();\n\n // With clip active, draw the actual fill\n const foregroundColor = this.alarmSensitiveForegroundColor;\n g.fillPath({ path, color: foregroundColor });\n\n // Reset clip\n g.ctx.restore();\n }\n\n get alpha(): number { return this.properties.getValue(PROP_ALPHA); }\n get lineWidth(): number { return this.scale * this.properties.getValue(PROP_LINE_WIDTH); }\n get fillLevel(): number { return this.properties.getValue(PROP_FILL_LEVEL); }\n get horizontalFill(): boolean { return this.properties.getValue(PROP_HORIZONTAL_FILL); }\n get lineColor(): Color { return this.properties.getValue(PROP_LINE_COLOR); }\n get lineStyle(): number { return this.properties.getValue(PROP_LINE_STYLE); }\n get points(): Point[] {\n return scalePoints(this.properties.getValue(PROP_POINTS), this.scale);\n }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Graphics } from '../../Graphics';\nimport { convertCartesianToPolar, Point, PolarPoint, scalePoints, translatePoint } from '../../positioning';\nimport { BooleanProperty, FloatProperty, IntProperty, PointsProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_ALPHA = 'alpha';\nconst PROP_ARROWS = 'arrows';\nconst PROP_ARROW_LENGTH = 'arrow_length';\nconst PROP_FILL_ARROW = 'fill_arrow';\nconst PROP_FILL_LEVEL = 'fill_level';\nconst PROP_HORIZONTAL_FILL = 'horizontal_fill';\nconst PROP_LINE_WIDTH = 'line_width';\nconst PROP_POINTS = 'points';\n\nexport class Polyline extends Widget {\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new IntProperty(PROP_ALPHA, 255));\n this.properties.add(new IntProperty(PROP_LINE_WIDTH));\n this.properties.add(new FloatProperty(PROP_FILL_LEVEL));\n this.properties.add(new BooleanProperty(PROP_HORIZONTAL_FILL));\n this.properties.add(new PointsProperty(PROP_POINTS, []));\n this.properties.add(new IntProperty(PROP_ARROW_LENGTH));\n this.properties.add(new BooleanProperty(PROP_FILL_ARROW));\n this.properties.add(new IntProperty(PROP_ARROWS));\n }\n\n draw(g: Graphics) {\n const ctx = g.ctx;\n ctx.globalAlpha = this.alpha / 255;\n if (this.transparent) {\n ctx.globalAlpha = 0;\n }\n this.drawShape(ctx, this.backgroundColor);\n if (this.fillLevel) {\n this.drawFill(ctx);\n }\n\n ctx.globalAlpha = 1;\n }\n\n private drawFill(ctx: CanvasRenderingContext2D) {\n let fillY = this.y;\n let fillWidth = this.width;\n let fillHeight = this.height;\n if (this.horizontalFill) {\n fillWidth *= (this.fillLevel / 100);\n } else {\n fillHeight *= (this.fillLevel / 100);\n fillY += fillHeight;\n }\n\n // Create a clip for the fill level\n ctx.save();\n let x = this.x - (this.lineWidth / 2);\n let y = fillY - (this.lineWidth / 2);\n let width = fillWidth + this.lineWidth;\n let height = fillHeight + this.lineWidth;\n ctx.beginPath();\n ctx.rect(x, y, width, height);\n ctx.clip();\n\n // With clip active, draw the actual fill\n this.drawShape(ctx, this.foregroundColor);\n\n // Reset clip\n ctx.restore();\n }\n\n private drawShape(ctx: CanvasRenderingContext2D, color: Color) {\n ctx.strokeStyle = color.toString();\n ctx.lineWidth = this.lineWidth;\n ctx.beginPath();\n for (let i = 0; i < this.points.length; i++) {\n if (i === 0) {\n ctx.moveTo(this.points[i].x, this.points[i].y);\n } else {\n ctx.lineTo(this.points[i].x, this.points[i].y);\n }\n }\n ctx.stroke();\n\n if (this.points.length >= 2) {\n const firstPoint = this.points[0];\n const lastPoint = this.points[this.points.length - 1];\n if (this.arrows === 2 || this.arrows === 3) { // To or Both\n const arrowPoints = this.calculateArrowPoints(this.points[this.points.length - 2], lastPoint);\n arrowPoints[2] = lastPoint;\n\n if (this.fillArrow) {\n ctx.fillStyle = color.toString();\n ctx.beginPath();\n for (let i = 0; i < arrowPoints.length; i++) {\n if (i === 0) {\n ctx.moveTo(arrowPoints[i].x, arrowPoints[i].y);\n } else {\n ctx.lineTo(arrowPoints[i].x, arrowPoints[i].y);\n }\n }\n ctx.fill();\n } else {\n ctx.strokeStyle = color.toString();\n ctx.lineWidth = this.lineWidth;\n ctx.beginPath();\n ctx.moveTo(lastPoint.x, lastPoint.y);\n ctx.lineTo(arrowPoints[0].x, arrowPoints[0].y);\n ctx.moveTo(lastPoint.x, lastPoint.y);\n ctx.lineTo(arrowPoints[1].x, arrowPoints[1].y);\n ctx.stroke();\n }\n }\n if (this.arrows === 1 || this.arrows === 3) { // From or Both\n const arrowPoints = this.calculateArrowPoints(this.points[1], firstPoint);\n arrowPoints[2] = firstPoint;\n if (this.fillArrow) {\n ctx.fillStyle = color.toString();\n ctx.beginPath();\n for (let i = 0; i < arrowPoints.length; i++) {\n if (i === 0) {\n ctx.moveTo(arrowPoints[i].x, arrowPoints[i].y);\n } else {\n ctx.lineTo(arrowPoints[i].x, arrowPoints[i].y);\n }\n }\n ctx.fill();\n } else {\n ctx.strokeStyle = color.toString();\n ctx.lineWidth = this.lineWidth;\n ctx.beginPath();\n ctx.moveTo(firstPoint.x, firstPoint.y);\n ctx.lineTo(arrowPoints[0].x, arrowPoints[0].y);\n ctx.moveTo(firstPoint.x, firstPoint.y);\n ctx.lineTo(arrowPoints[1].x, arrowPoints[1].y);\n ctx.stroke();\n }\n }\n }\n }\n\n private calculateArrowPoints(startPoint: Point, endPoint: Point): Point[] {\n const ppE = convertCartesianToPolar(endPoint, startPoint);\n const angle = Math.PI / 10;\n\n const ppR = new PolarPoint(this.arrowLength, ppE.theta - angle);\n const ppL = new PolarPoint(this.arrowLength, ppE.theta + angle);\n\n // Intersection point between arrow and line.\n const ppI = new PolarPoint(Math.floor(this.arrowLength * Math.cos(angle)), ppE.theta);\n\n const pR = translatePoint(ppR.toPoint(), endPoint.x, endPoint.y);\n const pL = translatePoint(ppL.toPoint(), endPoint.x, endPoint.y);\n const pI = translatePoint(ppI.toPoint(), endPoint.x, endPoint.y);\n return [pR, pL, pI];\n }\n\n get alpha(): number { return this.properties.getValue(PROP_ALPHA); }\n get lineWidth(): number {\n return this.scale * this.properties.getValue(PROP_LINE_WIDTH);\n }\n get fillLevel(): number { return this.properties.getValue(PROP_FILL_LEVEL); }\n get horizontalFill(): boolean { return this.properties.getValue(PROP_HORIZONTAL_FILL); }\n get points(): Point[] {\n return scalePoints(this.properties.getValue(PROP_POINTS), this.scale);\n }\n get arrows(): number { return this.properties.getValue(PROP_ARROWS); }\n get fillArrow(): boolean { return this.properties.getValue(PROP_FILL_ARROW); }\n get arrowLength(): number { return this.properties.getValue(PROP_ARROW_LENGTH); }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Graphics } from '../../Graphics';\nimport { shrink } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FloatProperty, IntProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_ALPHA = 'alpha';\nconst PROP_BG_GRADIENT_COLOR = 'bg_gradient_color';\nconst PROP_FG_GRADIENT_COLOR = 'fg_gradient_color';\nconst PROP_FILL_LEVEL = 'fill_level';\nconst PROP_GRADIENT = 'gradient';\nconst PROP_HORIZONTAL_FILL = 'horizontal_fill';\nconst PROP_LINE_COLOR = 'line_color';\nconst PROP_LINE_WIDTH = 'line_width';\nconst PROP_LINE_STYLE = 'line_style';\n\nexport class Rectangle extends Widget {\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n\n // This widget ignores the fill associated with border 14.\n this.fillRoundRectangleBackgroundBorder = false;\n\n this.properties.add(new IntProperty(PROP_ALPHA, 255));\n this.properties.add(new ColorProperty(PROP_BG_GRADIENT_COLOR));\n this.properties.add(new ColorProperty(PROP_FG_GRADIENT_COLOR));\n this.properties.add(new BooleanProperty(PROP_GRADIENT));\n this.properties.add(new IntProperty(PROP_LINE_WIDTH));\n this.properties.add(new FloatProperty(PROP_FILL_LEVEL));\n this.properties.add(new BooleanProperty(PROP_HORIZONTAL_FILL));\n this.properties.add(new ColorProperty(PROP_LINE_COLOR));\n this.properties.add(new IntProperty(PROP_LINE_STYLE));\n }\n\n draw(g: Graphics) {\n g.ctx.globalAlpha = this.alpha / 255;\n\n this.drawBackground(g);\n if (this.fillLevel) {\n this.drawFill(g);\n }\n\n g.ctx.globalAlpha = 1;\n }\n\n private drawBackground(g: Graphics) {\n if (!this.transparent) {\n const backgroundColor = this.alarmSensitiveBackgroundColor;\n if (this.gradient) {\n const x2 = this.horizontalFill ? this.x : this.x + this.width;\n const y2 = this.horizontalFill ? this.y + this.height : this.y;\n const gradient = g.createLinearGradient(this.x, this.y, x2, y2);\n gradient.addColorStop(0, this.backgroundGradientStartColor.toString());\n gradient.addColorStop(1, backgroundColor.toString());\n g.fillRect({\n ... this.area,\n gradient,\n });\n } else {\n g.fillRect({\n ... this.area,\n color: backgroundColor,\n });\n }\n }\n\n if (this.lineWidth) {\n if (this.lineStyle === 0) { // Solid\n g.strokeRect({\n ... this.area,\n color: this.lineColor,\n lineWidth: this.lineWidth,\n crispen: true,\n });\n } else if (this.lineStyle === 1) { // Dash\n g.strokeRect({\n ... this.area,\n color: this.lineColor,\n lineWidth: this.lineWidth,\n crispen: true,\n dash: [6 * this.scale, 2 * this.scale],\n });\n } else {\n console.warn(`Unsupported rectangle line style ${this.lineStyle}`);\n }\n }\n }\n\n private drawFill(g: Graphics) {\n const box = shrink(this, this.lineWidth);\n\n // Create a clip for the fill level\n g.ctx.save();\n if (this.horizontalFill) {\n const fillWidth = box.width * (this.fillLevel / 100);\n g.ctx.beginPath();\n g.ctx.rect(box.x, box.y, fillWidth, box.height);\n } else {\n const fillHeight = box.height * (this.fillLevel / 100);\n const fillY = box.y + box.height - fillHeight;\n g.ctx.beginPath();\n g.ctx.rect(box.x, fillY, box.width, box.height);\n }\n g.ctx.clip();\n\n // With clip active, draw the actual fill\n const foregroundColor = this.alarmSensitiveForegroundColor;\n if (this.gradient) {\n const x2 = this.horizontalFill ? box.x : box.x + box.width;\n const y2 = this.horizontalFill ? box.y + box.height : box.y;\n const gradient = g.createLinearGradient(box.x, box.y, x2, y2);\n gradient.addColorStop(0, this.foregroundGradientStartColor.toString());\n gradient.addColorStop(1, foregroundColor.toString());\n g.fillRect({ ...box, gradient });\n } else {\n g.fillRect({ ...box, color: foregroundColor });\n }\n\n // Reset clip\n g.ctx.restore();\n }\n\n get alpha(): number { return this.properties.getValue(PROP_ALPHA); }\n get lineWidth(): number {\n return this.scale * this.properties.getValue(PROP_LINE_WIDTH);\n }\n get fillLevel(): number { return this.properties.getValue(PROP_FILL_LEVEL); }\n get horizontalFill(): boolean { return this.properties.getValue(PROP_HORIZONTAL_FILL); }\n get lineColor(): Color { return this.properties.getValue(PROP_LINE_COLOR); }\n get lineStyle(): number { return this.properties.getValue(PROP_LINE_STYLE); }\n get gradient(): boolean { return this.properties.getValue(PROP_GRADIENT); }\n get backgroundGradientStartColor(): Color {\n return this.properties.getValue(PROP_BG_GRADIENT_COLOR);\n }\n get foregroundGradientStartColor(): Color {\n return this.properties.getValue(PROP_FG_GRADIENT_COLOR);\n }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Graphics } from '../../Graphics';\nimport { shrink } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FloatProperty, IntProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_ALPHA = 'alpha';\nconst PROP_BG_GRADIENT_COLOR = 'bg_gradient_color';\nconst PROP_CORNER_WIDTH = 'corner_width';\nconst PROP_CORNER_HEIGHT = 'corner_height';\nconst PROP_FG_GRADIENT_COLOR = 'fg_gradient_color';\nconst PROP_FILL_LEVEL = 'fill_level';\nconst PROP_GRADIENT = 'gradient';\nconst PROP_HORIZONTAL_FILL = 'horizontal_fill';\nconst PROP_LINE_COLOR = 'line_color';\nconst PROP_LINE_WIDTH = 'line_width';\nconst PROP_LINE_STYLE = 'line_style';\n\nexport class RoundedRectangle extends Widget {\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n\n // This widget ignores the fill associated with border 14.\n this.fillRoundRectangleBackgroundBorder = false;\n\n this.properties.add(new IntProperty(PROP_ALPHA, 255));\n this.properties.add(new ColorProperty(PROP_BG_GRADIENT_COLOR));\n this.properties.add(new ColorProperty(PROP_FG_GRADIENT_COLOR));\n this.properties.add(new BooleanProperty(PROP_GRADIENT));\n this.properties.add(new IntProperty(PROP_LINE_WIDTH));\n this.properties.add(new FloatProperty(PROP_FILL_LEVEL));\n this.properties.add(new BooleanProperty(PROP_HORIZONTAL_FILL));\n this.properties.add(new ColorProperty(PROP_LINE_COLOR));\n this.properties.add(new IntProperty(PROP_CORNER_WIDTH));\n this.properties.add(new IntProperty(PROP_CORNER_HEIGHT));\n this.properties.add(new IntProperty(PROP_LINE_STYLE));\n }\n\n draw(g: Graphics) {\n g.ctx.globalAlpha = this.alpha / 255;\n\n this.drawBackground(g);\n if (this.fillLevel) {\n this.drawFill(g);\n }\n\n g.ctx.globalAlpha = 1;\n }\n\n private drawBackground(g: Graphics) {\n if (!this.transparent) {\n const backgroundColor = this.alarmSensitiveBackgroundColor;\n if (this.gradient) {\n const x2 = this.horizontalFill ? this.x : this.x + this.width;\n const y2 = this.horizontalFill ? this.y + this.height : this.y;\n const gradient = g.createLinearGradient(this.x, this.y, x2, y2);\n gradient.addColorStop(0, this.backgroundGradientStartColor.toString());\n gradient.addColorStop(1, backgroundColor.toString());\n g.fillRect({\n ... this.area,\n rx: this.cornerWidth / 2,\n ry: this.cornerHeight / 2,\n gradient,\n });\n } else {\n g.fillRect({\n ... this.area,\n rx: this.cornerWidth / 2,\n ry: this.cornerHeight / 2,\n color: backgroundColor,\n });\n }\n }\n\n if (this.lineWidth) {\n if (this.lineStyle === 0) { // Solid\n g.strokeRect({\n ... this.area,\n rx: this.cornerWidth / 2,\n ry: this.cornerHeight / 2,\n color: this.lineColor,\n lineWidth: this.lineWidth,\n crispen: true,\n });\n } else if (this.lineStyle === 1) { // Dash\n g.strokeRect({\n ... this.area,\n rx: this.cornerWidth / 2,\n ry: this.cornerHeight / 2,\n color: this.lineColor,\n lineWidth: this.lineWidth,\n crispen: true,\n dash: [6 * this.scale, 2 * this.scale],\n });\n } else {\n console.warn(`Unsupported RoundedRectangle line style ${this.lineStyle}`);\n }\n }\n }\n\n private drawFill(g: Graphics) {\n const rx = this.cornerWidth / 2;\n const ry = this.cornerHeight / 2;\n\n const box = shrink(this, this.lineWidth);\n\n // Create a clip for the fill level\n // (no rounded corners, the fill will do that)\n g.ctx.save();\n if (this.horizontalFill) {\n const fillWidth = box.width * (this.fillLevel / 100);\n g.ctx.beginPath();\n g.ctx.rect(box.x, box.y, fillWidth, box.height);\n } else {\n const fillHeight = box.height * (this.fillLevel / 100);\n const fillY = box.y + box.height - fillHeight;\n g.ctx.beginPath();\n g.ctx.rect(box.x, fillY, box.width, box.height);\n }\n g.ctx.clip();\n\n // With clip active, draw the actual fill\n const foregroundColor = this.alarmSensitiveForegroundColor;\n if (this.gradient) {\n const x2 = this.horizontalFill ? box.x : box.x + box.width;\n const y2 = this.horizontalFill ? box.y + box.height : box.y;\n const gradient = g.createLinearGradient(box.x, box.y, x2, y2);\n gradient.addColorStop(0, this.foregroundGradientStartColor.toString());\n gradient.addColorStop(1, foregroundColor.toString());\n g.fillRect({ ...box, rx, ry, gradient });\n } else {\n g.fillRect({ ...box, rx, ry, color: foregroundColor });\n }\n\n // Reset clip\n g.ctx.restore();\n }\n\n get alpha(): number { return this.properties.getValue(PROP_ALPHA); }\n get lineWidth(): number {\n return this.scale * this.properties.getValue(PROP_LINE_WIDTH);\n }\n get fillLevel(): number { return this.properties.getValue(PROP_FILL_LEVEL); }\n get horizontalFill(): boolean { return this.properties.getValue(PROP_HORIZONTAL_FILL); }\n get lineColor(): Color { return this.properties.getValue(PROP_LINE_COLOR); }\n get lineStyle(): number { return this.properties.getValue(PROP_LINE_STYLE); }\n get gradient(): boolean { return this.properties.getValue(PROP_GRADIENT); }\n get cornerWidth(): number {\n return this.scale * this.properties.getValue(PROP_CORNER_WIDTH);\n }\n get cornerHeight(): number {\n return this.scale * this.properties.getValue(PROP_CORNER_HEIGHT);\n }\n get backgroundGradientStartColor(): Color {\n return this.properties.getValue(PROP_BG_GRADIENT_COLOR);\n }\n get foregroundGradientStartColor(): Color {\n return this.properties.getValue(PROP_FG_GRADIENT_COLOR);\n }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Graphics, Path } from '../../Graphics';\nimport { Bounds, shrink, toBorderBox } from '../../positioning';\nimport { BooleanProperty, ColorProperty, IntProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_BIT_REVERSE = 'bitReverse';\nconst PROP_EFFECT_3D = 'effect_3d';\nconst PROP_HORIZONTAL = 'horizontal';\nconst PROP_LED_BORDER = 'led_border';\nconst PROP_LED_BORDER_COLOR = 'led_border_color';\nconst PROP_LED_PACKED = 'led_packed';\nconst PROP_NUM_BITS = 'numBits';\nconst PROP_OFF_COLOR = 'off_color';\nconst PROP_ON_COLOR = 'on_color';\nconst PROP_START_BIT = 'startBit';\nconst PROP_SQUARE_LED = 'square_led';\n\nexport class ByteMonitor extends Widget {\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new BooleanProperty(PROP_BIT_REVERSE));\n this.properties.add(new BooleanProperty(PROP_EFFECT_3D));\n this.properties.add(new BooleanProperty(PROP_HORIZONTAL));\n this.properties.add(new IntProperty(PROP_NUM_BITS));\n this.properties.add(new ColorProperty(PROP_OFF_COLOR));\n this.properties.add(new ColorProperty(PROP_ON_COLOR));\n this.properties.add(new IntProperty(PROP_START_BIT));\n this.properties.add(new BooleanProperty(PROP_SQUARE_LED));\n\n // Old displays don't have these properties\n this.properties.add(new IntProperty(PROP_LED_BORDER, 3));\n this.properties.add(new ColorProperty(PROP_LED_BORDER_COLOR, Color.DARK_GRAY));\n this.properties.add(new BooleanProperty(PROP_LED_PACKED, false));\n }\n\n getLedColor(index: number): Color {\n let booleanValue = false;\n if (this.pv?.value !== undefined) {\n for (let ii = this.startBit; ii < this.startBit + this.numBits; ii++) {\n let widgetIndex = 0;\n if (this.bitReverse) {\n widgetIndex = ii - this.startBit;\n } else {\n widgetIndex = (this.numBits - 1) - (ii - this.startBit);\n }\n if (widgetIndex === index) {\n booleanValue = ((this.pv?.value >> ii) & 1) > 0;\n break;\n }\n }\n }\n\n return booleanValue ? this.onColor : this.offColor;\n }\n\n draw(g: Graphics) {\n if (this.numBits < 1) {\n return;\n }\n\n let bounds = this.bounds;\n if (this.borderAlarmSensitive) {\n bounds = shrink(bounds, 2 * this.scale);\n }\n\n if (this.horizontal) {\n this.drawHorizontal(g, bounds);\n } else {\n this.drawVertical(g, bounds);\n }\n }\n\n private drawHorizontal(g: Graphics, bounds: Bounds) {\n let ledWidth;\n let ledSpacing;\n if (this.ledPacked) {\n ledWidth = Math.floor((bounds.width - this.ledBorder) / this.numBits + this.ledBorder);\n ledSpacing = ledWidth - this.ledBorder;\n } else {\n ledWidth = Math.floor(bounds.width / this.numBits);\n ledSpacing = ledWidth;\n }\n\n let ledHeight = 0;\n if (ledWidth > bounds.height || this.squareLed) {\n ledHeight = bounds.height;\n } else {\n ledHeight = ledWidth;\n }\n\n for (let i = 0; i < this.numBits; i++) {\n if (this.squareLed) {\n const area: Bounds = {\n x: bounds.x + (i * ledSpacing),\n y: bounds.y,\n width: ledWidth,\n height: ledHeight,\n };\n if (this.effect3d) {\n this.drawSquare3d(g, area, i);\n } else {\n this.drawSquare2d(g, area, i);\n }\n } else {\n const ledSize = Math.min(ledWidth, ledHeight);\n const area: Bounds = {\n x: bounds.x + (i * ledSpacing),\n y: bounds.y,\n width: ledSize,\n height: ledSize,\n };\n if (this.effect3d) {\n this.drawCircle3d(g, area, i);\n } else {\n this.drawCircle2d(g, area, i);\n }\n }\n }\n }\n\n private drawVertical(g: Graphics, bounds: Bounds) {\n let ledHeight;\n let ledSpacing;\n if (this.ledPacked) {\n ledHeight = Math.floor((bounds.height - this.ledBorder) / this.numBits + this.ledBorder);\n ledSpacing = ledHeight - this.ledBorder;\n } else {\n ledHeight = Math.floor(bounds.height / this.numBits);\n ledSpacing = ledHeight;\n }\n\n let ledWidth = 0;\n if (ledHeight > bounds.width || this.squareLed) {\n ledWidth = bounds.width;\n } else {\n ledWidth = ledHeight;\n }\n\n for (let i = 0; i < this.numBits; i++) {\n if (this.squareLed) {\n const area: Bounds = {\n x: bounds.x,\n y: bounds.y + (i * ledSpacing),\n width: ledWidth,\n height: ledHeight,\n };\n if (this.effect3d) {\n this.drawSquare3d(g, area, i);\n } else {\n this.drawSquare2d(g, area, i);\n }\n } else {\n const ledSize = Math.min(ledWidth, ledHeight);\n const area: Bounds = {\n x: bounds.x,\n y: bounds.y + (i * ledSpacing),\n width: ledSize,\n height: ledSize,\n };\n if (this.effect3d) {\n this.drawCircle3d(g, area, i);\n } else {\n this.drawCircle2d(g, area, i);\n }\n }\n }\n }\n\n private drawCircle2d(g: Graphics, area: Bounds, bit: number) {\n const cx = area.x + (area.width / 2);\n const cy = area.y + (area.height / 2);\n let rx = area.width / 2;\n let ry = area.height / 2;\n if (this.ledBorder > 0) {\n rx -= (this.ledBorder / 2.0);\n ry -= (this.ledBorder / 2.0);\n }\n\n g.fillEllipse({ cx, cy, rx, ry, color: this.getLedColor(bit) });\n g.strokeEllipse({ cx, cy, rx, ry, color: this.ledBorderColor, lineWidth: this.ledBorder });\n }\n\n private drawCircle3d(g: Graphics, area: Bounds, bit: number) {\n const cx = area.x + (area.width / 2);\n const cy = area.y + (area.height / 2);\n let rx = area.width / 2;\n let ry = area.height / 2;\n g.fillEllipse({ cx, cy, rx, ry, color: Color.WHITE });\n\n let gradient = g.createLinearGradient(area.x, area.y, area.x + area.width, area.y + area.height);\n gradient.addColorStop(0, this.ledBorderColor.toString());\n gradient.addColorStop(1, this.ledBorderColor.withAlpha(0).toString());\n g.fillEllipse({ cx, cy, rx, ry, gradient });\n\n const innerWidth = area.width - (2 * this.ledBorder);\n const innerHeight = area.height - (2 * this.ledBorder);\n rx = innerWidth / 2;\n ry = innerHeight / 2;\n g.fillEllipse({ cx, cy, rx, ry, color: this.getLedColor(bit) });\n\n gradient = g.createLinearGradient(area.x, area.y, area.x + area.width, area.y + area.height);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, this.ledBorderColor.withAlpha(0).toString());\n g.fillEllipse({ cx, cy, rx, ry, gradient });\n }\n\n private drawSquare2d(g: Graphics, area: Bounds, bit: number) {\n const box = toBorderBox(area.x, area.y, area.width, area.height, this.ledBorder);\n g.fillRect({\n ...box,\n color: this.getLedColor(bit),\n });\n g.strokeRect({\n ...box,\n color: this.ledBorderColor,\n lineWidth: this.ledBorder,\n });\n }\n\n private drawSquare3d(g: Graphics, area: Bounds, bit: number) {\n g.fillRect({\n ...area,\n color: this.ledBorderColor,\n });\n\n // Left border\n let gradient = g.createLinearGradient(area.x, area.y, area.x + area.width, area.y);\n gradient.addColorStop(0, 'rgba(0,0,0,0.078)');\n gradient.addColorStop(1, 'rgba(0,0,0,0.39)');\n g.fillPath({\n gradient,\n path: new Path(area.x, area.y)\n .lineTo(area.x + this.ledBorder, area.y + this.ledBorder)\n .lineTo(area.x + this.ledBorder, area.y + area.height - this.ledBorder)\n .lineTo(area.x, area.y + area.height)\n });\n\n // Top border\n gradient = g.createLinearGradient(area.x, area.y, area.x, area.y + area.height);\n gradient.addColorStop(0, 'rgba(0,0,0,0.078)');\n gradient.addColorStop(1, 'rgba(0,0,0,0.39)');\n g.fillPath({\n gradient,\n path: new Path(area.x, area.y)\n .lineTo(area.x + this.ledBorder, area.y + this.ledBorder)\n .lineTo(area.x + area.width - this.ledBorder, area.y + this.ledBorder)\n .lineTo(area.x + area.width, area.y)\n });\n\n // Right border\n gradient = g.createLinearGradient(area.x, area.y, area.x + area.width, area.y);\n gradient.addColorStop(0, 'rgba(255,255,255,0.078)');\n gradient.addColorStop(1, 'rgba(255,255,255,0.39)');\n g.fillPath({\n gradient,\n path: new Path(area.x + area.width, area.y)\n .lineTo(area.x + area.width - this.ledBorder, area.y + this.ledBorder)\n .lineTo(area.x + area.width - this.ledBorder, area.y + area.height - this.ledBorder)\n .lineTo(area.x + area.width, area.y + area.height)\n });\n\n // Bottom border\n gradient = g.createLinearGradient(area.x, area.y, area.x, area.y + area.height);\n gradient.addColorStop(0, 'rgba(255,255,255,0.078)');\n gradient.addColorStop(1, 'rgba(255,255,255,0.39)');\n g.fillPath({\n gradient,\n path: new Path(area.x, area.y + area.height)\n .lineTo(area.x + this.ledBorder, area.y + area.height - this.ledBorder)\n .lineTo(area.x + area.width - this.ledBorder, area.y + area.height - this.ledBorder)\n .lineTo(area.x + area.width, area.y + area.height)\n });\n\n // Bulb\n const x = area.x + this.ledBorder;\n const y = area.y + this.ledBorder;\n const width = area.width - (2 * this.ledBorder);\n const height = area.height - (2 * this.ledBorder);\n\n const ledColor = this.getLedColor(bit);\n g.fillRect({ x, y, width, height, color: ledColor });\n\n // Bulb gradient overlay\n gradient = g.createLinearGradient(area.x, area.y, area.x + area.width, area.y + area.height);\n gradient.addColorStop(0, 'rgba(255,255,255,0.784)');\n gradient.addColorStop(1, ledColor.withAlpha(0).toString());\n g.fillRect({ x, y, width, height, gradient });\n }\n\n get bitReverse(): boolean { return this.properties.getValue(PROP_BIT_REVERSE); }\n get horizontal(): boolean { return this.properties.getValue(PROP_HORIZONTAL); }\n get numBits(): number { return this.properties.getValue(PROP_NUM_BITS); }\n get startBit(): number { return this.properties.getValue(PROP_START_BIT); }\n get ledPacked(): boolean { return this.properties.getValue(PROP_LED_PACKED); }\n get ledBorder(): number {\n return this.scale * this.properties.getValue(PROP_LED_BORDER);\n }\n get ledBorderColor(): Color { return this.properties.getValue(PROP_LED_BORDER_COLOR); }\n get offColor(): Color { return this.properties.getValue(PROP_OFF_COLOR); }\n get onColor(): Color { return this.properties.getValue(PROP_ON_COLOR); }\n get effect3d(): boolean { return this.properties.getValue(PROP_EFFECT_3D); }\n get squareLed(): boolean { return this.properties.getValue(PROP_SQUARE_LED); }\n}\n","export class DecimalFormat {\n\n private prefix = '';\n private suffix = '';\n /**\n * Grouping size\n */\n private comma = 0;\n /**\n * Minimum integer digits to be displayed\n */\n private minInt = 1;\n /**\n * Minimum fractional digits to be displayed\n */\n private minFrac = 0;\n /**\n * Maximum fractional digits to be displayed\n */\n private maxFrac = 0;\n\n constructor(formatStr: string) {\n for (let i = 0; i < formatStr.length; i++) {\n if (formatStr.charAt(i) == '#' || formatStr.charAt(i) == '0') {\n this.prefix = formatStr.substring(0, i);\n formatStr = formatStr.substring(i);\n break;\n }\n }\n\n this.suffix = formatStr.replace(/[#]|[0]|[,]|[.]/g, '');\n\n const numberStr = formatStr.replace(/[^0#,.]/g, '');\n let intStr = '';\n let fracStr = '';\n const point = numberStr.indexOf('.');\n if (point !== -1) {\n intStr = numberStr.substring(0, point);\n fracStr = numberStr.substring(point + 1);\n }\n else {\n intStr = numberStr;\n }\n\n const commaPos = intStr.lastIndexOf(',');\n if (commaPos !== -1) {\n this.comma = intStr.length - 1 - commaPos;\n }\n\n intStr = intStr.replace(/[,]/g, ''); // remove commas\n\n fracStr = fracStr.replace(/[,]|[.]+/g, '');\n\n this.maxFrac = fracStr.length;\n let tmp = intStr.replace(/[^0]/g, ''); // remove all except zero\n if (tmp.length > this.minInt)\n this.minInt = tmp.length;\n tmp = fracStr.replace(/[^0]/g, '');\n this.minFrac = tmp.length;\n }\n\n /**\n * 1223.06 --> $1,223.06\n */\n format(numStr: any) {\n // remove prefix, suffix and commas\n let numberStr = this.formatBack(numStr).toLowerCase();\n\n // do not format if not a number\n if (isNaN(numberStr) || numberStr.length == 0)\n return numStr;\n\n //scientific numbers\n if (numberStr.indexOf(\"e\") != -1) {\n const n = Number(numberStr);\n if (n === Infinity || n === -Infinity) return numberStr;\n numberStr = n + \"\";\n if (numberStr.indexOf('e') !== -1) return numberStr;\n }\n\n let negative = false;\n // remove sign\n if (numberStr.charAt(0) === '-') {\n negative = true;\n numberStr = numberStr.substring(1);\n }\n else if (numberStr.charAt(0) === '+') {\n numberStr = numberStr.substring(1);\n }\n\n const point = numberStr.indexOf('.'); // position of point character\n let intStr = '';\n let fracStr = '';\n if (point != -1) {\n intStr = numberStr.substring(0, point);\n fracStr = numberStr.substring(point + 1);\n }\n else {\n intStr = numberStr;\n }\n fracStr = fracStr.replace(/[.]/, ''); // remove other point characters\n\n const isPercentage = this.suffix && this.suffix.charAt(0) === '%';\n // if percentage, number will be multiplied by 100.\n let minInt = this.minInt, minFrac = this.minFrac, maxFrac = this.maxFrac;\n if (isPercentage) {\n minInt -= 2;\n minFrac += 2;\n maxFrac += 2;\n }\n\n if (fracStr.length > maxFrac) { // round\n //case 6143\n let num: any = Number('0.' + fracStr);\n num = (maxFrac == 0) ? Math.round(num) : num.toFixed(maxFrac);\n // toFixed method has bugs on IE (0.7 --> 0)\n fracStr = num.toString(10).substr(2);\n let c = (num >= 1) ? 1 : 0; //carry\n let x, i = intStr.length - 1;\n while (c) { //increment intStr\n if (i == -1) {\n intStr = '1' + intStr;\n break;\n }\n else {\n x = Number(intStr.charAt(i));\n if (x === 9) { x = '0'; c = 1; }\n else { x = (++x) + ''; c = 0; }\n intStr = intStr.substring(0, i) + x + intStr.substring(i + 1, intStr.length);\n i--;\n }\n }\n }\n for (let i = fracStr.length; i < minFrac; i++) { // if minFrac=4 then 1.12 --> 1.1200\n fracStr = fracStr + '0';\n }\n while (fracStr.length > minFrac && fracStr.charAt(fracStr.length - 1) == '0') { // if minInt=4 then 00034 --> 0034)\n fracStr = fracStr.substring(0, fracStr.length - 1);\n }\n\n for (let i = intStr.length; i < minInt; i++) { // if minInt=4 then 034 --> 0034\n intStr = '0' + intStr;\n }\n while (intStr.length > minInt && intStr.charAt(0) == '0') { // if minInt=4 then 00034 --> 0034)\n intStr = intStr.substring(1);\n }\n\n if (isPercentage) { // multiply by 100\n intStr += fracStr.substring(0, 2);\n fracStr = fracStr.substring(2);\n }\n\n let j = 0;\n for (let i = intStr.length; i > 0; i--) { // add commas\n if (j != 0 && j % this.comma == 0) {\n intStr = intStr.substring(0, i) + ',' + intStr.substring(i);\n j = 0;\n }\n j++;\n }\n\n let formattedValue;\n if (fracStr.length > 0)\n formattedValue = this.prefix + intStr + '.' + fracStr + this.suffix;\n else\n formattedValue = this.prefix + intStr + this.suffix;\n\n if (negative) {\n formattedValue = '-' + formattedValue;\n }\n\n return formattedValue;\n }\n\n /**\n * Converts formatted value back to non-formatted value\n */\n private formatBack(fNumStr: any) { // $1,223.06 --> 1223.06\n fNumStr += ''; //ensure it is string\n if (!fNumStr) return ''; //do not return undefined or null\n if (!isNaN(fNumStr)) return this.getNumericString(fNumStr);\n let fNumberStr = fNumStr;\n let negative = false;\n if (fNumStr.charAt(0) === '-') {\n fNumberStr = fNumberStr.substr(1);\n negative = true;\n }\n const pIndex = fNumberStr.indexOf(this.prefix);\n const sIndex = (this.suffix == '') ? fNumberStr.length : fNumberStr.indexOf(this.suffix, this.prefix.length + 1);\n if (pIndex == 0 && sIndex > 0) {\n // remove suffix\n fNumberStr = fNumberStr.substr(0, sIndex);\n // remove prefix\n fNumberStr = fNumberStr.substr(this.prefix.length);\n // remove commas\n fNumberStr = fNumberStr.replace(/,/g, '');\n if (negative)\n fNumberStr = '-' + fNumberStr;\n if (!isNaN(fNumberStr))\n return this.getNumericString(fNumberStr);\n }\n return fNumStr;\n }\n\n /**\n * We shouldn't return strings like 1.000 in formatBack method.\n * However, using only Number(str) is not enough, because it omits . in big numbers\n * like 23423423423342234.34 => 23423423423342236 . There's a conflict in cases\n * 6143 and 6541.\n */\n private getNumericString(str: string) {\n const num = Number(str);\n //check if there is a missing dot\n const numStr = num + '';\n if (str.indexOf('.') > -1 && numStr.indexOf('.') < 0) {\n //check if original string has all zeros after dot or not\n for (var i = str.indexOf('.') + 1; i < str.length; i++) {\n //if not, this means we lost precision\n if (str.charAt(i) !== '0') return str;\n }\n return numStr;\n }\n return str;\n }\n}\n","import { Color } from '../../Color';\nimport { Graphics } from '../../Graphics';\nimport { Bounds, convertPolarToCartesian, toRadians } from '../../positioning';\n\nconst SPACE_BTW_MARK_LABEL = 1;\nconst MAJOR_TICK_LENGTH = 8;\n\n// In degrees\nconst RAMP_OVERLAP = 2;\n\nexport class Ramp {\n\n lolo = 10;\n loloColor = Color.RED;\n showLoLo = true;\n\n lo = 25;\n loColor = Color.ORANGE;\n showLo = true;\n\n hi = 75;\n hiColor = Color.ORANGE;\n showHi = true;\n\n hihi = 90;\n hihiColor = Color.RED;\n showHiHi = true;\n\n minimum = 0;\n maximum = 100;\n gradient = true;\n logScale = false;\n effect3d = true;\n labelsOutside = true;\n\n // Calculated when drawn\n private range: Range = { min: this.minimum, max: this.maximum };\n private lengthInDegrees = 0;\n private radius = 0;\n\n constructor(private rampWidth: number, private startAngle: number, private endAngle: number) {\n }\n\n draw(g: Graphics, scaleArea: Bounds, rampArea: Bounds) {\n if (this.labelsOutside) {\n // set an estimated radius first\n const estimatedDonutWidth = SPACE_BTW_MARK_LABEL + MAJOR_TICK_LENGTH;\n this.radius = scaleArea.width / 2 - estimatedDonutWidth;\n\n // adjust the radius so the tick labels have enough space to\n // be drawn inside the bounds\n // radius -= tickLabels.getTickLabelMaxOutLength();\n } else {\n this.radius = scaleArea.width / 2 - 1;\n }\n\n this.range = this.getRenderedRange();\n if (this.endAngle - this.startAngle > 0) {\n this.lengthInDegrees = 360 - (this.endAngle - this.startAngle);\n } else {\n this.lengthInDegrees = this.startAngle - this.endAngle;\n }\n\n this.drawRamp(g, rampArea);\n }\n\n drawRamp(g: Graphics, area: Bounds) {\n const cx = area.x + (area.width / 2);\n const cy = area.y + (area.height / 2);\n const rx = area.width / 2;\n const ry = area.height / 2;\n\n // Convert angles\n let leftMostAngle;\n let rightMostAngle = 360 - this.endAngle;\n if (this.endAngle - this.startAngle > 0) { // Gauge\n leftMostAngle = this.startAngle - 90;\n } else { // Meter\n leftMostAngle = this.startAngle + 90;\n }\n\n // LOLO\n if (this.showLoLo) {\n let startAngle = leftMostAngle;\n let endAngle = 360 - this.getValuePosition(this.lolo, true);\n g.strokeEllipse({\n cx,\n cy,\n rx: rx - this.rampWidth / 2,\n ry: ry - this.rampWidth / 2,\n lineWidth: this.rampWidth,\n startAngle: toRadians(startAngle),\n endAngle: toRadians(endAngle),\n color: this.loloColor,\n });\n }\n\n // LO\n if (this.showLo) {\n let loLeft;\n if (this.showLoLo) {\n loLeft = this.lolo;\n } else {\n loLeft = this.minimum;\n }\n const startAngle = 360 - this.getValuePosition(loLeft, true);\n const endAngle = 360 - this.getValuePosition(this.lo, true);\n\n if (this.effect3d && this.gradient && this.showLoLo) {\n const gradientLeftAngle = toRadians(this.getValuePosition(loLeft, true) - RAMP_OVERLAP);\n const gradientLeft = convertPolarToCartesian(area.width / 2, gradientLeftAngle, area);\n\n const gradientRightAngle = toRadians(this.getValuePosition(this.lo, true) + RAMP_OVERLAP);\n const gradientRight = convertPolarToCartesian(area.width / 2, gradientRightAngle, area);\n const gradient = g.createLinearGradient(gradientLeft.x, gradientLeft.y, gradientRight.x, gradientRight.y);\n gradient.addColorStop(0, this.loloColor.toString());\n gradient.addColorStop(1, this.loColor.toString());\n g.strokeEllipse({\n cx,\n cy,\n rx: rx - this.rampWidth / 2,\n ry: ry - this.rampWidth / 2,\n lineWidth: this.rampWidth,\n startAngle: toRadians(startAngle - RAMP_OVERLAP / 2),\n endAngle: toRadians(endAngle + RAMP_OVERLAP / 2),\n gradient,\n });\n } else {\n g.strokeEllipse({\n cx,\n cy,\n rx: rx - this.rampWidth / 2,\n ry: ry - this.rampWidth / 2,\n lineWidth: this.rampWidth,\n startAngle: toRadians(startAngle),\n endAngle: toRadians(endAngle),\n color: this.loColor,\n });\n }\n }\n\n let midLeft = this.minimum;\n if (this.showLo) {\n midLeft = this.lo;\n } else if (this.showLoLo) {\n midLeft = this.lolo;\n }\n\n let midRight = this.maximum;\n if (this.showHi) {\n midRight = this.hi;\n } else if (this.showHiHi) {\n midRight = this.hihi;\n }\n\n const midNormal = (midLeft + midRight) / 2;\n\n // NORMAL (left part)\n let startAngle = 360 - this.getValuePosition(midLeft, true);\n let endAngle = 360 - this.getValuePosition(midNormal, true);\n if (this.effect3d && this.gradient && (this.showLoLo || this.showLo)) {\n const gradientLeftAngle = toRadians(this.getValuePosition(midLeft, true) - RAMP_OVERLAP);\n const gradientLeft = convertPolarToCartesian(area.width / 2, gradientLeftAngle, area);\n\n const gradientRightAngle = toRadians(this.getValuePosition(midNormal, true) + RAMP_OVERLAP);\n const gradientRight = convertPolarToCartesian(area.width / 2, gradientRightAngle, area);\n const gradient = g.createLinearGradient(gradientLeft.x, gradientLeft.y, gradientRight.x, gradientRight.y);\n gradient.addColorStop(0, (this.showLo ? this.loColor : this.loloColor).toString());\n gradient.addColorStop(1, Color.GREEN.toString());\n g.strokeEllipse({\n cx,\n cy,\n rx: rx - this.rampWidth / 2,\n ry: ry - this.rampWidth / 2,\n lineWidth: this.rampWidth,\n startAngle: toRadians(startAngle - RAMP_OVERLAP / 2),\n endAngle: toRadians(endAngle + RAMP_OVERLAP / 2),\n gradient,\n });\n } else {\n g.strokeEllipse({\n cx,\n cy,\n rx: rx - this.rampWidth / 2,\n ry: ry - this.rampWidth / 2,\n lineWidth: this.rampWidth,\n startAngle: toRadians(startAngle),\n endAngle: toRadians(endAngle),\n color: Color.GREEN,\n });\n }\n\n // NORMAL (right part)\n startAngle = 360 - this.getValuePosition(midNormal, true);\n endAngle = 360 - this.getValuePosition(midRight, true);\n if (this.effect3d && this.gradient && (this.showHi || this.showHiHi)) {\n const gradientLeftAngle = toRadians(this.getValuePosition(midNormal, true) - RAMP_OVERLAP);\n const gradientLeft = convertPolarToCartesian(area.width / 2, gradientLeftAngle, area);\n\n const gradientRightAngle = toRadians(this.getValuePosition(midRight, true) + RAMP_OVERLAP);\n const gradientRight = convertPolarToCartesian(area.width / 2, gradientRightAngle, area);\n const gradient = g.createLinearGradient(gradientLeft.x, gradientLeft.y, gradientRight.x, gradientRight.y);\n gradient.addColorStop(0, Color.GREEN.toString());\n gradient.addColorStop(1, (this.showHi ? this.hiColor : this.hihiColor).toString());\n const overlap = endAngle !== rightMostAngle ? RAMP_OVERLAP / 2 : 0;\n g.strokeEllipse({\n cx,\n cy,\n rx: rx - this.rampWidth / 2,\n ry: ry - this.rampWidth / 2,\n lineWidth: this.rampWidth,\n startAngle: toRadians(startAngle - RAMP_OVERLAP / 2),\n endAngle: toRadians(endAngle + overlap),\n gradient,\n });\n } else {\n g.strokeEllipse({\n cx,\n cy,\n rx: rx - this.rampWidth / 2,\n ry: ry - this.rampWidth / 2,\n lineWidth: this.rampWidth,\n startAngle: toRadians(startAngle),\n endAngle: toRadians(endAngle),\n color: Color.GREEN,\n });\n }\n\n // HI\n if (this.showHi) {\n let hiRight;\n if (this.showHiHi) {\n hiRight = this.hihi;\n } else {\n hiRight = this.maximum;\n }\n const startAngle = 360 - this.getValuePosition(this.hi, true);\n const endAngle = 360 - this.getValuePosition(hiRight, true);\n\n if (this.effect3d && this.gradient && this.showHiHi) {\n const gradientLeftAngle = toRadians(this.getValuePosition(this.hi, true) - RAMP_OVERLAP);\n const gradientLeft = convertPolarToCartesian(area.width / 2, gradientLeftAngle, area);\n\n const gradientRightAngle = toRadians(this.getValuePosition(hiRight, true) + RAMP_OVERLAP);\n const gradientRight = convertPolarToCartesian(area.width / 2, gradientRightAngle, area);\n const gradient = g.createLinearGradient(gradientLeft.x, gradientLeft.y, gradientRight.x, gradientRight.y);\n gradient.addColorStop(0, this.hiColor.toString());\n gradient.addColorStop(1, this.hihiColor.toString());\n const overlap = endAngle !== rightMostAngle ? RAMP_OVERLAP / 2 : 0;\n g.strokeEllipse({\n cx,\n cy,\n rx: rx - this.rampWidth / 2,\n ry: ry - this.rampWidth / 2,\n lineWidth: this.rampWidth,\n startAngle: toRadians(startAngle - RAMP_OVERLAP / 2),\n endAngle: toRadians(endAngle + overlap),\n gradient,\n });\n } else {\n g.strokeEllipse({\n cx,\n cy,\n rx: rx - this.rampWidth / 2,\n ry: ry - this.rampWidth / 2,\n lineWidth: this.rampWidth,\n startAngle: toRadians(startAngle),\n endAngle: toRadians(endAngle),\n color: this.hiColor,\n });\n }\n }\n\n // HIHI\n if (this.showHiHi) {\n startAngle = 360 - this.getValuePosition(this.hihi, true);\n endAngle = rightMostAngle;\n const overlap = this.gradient ? RAMP_OVERLAP / 2 : 0;\n g.strokeEllipse({\n cx,\n cy,\n rx: rx - this.rampWidth / 2,\n ry: ry - this.rampWidth / 2,\n lineWidth: this.rampWidth,\n startAngle: toRadians(startAngle - overlap),\n endAngle: toRadians(endAngle),\n color: this.hihiColor,\n });\n }\n }\n\n getRadius() {\n return this.radius;\n }\n\n getValuePosition(v: number, limit = false) {\n if (limit) {\n v = this.getValueInRange(v);\n }\n\n let valuePosition;\n if (this.logScale) {\n valuePosition = this.startAngle - ((Math.log10(v) - Math.log10(this.range.min))\n / (Math.log10(this.range.max) - Math.log10(this.range.min)) * this.lengthInDegrees);\n } else {\n valuePosition = this.startAngle - ((v - this.range.min) / (this.range.max - this.range.min) * this.lengthInDegrees);\n }\n\n if (valuePosition < 0) {\n valuePosition += 360;\n }\n\n return valuePosition;\n }\n\n getValueInRange(v: number) {\n if (this.range.min <= v && v <= this.range.max) {\n return v;\n } else {\n return v > this.range.max ? this.range.max : this.range.min;\n }\n }\n\n private getRenderedRange(): Range {\n const range = { min: this.minimum, max: this.maximum };\n if (this.logScale) {\n if (this.minimum <= 0) {\n range.min = 0.1;\n }\n if (range.max <= this.minimum) {\n range.max = range.min + 100;\n }\n }\n return range;\n }\n}\n\ninterface Range {\n min: number;\n max: number;\n}\n","import { Color } from '../../Color';\nimport { DecimalFormat } from '../../DecimalFormat';\nimport { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics, Path } from '../../Graphics';\nimport { Bounds, rotatePoint, shrink, toRadians } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FloatProperty, FontProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { Ramp } from '../figures/Ramp';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst BORDER_COLOR = new Color(100, 100, 100);\nconst NEEDLE_DIAMETER = 16;\nconst MAJOR_TICK_LENGTH = 8;\nconst MINOR_TICK_LENGTH = 5;\nconst GAP_BTW_NEEDLE_SCALE = -1;\n\nconst PROP_COLOR_HI = 'color_hi';\nconst PROP_COLOR_HIHI = 'color_hihi';\nconst PROP_COLOR_LO = 'color_lo';\nconst PROP_COLOR_LOLO = 'color_lolo';\nconst PROP_EFFECT_3D = 'effect_3d';\nconst PROP_FONT = 'font';\nconst PROP_VALUE_LABEL_FORMAT = 'value_label_format';\nconst PROP_LEVEL_HI = 'level_hi';\nconst PROP_LEVEL_HIHI = 'level_hihi';\nconst PROP_LEVEL_LO = 'level_lo';\nconst PROP_LEVEL_LOLO = 'level_lolo';\nconst PROP_LIMITS_FROM_PV = 'limits_from_pv';\nconst PROP_LOG_SCALE = 'log_scale';\nconst PROP_MINIMUM = 'minimum';\nconst PROP_MAXIMUM = 'maximum';\nconst PROP_NEEDLE_COLOR = 'needle_color';\nconst PROP_RAMP_GRADIENT = 'ramp_gradient';\nconst PROP_SHOW_RAMP = 'show_ramp';\n\n// In degrees\nconst START_ANGLE = 225;\nconst END_ANGLE = 315;\nconst RAMP_OVERLAP = 2;\n\ninterface DisplayLimits {\n min: number;\n lolo: number;\n lo: number;\n hi: number;\n hihi: number;\n max: number;\n}\n\nexport class Gauge extends Widget {\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new ColorProperty(PROP_COLOR_HI));\n this.properties.add(new ColorProperty(PROP_COLOR_HIHI));\n this.properties.add(new ColorProperty(PROP_COLOR_LO));\n this.properties.add(new ColorProperty(PROP_COLOR_LOLO));\n this.properties.add(new BooleanProperty(PROP_EFFECT_3D));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new FloatProperty(PROP_LEVEL_HI));\n this.properties.add(new FloatProperty(PROP_LEVEL_HIHI));\n this.properties.add(new FloatProperty(PROP_LEVEL_LO));\n this.properties.add(new FloatProperty(PROP_LEVEL_LOLO));\n this.properties.add(new BooleanProperty(PROP_LOG_SCALE));\n this.properties.add(new BooleanProperty(PROP_LIMITS_FROM_PV));\n this.properties.add(new FloatProperty(PROP_MAXIMUM));\n this.properties.add(new FloatProperty(PROP_MINIMUM));\n this.properties.add(new ColorProperty(PROP_NEEDLE_COLOR));\n this.properties.add(new BooleanProperty(PROP_RAMP_GRADIENT));\n this.properties.add(new BooleanProperty(PROP_SHOW_RAMP, true));\n this.properties.add(new StringProperty(PROP_VALUE_LABEL_FORMAT));\n }\n\n draw(g: Graphics) {\n let limits: DisplayLimits;\n if (this.limitsFromPv && this.pv && !this.pv.disconnected) {\n limits = {\n min: this.pv.lowerDisplayLimit ?? this.minimum,\n lolo: this.pv.lowerAlarmLimit!,\n lo: this.pv.lowerWarningLimit!,\n hi: this.pv.upperWarningLimit!,\n hihi: this.pv.upperAlarmLimit!,\n max: this.pv.upperDisplayLimit ?? this.maximum,\n };\n } else {\n limits = {\n min: this.minimum,\n lolo: this.levelLoLo,\n lo: this.levelLo,\n hi: this.levelHi,\n hihi: this.levelHiHi,\n max: this.maximum,\n };\n }\n\n if (this.logScale) {\n limits.min = Math.max(0.1, limits.min);\n if (limits.max <= limits.min) {\n limits.max = limits.min + 100;\n }\n }\n\n const width = Math.min(this.width, this.height);\n const height = width;\n this.drawBackground(g, width, height);\n if (this.showRamp) {\n this.drawRamp(g, width, height, limits);\n }\n this.drawLabel(g, width, height);\n this.drawNeedle(g, width, height, limits);\n this.drawNeedleCenter(g, width, height);\n }\n\n private drawBackground(g: Graphics, width: number, height: number) {\n g.fillEllipse({\n cx: this.x + (width / 2),\n cy: this.y + (height / 2),\n rx: width / 2,\n ry: height / 2,\n color: Color.GRAY,\n });\n\n if (this.effect3d) {\n const gradient = g.createLinearGradient(this.x, this.y, this.x + this.width, this.y + this.height);\n gradient.addColorStop(0, BORDER_COLOR.toString());\n gradient.addColorStop(1, Color.WHITE.toString());\n g.fillEllipse({\n cx: this.x + (width / 2),\n cy: this.y + (height / 2),\n rx: width / 2,\n ry: height / 2,\n gradient,\n });\n }\n\n const strokeWidth = (this.effect3d ? 2 : 1) * this.scale;\n g.fillEllipse({\n cx: this.x + (width / 2),\n cy: this.y + (height / 2),\n rx: width / 2 - strokeWidth,\n ry: height / 2 - strokeWidth,\n color: this.backgroundColor,\n });\n\n if (this.effect3d) {\n const R = width / 2;\n const UD_FILL_PART = 9.5 / 10;\n const UP_DOWN_RATIO = 1 / 2;\n const LR_FILL_PART = 8.5 / 10;\n const UP_ANGLE = toRadians(0);\n const DOWN_ANGLE = toRadians(35);\n let box: Bounds = {\n x: Math.floor(this.x + width / 2 - R * LR_FILL_PART * Math.cos(UP_ANGLE)),\n y: Math.floor(this.y + height / 2 - R * UD_FILL_PART),\n width: Math.floor(2 * R * LR_FILL_PART * Math.cos(UP_ANGLE)),\n height: Math.floor(R * UD_FILL_PART + R * UP_DOWN_RATIO),\n };\n let gradient = g.createLinearGradient(box.x, box.y, box.x, box.y + box.height);\n gradient.addColorStop(0, Color.WHITE.withAlpha(90 / 255).toString());\n gradient.addColorStop(1, Color.WHITE.withAlpha(0).toString());\n\n g.fillEllipse({\n cx: box.x + (box.width / 2),\n cy: box.y + (box.height / 2),\n rx: box.width / 2,\n ry: box.height / 2,\n gradient,\n });\n\n box = {\n x: Math.floor(this.x + width / 2 - R * LR_FILL_PART * Math.sin(DOWN_ANGLE)),\n y: Math.floor(Math.ceil(this.y + height / 2 + R * UP_DOWN_RATIO)),\n width: Math.floor(2 * R * LR_FILL_PART * Math.sin(DOWN_ANGLE)),\n height: Math.floor(Math.ceil(R * UD_FILL_PART - R * UP_DOWN_RATIO)),\n };\n gradient = g.createLinearGradient(box.x, box.y, box.x, box.y + box.height);\n gradient.addColorStop(0, Color.WHITE.withAlpha(0).toString());\n gradient.addColorStop(1, Color.WHITE.withAlpha(40 / 255).toString());\n g.fillEllipse({\n cx: box.x + (box.width / 2),\n cy: box.y + (box.height / 2),\n rx: box.width / 2,\n ry: box.height / 2,\n gradient,\n });\n }\n }\n\n private drawRamp(g: Graphics, width: number, height: number, limits: DisplayLimits) {\n const area = shrink({ x: this.x, y: this.y, width, height }, width / 4, height / 4);\n const rampArea = { ...area };\n rampArea.width = Math.min(area.width, area.height);\n rampArea.height = area.width;\n\n const ramp = new Ramp(10 * this.scale, 225, 315);\n ramp.lolo = limits.lolo;\n ramp.loloColor = this.colorLoLo;\n ramp.lo = limits.lo;\n ramp.loColor = this.colorLo;\n ramp.hi = limits.hi;\n ramp.hiColor = this.colorHi;\n ramp.hihi = limits.hihi;\n ramp.hihiColor = this.colorHiHi;\n ramp.minimum = limits.min;\n ramp.maximum = limits.max;\n ramp.effect3d = this.effect3d;\n ramp.gradient = this.rampGradient;\n ramp.logScale = this.logScale;\n ramp.draw(g, area, rampArea);\n }\n\n private drawLabel(g: Graphics, width: number, height: number) {\n // A font property is exposed in the UI, but it seems to get ignored in favour of arial 12 bold.\n const font = Font.ARIAL_12_BOLD.scale(this.scale);\n if (this.pv?.value !== undefined) {\n const text = this.formatLabelValue(this.pv.value);\n const fm = g.measureText(text, font);\n g.fillText({\n x: this.x + width / 2 - fm.width / 2,\n y: this.y + height * 7 / 8 - fm.height / 2,\n color: this.foregroundColor,\n align: 'left',\n baseline: 'top',\n font,\n text,\n });\n }\n }\n\n private drawNeedle(g: Graphics, width: number, height: number, limits: DisplayLimits) {\n const cx = this.x + (width / 2);\n const cy = this.y + (height / 2);\n let valuePosition;\n if (this.pv?.value !== undefined) {\n const v = this.getValueInRange(this.pv.value, limits);\n valuePosition = 360 - this.getValuePosition(v, limits);\n if (limits.max > limits.min) {\n if (v > limits.max) {\n valuePosition += 10;\n } else if (v < limits.min) {\n valuePosition -= 10;\n }\n } else {\n if (v > limits.min) {\n valuePosition -= 10;\n } else if (v < limits.max) {\n valuePosition += 10;\n }\n }\n } else {\n valuePosition = 360 - this.getValuePosition((limits.min + limits.max) / 2, limits);\n }\n\n const angle = toRadians(valuePosition);\n const { scale } = this;\n const { needleDiameter, majorTickLength, gapBetweenNeedleScale } = this;\n const p1 = rotatePoint(cx, cy - needleDiameter / 2 + (3 * scale), cx, cy, angle);\n const p2 = rotatePoint(cx + width / 2 - majorTickLength - gapBetweenNeedleScale, cy, cx, cy, angle);\n const p3 = rotatePoint(cx, cy + needleDiameter / 2 - (3 * scale), cx, cy, angle);\n g.fillPath({\n color: this.needleColor,\n path: new Path(p1.x, p1.y)\n .lineTo(p2.x, p2.y)\n .lineTo(p3.x, p3.y)\n .closePath()\n });\n }\n\n private drawNeedleCenter(g: Graphics, width: number, height: number) {\n const { needleDiameter } = this;\n const cx = this.x + (width / 2);\n const cy = this.y + (height / 2);\n const rx = needleDiameter / 2;\n const ry = needleDiameter / 2;\n if (this.effect3d) {\n const gradient = g.createLinearGradient(cx - rx, cy - ry, cx + rx, cy + ry);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, BORDER_COLOR.toString());\n g.fillEllipse({ cx, cy, rx, ry, gradient });\n } else {\n g.fillEllipse({ cx, cy, rx, ry, color: Color.GRAY });\n }\n }\n\n private getValueInRange(v: number, limits: DisplayLimits) {\n if (limits.min <= v && v <= limits.max) {\n return v;\n } else {\n return v > limits.max ? limits.max : limits.min;\n }\n }\n\n private getValuePosition(v: number, limits: DisplayLimits) {\n const lengthInDegrees = 360 - (END_ANGLE - START_ANGLE);\n\n let valuePosition;\n if (this.logScale) {\n valuePosition = START_ANGLE - ((Math.log10(v) - Math.log10(limits.min))\n / (Math.log10(limits.max) - Math.log10(limits.min)) * lengthInDegrees);\n } else {\n valuePosition = START_ANGLE - ((v - limits.min) / (limits.max - limits.min) * lengthInDegrees);\n }\n\n if (valuePosition < 0) {\n valuePosition += 360;\n }\n\n return valuePosition;\n }\n\n private formatLabelValue(value: number) {\n if (this.valueLabelFormat) {\n return new DecimalFormat(this.valueLabelFormat).format(value);\n } else {\n return String(Number(value.toFixed(3)));\n }\n }\n\n get needleDiameter() {\n return this.scale * NEEDLE_DIAMETER;\n }\n\n get majorTickLength() {\n return this.scale * MAJOR_TICK_LENGTH;\n }\n\n get minorTickLength() {\n return this.scale * MINOR_TICK_LENGTH;\n }\n\n get gapBetweenNeedleScale() {\n return this.scale * GAP_BTW_NEEDLE_SCALE;\n }\n\n get colorLo(): Color { return this.properties.getValue(PROP_COLOR_LO); }\n get colorLoLo(): Color { return this.properties.getValue(PROP_COLOR_LOLO); }\n get colorHi(): Color { return this.properties.getValue(PROP_COLOR_HI); }\n get colorHiHi(): Color { return this.properties.getValue(PROP_COLOR_HIHI); }\n get effect3d(): boolean { return this.properties.getValue(PROP_EFFECT_3D); }\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n get levelLo(): number { return this.properties.getValue(PROP_LEVEL_LO); }\n get levelLoLo(): number { return this.properties.getValue(PROP_LEVEL_LOLO); }\n get levelHi(): number { return this.properties.getValue(PROP_LEVEL_HI); }\n get levelHiHi(): number { return this.properties.getValue(PROP_LEVEL_HIHI); }\n get limitsFromPv(): boolean { return this.properties.getValue(PROP_LIMITS_FROM_PV); }\n get logScale(): boolean { return this.properties.getValue(PROP_LOG_SCALE); }\n get minimum(): number { return this.properties.getValue(PROP_MINIMUM); }\n get maximum(): number { return this.properties.getValue(PROP_MAXIMUM); }\n get needleColor(): Color { return this.properties.getValue(PROP_NEEDLE_COLOR); }\n get rampGradient(): boolean { return this.properties.getValue(PROP_RAMP_GRADIENT); }\n get showRamp(): boolean { return this.properties.getValue(PROP_SHOW_RAMP); }\n get valueLabelFormat(): string { return this.properties.getValue(PROP_VALUE_LABEL_FORMAT); }\n}\n","import { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics } from '../../Graphics';\nimport { BooleanProperty, FontProperty, IntProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_BIT = 'bit';\nconst PROP_DATA_TYPE = 'data_type';\nconst PROP_OFF_IMAGE = 'off_image';\nconst PROP_OFF_LABEL = 'off_label';\nconst PROP_FONT = 'font';\nconst PROP_ON_IMAGE = 'on_image';\nconst PROP_ON_LABEL = 'on_label';\nconst PROP_SHOW_BOOLEAN_LABEL = 'show_boolean_label';\n\nexport class ImageBooleanIndicator extends Widget {\n\n private onImageElement?: HTMLImageElement;\n private onImageLoaded = false;\n\n private offImageElement?: HTMLImageElement;\n private offImageLoaded = false;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new IntProperty(PROP_BIT));\n this.properties.add(new IntProperty(PROP_DATA_TYPE));\n this.properties.add(new StringProperty(PROP_OFF_IMAGE));\n this.properties.add(new StringProperty(PROP_OFF_LABEL));\n this.properties.add(new StringProperty(PROP_ON_IMAGE));\n this.properties.add(new StringProperty(PROP_ON_LABEL));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new BooleanProperty(PROP_SHOW_BOOLEAN_LABEL));\n }\n\n init() {\n this.onImageElement = new Image();\n this.onImageElement.onload = () => {\n this.onImageLoaded = true;\n this.requestRepaint();\n };\n this.offImageElement = new Image();\n this.offImageElement.onload = () => {\n this.offImageLoaded = true;\n this.requestRepaint();\n };\n\n if (this.onImage) {\n this.onImageElement.src = this.resolvePath(this.onImage);\n }\n if (this.offImage) {\n this.offImageElement.src = this.resolvePath(this.offImage);\n }\n }\n\n get booleanValue() {\n if (this.bit < 0) {\n return Boolean(this.pv?.toNumber());\n } else if (this.pv?.value !== undefined) {\n return ((this.pv?.value >> this.bit) & 1) > 0;\n } else {\n return false;\n }\n }\n\n get image(): string {\n return this.booleanValue ? this.onImage : this.offImage;\n }\n\n get label(): string {\n return this.booleanValue ? this.onLabel : this.offLabel;\n }\n\n draw(g: Graphics) {\n if (!this.transparent) {\n g.fillRect({\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n color: this.backgroundColor,\n });\n }\n\n if (this.booleanValue) {\n if (this.onImageLoaded) {\n g.ctx.drawImage(this.onImageElement!, this.x, this.y, this.width, this.height);\n }\n } else {\n if (this.offImageLoaded) {\n g.ctx.drawImage(this.offImageElement!, this.x, this.y, this.width, this.height);\n }\n }\n\n if (this.showBooleanLabel) {\n g.fillText({\n x: this.x + this.width / 2,\n y: this.y + this.height / 2,\n font: this.font,\n baseline: 'middle',\n align: 'center',\n color: this.foregroundColor,\n text: this.label,\n });\n }\n }\n\n get bit(): number { return this.properties.getValue(PROP_BIT); }\n get dataType(): number { return this.properties.getValue(PROP_DATA_TYPE); }\n get showBooleanLabel(): boolean { return this.properties.getValue(PROP_SHOW_BOOLEAN_LABEL); }\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n get offLabel(): string { return this.properties.getValue(PROP_OFF_LABEL); }\n get offImage(): string { return this.properties.getValue(PROP_OFF_IMAGE); }\n get onLabel(): string { return this.properties.getValue(PROP_ON_LABEL); }\n get onImage(): string { return this.properties.getValue(PROP_ON_IMAGE); }\n}\n","import { Color } from '../../Color';\nimport { DecimalFormat } from '../../DecimalFormat';\nimport { Font } from '../../Font';\nimport { Graphics, Path } from '../../Graphics';\nimport { Range } from '../../Range';\n\nconst months = ['January', 'February', 'March', 'April',\n 'May', 'June', 'July', 'August', 'September', 'October',\n 'November', 'December'];\n\ninterface FormatDateOptions {\n year: boolean;\n month: boolean;\n day: boolean;\n}\n\ninterface FormatTimeOptions {\n hours: boolean;\n minutes: boolean;\n seconds: boolean;\n milliseconds: boolean;\n};\n\nexport class LinearScale {\n\n private labels: string[] = [];\n private labelValues: number[] = [];\n private labelPositions: number[] = [];\n private labelVisibilities: boolean[] = [];\n private gridStepInPixel = 0;\n private horizontal = false;\n private x = 0;\n private y = 0;\n\n public scaleFormat = '';\n public timeFormat = 0;\n public length = 0;\n public margin = 0;\n\n constructor(\n private scale: number,\n private scaleFont: Font,\n private minimum: number,\n private maximum: number,\n private logScale: boolean,\n private majorTickStepHint: number,\n private foregroundColor: Color,\n private showMinorTicks: boolean,\n private showScale: boolean,\n ) { }\n\n get scaleLength() {\n return this.length - (2 * this.margin);\n }\n\n /** Only available post-draw */\n getX() {\n return this.x;\n }\n\n /** Only available post-draw */\n getY() {\n return this.y;\n }\n\n /** Only available post-draw */\n getGridPositions() {\n let result = [...this.labelPositions];\n if (!this.horizontal) {\n result = result.map(pos => this.length - pos);\n }\n result.pop();\n result.shift();\n return result;\n }\n\n /**\n * Use only when the scale is not drawn, but you still need\n * getValuePosition to work.\n */\n setDimensions(x: number, y: number, length: number, horizontal: boolean) {\n this.x = x;\n this.y = y;\n this.length = length;\n this.horizontal = horizontal;\n }\n\n getValuePosition(value: number) {\n let { start: min, stop: max } = this.getMinMax();\n\n let pixelsToStart = 0;\n const l = this.length - (2 * this.margin);\n if (this.logScale) {\n if (value <= 0) {\n pixelsToStart = this.margin;\n } else {\n pixelsToStart = ((Math.log10(value) - Math.log10(min)) / (Math.log10(max) - Math.log10(min)) * l) + this.margin;\n }\n } else {\n const f = Math.max(Math.abs(min), Math.abs(max));\n max /= f;\n min /= f;\n const t = max - min;\n pixelsToStart = ((value / f - min) / t * l) + this.margin;\n }\n\n return this.horizontal ? pixelsToStart + this.x : this.length - pixelsToStart + this.y;\n }\n\n getMinMax(): Range {\n let start = this.minimum;\n let stop = this.maximum;\n if (this.logScale) {\n if (start <= 0) {\n start = 0.1;\n }\n if (stop <= start) {\n stop = start + 100;\n }\n }\n return { start, stop };\n }\n\n getPositionValue(absolutePosition: number) {\n const range = this.getMinMax();\n let { start: min, stop: max } = range;\n\n const pixelsToStart = this.horizontal\n ? absolutePosition - this.x\n : this.length + this.y - absolutePosition;\n const l = this.length - (2 * this.margin);\n\n let value;\n if (this.logScale) {\n value = Math.pow(10, (pixelsToStart - this.margin)\n * (Math.log10(max) - Math.log10(min))\n / l + Math.log10(min));\n } else {\n const f = Math.max(Math.abs(min), Math.abs(max));\n max /= f;\n min /= f;\n const t = max - min;\n value = ((pixelsToStart - this.margin) / l * t + min) * f;\n }\n\n return value;\n }\n\n calculateMargin(g: Graphics, horizontal: boolean) {\n if (this.showScale) {\n const fm1 = g.measureText(this.format(this.minimum), this.scaleFont);\n const fm2 = g.measureText(this.format(this.maximum), this.scaleFont);\n if (horizontal) {\n return Math.ceil(Math.max(fm1.width, fm2.width) / 2);\n } else {\n return Math.ceil(Math.max(fm1.height, fm2.height) / 2);\n }\n } else {\n return 0;\n }\n }\n\n measureHorizontalHeight(g: Graphics) {\n const fm = g.measureText(\"dummy\", this.scaleFont);\n return this.showScale ? fm.height + this.spaceBetweenMarkAndLabel + this.majorTickLength : 0;\n }\n\n // (x, y) is coordinate of bottom-left corner\n drawHorizontal(g: Graphics, x: number, y: number, width: number) {\n const { scale } = this;\n this.length = width;\n this.horizontal = true;\n this.margin = this.calculateMargin(g, this.horizontal);\n const l = width - (2 * this.margin);\n if (l > 0) {\n this.updateLabels(g, l);\n }\n let maxHeight = 0;\n for (let i = 0; i < this.labels.length; i++) {\n const fm = g.measureText(this.labels[i], this.scaleFont);\n if (fm.height > maxHeight) {\n maxHeight = fm.height;\n }\n }\n\n const scaleHeight = this.showScale ? maxHeight + this.spaceBetweenMarkAndLabel + this.majorTickLength : 0;\n y = y - scaleHeight;\n this.x = x;\n this.y = y;\n\n if (this.logScale) {\n for (let i = 0; i < this.labelPositions.length; i++) {\n const x = this.x + this.labelPositions[i];\n const y = this.y;\n let tickLength = 0;\n if (this.labelVisibilities[i]) {\n tickLength = this.majorTickLength;\n } else {\n tickLength = this.minorTickLength;\n }\n\n if (this.labelVisibilities[i] || this.showMinorTicks) {\n const pathX = Math.round(x) - (scale * 0.5);\n g.strokePath({\n path: new Path(pathX, y).lineTo(pathX, y + tickLength),\n color: this.foregroundColor,\n lineWidth: scale * 1,\n opacity: 100 / 255,\n });\n }\n if (this.labelVisibilities[i]) {\n g.fillText({\n x,\n y: this.y + this.spaceBetweenMarkAndLabel + this.majorTickLength,\n align: 'center',\n baseline: 'top',\n font: this.scaleFont,\n color: this.foregroundColor,\n text: this.labels[i],\n });\n }\n }\n } else {\n for (let i = 0; i < this.labels.length; i++) {\n const textX = x + this.labelPositions[i];\n if (this.labelVisibilities[i]) {\n g.fillText({\n x: textX,\n y: y + this.majorTickLength + this.spaceBetweenMarkAndLabel,\n align: 'center',\n baseline: 'top',\n font: this.scaleFont,\n color: this.foregroundColor,\n text: this.labels[i],\n });\n }\n const pathX = Math.round(textX) - (scale * 0.5);\n g.strokePath({\n path: new Path(pathX, y).lineTo(pathX, y + this.majorTickLength),\n color: this.foregroundColor,\n lineWidth: scale * 1,\n opacity: 100 / 255,\n });\n\n if (this.showMinorTicks) {\n this.drawMinorXTicks(g, i, x, y);\n }\n }\n }\n return scaleHeight;\n }\n\n // If leftCoordinate, the provided (x, y) is used as the fixed top left corner.\n // Else, the provided (x, y) is used as the fixed top right corner.\n drawVertical(g: Graphics, x: number, y: number, height: number, leftCoordinate: boolean, ticksLeft = false) {\n const { scale } = this;\n this.length = height;\n this.horizontal = false;\n this.margin = this.calculateMargin(g, this.horizontal);\n const l = height - (2 * this.margin);\n if (l > 0) {\n this.updateLabels(g, l);\n }\n let maxWidth = 0;\n for (let i = 0; i < this.labels.length; i++) {\n const fm = g.measureText(this.labels[i], this.scaleFont);\n if (fm.width > maxWidth) {\n maxWidth = fm.width;\n }\n }\n\n const scaleWidth = this.showScale ? maxWidth + this.spaceBetweenMarkAndLabel + this.majorTickLength : 0;\n if (!leftCoordinate) {\n x = x - scaleWidth;\n }\n this.x = x;\n this.y = y;\n\n if (this.logScale) {\n for (let i = 0; i < this.labelPositions.length; i++) {\n let tickLength;\n if (this.labelVisibilities[i]) {\n tickLength = this.majorTickLength;\n } else {\n tickLength = this.minorTickLength;\n }\n const startX = x + maxWidth + this.spaceBetweenMarkAndLabel\n - (1 * scale) + this.majorTickLength - tickLength;\n const pathY = Math.round(y + height - this.labelPositions[i]) - (scale * 0.5);\n if (this.labelVisibilities[i] || this.showMinorTicks) {\n g.strokePath({\n path: new Path(startX, pathY).lineTo(startX + tickLength, pathY),\n color: this.foregroundColor,\n lineWidth: scale * 1,\n opacity: 100 / 255,\n });\n }\n if (this.labelVisibilities[i]) {\n const textY = y + height - this.labelPositions[i];\n g.fillText({\n x,\n y: textY,\n align: 'left',\n baseline: 'middle',\n font: this.scaleFont,\n color: this.foregroundColor,\n text: this.labels[i],\n });\n }\n }\n } else {\n for (let i = 0; i < this.labels.length; i++) {\n const textY = y + height - this.labelPositions[i];\n const pathY = Math.round(textY) - (scale * 0.5);\n if (ticksLeft) {\n g.strokePath({\n path: new Path(x, pathY).lineTo(x + this.majorTickLength, pathY),\n color: this.foregroundColor,\n lineWidth: scale * 1,\n opacity: 100 / 255,\n });\n if (this.labelVisibilities[i]) {\n const textX = x + this.majorTickLength + this.spaceBetweenMarkAndLabel;\n g.fillText({\n x: textX,\n y: textY,\n align: 'left',\n baseline: 'middle',\n font: this.scaleFont,\n color: this.foregroundColor,\n text: this.labels[i],\n });\n }\n } else {\n if (this.labelVisibilities[i]) {\n g.fillText({\n x,\n y: textY,\n align: 'left',\n baseline: 'middle',\n font: this.scaleFont,\n color: this.foregroundColor,\n text: this.labels[i],\n });\n }\n const startX = x + maxWidth + this.spaceBetweenMarkAndLabel - (scale * 1);\n g.strokePath({\n path: new Path(startX, pathY).lineTo(startX + this.majorTickLength, pathY),\n color: this.foregroundColor,\n lineWidth: scale * 1,\n opacity: 100 / 255,\n });\n\n if (this.showMinorTicks) {\n this.drawMinorYTicks(g, i, startX, y + height);\n }\n }\n }\n }\n return scaleWidth;\n }\n\n private drawMinorXTicks(g: Graphics, i: number, x0: number, y: number) {\n const { gridStepInPixel } = this;\n let minorTicksNumber;\n let minorGridStepInPixel;\n if (gridStepInPixel / 5 >= this.minorTickMarkStepHint) {\n minorTicksNumber = 5;\n minorGridStepInPixel = Math.floor(gridStepInPixel / 5);\n } else if (gridStepInPixel / 4 >= this.minorTickMarkStepHint) {\n minorTicksNumber = 4;\n minorGridStepInPixel = Math.floor(gridStepInPixel / 4);\n } else {\n minorTicksNumber = 2;\n minorGridStepInPixel = Math.floor(gridStepInPixel / 2);\n }\n\n const { labelPositions, minorTickLength, scale } = this;\n if (i > 0) {\n // First and last step sometimes don't need all ticks.\n if (i === 1 && (labelPositions[1] - labelPositions[0] < gridStepInPixel)) {\n let x = labelPositions[1];\n while (x - labelPositions[0] > minorGridStepInPixel + (3 * scale)) {\n x = x - minorGridStepInPixel;\n const tickX = Math.round(x0 + x) - (scale * 0.5);\n g.strokePath({\n path: new Path(tickX, y).lineTo(tickX, y + minorTickLength),\n color: this.foregroundColor,\n lineWidth: scale * 1,\n opacity: 100 / 255,\n });\n }\n } else if (i === labelPositions.length - 1\n && (labelPositions[i] - labelPositions[i - 1] < gridStepInPixel)) {\n let x = labelPositions[i - 1];\n while (labelPositions[i] - x > minorGridStepInPixel + (3 * scale)) {\n x = x + minorGridStepInPixel;\n const tickX = Math.round(x0 + x) - (scale * 0.5);\n g.strokePath({\n path: new Path(tickX, y).lineTo(tickX, y + minorTickLength),\n color: this.foregroundColor,\n lineWidth: scale * 1,\n opacity: 100 / 255,\n });\n }\n } else { // Normal step\n for (let j = 0; j < minorTicksNumber; j++) {\n let tickX = x0 + labelPositions[i - 1]\n + (labelPositions[i] - labelPositions[i - 1]) * j / minorTicksNumber;\n tickX = Math.round(tickX) - (scale * 0.5);\n g.strokePath({\n path: new Path(tickX, y).lineTo(tickX, y + minorTickLength),\n color: this.foregroundColor,\n lineWidth: scale * 1,\n opacity: 100 / 255,\n });\n }\n }\n }\n }\n\n private drawMinorYTicks(g: Graphics, i: number, x: number, scaleY2: number) {\n const { gridStepInPixel } = this;\n let minorTicksNumber;\n let minorGridStepInPixel;\n if (gridStepInPixel / 5 >= this.minorTickMarkStepHint) {\n minorTicksNumber = 5;\n minorGridStepInPixel = Math.floor(gridStepInPixel / 5);\n } else if (gridStepInPixel / 4 >= this.minorTickMarkStepHint) {\n minorTicksNumber = 4;\n minorGridStepInPixel = Math.floor(gridStepInPixel / 4);\n } else {\n minorTicksNumber = 2;\n minorGridStepInPixel = Math.floor(gridStepInPixel / 2);\n }\n\n const { labelPositions, minorTickLength, majorTickLength, scale } = this;\n if (i > 0) {\n // First and last step sometimes don't need all ticks.\n if (i === 1 && (labelPositions[1] - labelPositions[0] < gridStepInPixel)) {\n let y = labelPositions[1];\n while (y - labelPositions[0] > minorGridStepInPixel + (3 * scale)) {\n y -= minorGridStepInPixel;\n const pathY = Math.round(scaleY2 - y) - (scale * 0.5);\n g.strokePath({\n path: new Path(x + majorTickLength - minorTickLength, pathY)\n .lineTo(x + majorTickLength, pathY),\n color: this.foregroundColor,\n lineWidth: scale * 1,\n opacity: 100 / 255,\n });\n }\n } else if (i === labelPositions.length - 1\n && (labelPositions[i] - labelPositions[i - 1] < gridStepInPixel)) {\n let y = labelPositions[i - 1];\n while (labelPositions[i] - y > minorGridStepInPixel + (3 * scale)) {\n y += minorGridStepInPixel;\n const pathY = Math.round(scaleY2 - y) - (scale * 0.5);\n g.strokePath({\n path: new Path(x + majorTickLength - minorTickLength, pathY)\n .lineTo(x + majorTickLength, pathY),\n color: this.foregroundColor,\n lineWidth: scale * 1,\n opacity: 100 / 255,\n });\n }\n } else { // Normal step\n for (let j = 0; j < minorTicksNumber; j++) {\n let y = scaleY2 - labelPositions[i - 1]\n - (labelPositions[i] - labelPositions[i - 1]) * j / minorTicksNumber;\n y = Math.round(y) - (scale * 0.5);\n g.strokePath({\n path: new Path(x + majorTickLength - minorTickLength, y)\n .lineTo(x + majorTickLength, y),\n color: this.foregroundColor,\n lineWidth: scale * 1,\n opacity: 100 / 255,\n });\n }\n }\n }\n }\n\n private updateLabels(g: Graphics, length: number) {\n this.labels = [];\n this.labelValues = [];\n this.labelPositions = [];\n if (this.showScale) {\n if (this.logScale) {\n this.updateLabelsForLogScale(this.minimum, this.maximum, length);\n } else {\n const gridStep = this.getGridStep(length, this.minimum, this.maximum);\n const f = Math.max(Math.abs(this.minimum), Math.abs(this.maximum));\n const t = this.maximum / f - this.minimum / f;\n this.gridStepInPixel = Math.floor(length * (gridStep / f) / t);\n this.updateLabelsForLinearScale(this.minimum, this.maximum, length, gridStep);\n }\n }\n this.updateVisibility(g);\n }\n\n private getGridStep(lengthInPixels: number, minimum: number, maximum: number): number {\n if (lengthInPixels <= 0) {\n lengthInPixels = 1;\n }\n let minBigger = false;\n if (minimum >= maximum) {\n if (maximum === minimum) {\n maximum++;\n } else {\n minBigger = true;\n const swap = minimum;\n minimum = maximum;\n maximum = swap;\n }\n }\n\n const length = Math.abs(maximum - minimum);\n\n let majorTickMarkStepHint = this.majorTickStepHint;\n if (majorTickMarkStepHint > lengthInPixels) {\n majorTickMarkStepHint = lengthInPixels;\n }\n let gridStepHint = length / lengthInPixels * majorTickMarkStepHint;\n\n let mantissa = gridStepHint;\n let exp = 0;\n if (mantissa < 1) {\n if (mantissa != 0)\n while (mantissa < 1) {\n mantissa *= 10.0;\n exp--;\n }\n } else {\n while (mantissa >= 10) {\n mantissa /= 10.0;\n exp++;\n }\n }\n\n let gridStep;\n if (mantissa > 7.5) {\n gridStep = 10 * Math.pow(10, exp);\n } else if (mantissa > 3.5) {\n gridStep = 5 * Math.pow(10, exp);\n } else if (mantissa > 1.5) {\n gridStep = 2 * Math.pow(10, exp);\n } else {\n gridStep = Math.pow(10, exp);\n }\n if (minBigger) {\n gridStep = -gridStep;\n }\n return gridStep;\n }\n\n private updateLabelsForLogScale(min: number, max: number, length: number) {\n if (min <= 0) {\n min = 0.1;\n }\n if (max <= min) {\n max = min + 100;\n }\n\n const minBigger = max < min;\n\n const logMin = Math.log10(min);\n const minLogDigit = Math.ceil(logMin);\n const maxLogDigit = Math.ceil(Math.log10(max));\n\n let tickStep = Math.pow(10, minLogDigit - 1);\n let firstPosition;\n\n if ((min % tickStep) <= 0) {\n firstPosition = min - (min % tickStep);\n } else {\n if (minBigger) {\n firstPosition = min - (min % tickStep);\n } else {\n firstPosition = min - (min % tickStep) + tickStep;\n }\n }\n\n if (minBigger && min > firstPosition) {\n this.addMinMaxTickInfo(min, length, true);\n } else if (!minBigger && min < firstPosition) {\n this.addMinMaxTickInfo(min, length, true);\n }\n\n for (let i = minLogDigit; minBigger ? i >= maxLogDigit : i <= maxLogDigit; i += minBigger ? -1 : 1) {\n // if the range is too big skip minor ticks\n if (Math.abs(maxLogDigit - minLogDigit) > 20) {\n const v = Math.pow(10, i);\n if (v > max) {\n break;\n }\n this.addTickInfo(v, max, logMin, length);\n } else {\n for (let j = firstPosition; minBigger ? j >= Math.pow(10, i - 1)\n : j <= Math.pow(10, i); j = minBigger ? (j - tickStep) : (j + tickStep)) {\n if (minBigger ? j < max : j > max) {\n break;\n }\n this.addTickInfo(j, max, logMin, length);\n }\n tickStep = minBigger ? (tickStep / Math.pow(10, 1)) : (tickStep * Math.pow(10, 1));\n firstPosition = minBigger ? Math.pow(10, i - 1) : (tickStep + Math.pow(10, i));\n }\n }\n\n if (minBigger ? max < this.labelValues[this.labelValues.length - 1]\n : max > this.labelValues[this.labelValues.length - 1]) {\n this.addMinMaxTickInfo(max, length, false);\n }\n }\n\n private addMinMaxTickInfo(value: number, length: number, isMin: boolean) {\n if (isMin) {\n this.labelValues.push(value);\n this.labels.push(this.format(value));\n this.labelPositions.push(this.margin);\n } else {\n this.labelValues.push(value);\n this.labels.push(this.format(value));\n this.labelPositions.push(this.margin + length);\n }\n }\n\n private addTickInfo(d: number, max: number, logMin: number, length: number) {\n this.labels.push(this.format(d));\n const labelPosition = Math.floor((Math.log10(d) - logMin) / (Math.log10(max) - logMin) * length)\n + this.margin;\n this.labelPositions.push(labelPosition);\n this.labelValues.push(d);\n }\n\n private updateLabelsForLinearScale(min: number, max: number, length: number, tickStep: number) {\n const minBigger = max < min;\n let firstPosition;\n\n // make firstPosition as the right most of min based on tickStep\n if (min % tickStep <= 0) {\n firstPosition = min - min % tickStep;\n } else {\n firstPosition = min - min % tickStep + tickStep;\n }\n\n if (min > firstPosition == minBigger) {\n this.labelValues.push(min);\n this.labels.push(this.format(min));\n this.labelPositions.push(this.margin);\n }\n\n let i = 1;\n const f = Math.max(Math.abs(min), Math.abs(max));\n max /= f;\n min /= f;\n tickStep /= f;\n firstPosition /= f;\n const t = max - min;\n for (let p = firstPosition; max >= min ? p < max : p > max; p = firstPosition + i++ * tickStep) {\n const b = p * f;\n this.labels.push(this.format(b));\n this.labelValues.push(b);\n\n const tickLabelPosition = Math.floor((p - min) / t * length) + this.margin;\n this.labelPositions.push(tickLabelPosition);\n }\n\n max *= f;\n this.labelValues.push(max);\n this.labels.push(this.format(max));\n this.labelPositions.push(this.margin + length);\n }\n\n private updateVisibility(g: Graphics) {\n this.labelVisibilities = [];\n if (!this.labelPositions.length) {\n return;\n }\n\n for (let i = 0; i < this.labelPositions.length; i++) {\n this.labelVisibilities.push(true);\n }\n\n // set the tick label visibility\n let previousPosition = 0;\n let previousLabel = null;\n for (let i = 0; i < this.labelPositions.length; i++) {\n let hasSpaceToDraw = true;\n const currentLabel = this.labels[i];\n const currentPosition = this.labelPositions[i];\n if (i !== 0) {\n hasSpaceToDraw = this.hasSpaceToDraw(g, previousPosition, currentPosition, previousLabel || '', currentLabel);\n }\n\n const isRepeatSameTickAndNotEnd = (currentLabel === previousLabel)\n && (i !== 0 && i !== this.labelPositions.length - 1);\n\n let isMajorTickOrEnd = true;\n if (this.logScale) {\n const prettyNumber = Number(this.labels[i]);\n isMajorTickOrEnd = this.isMajorTick(prettyNumber) || i === 0 || i === this.labelPositions.length - 1;\n }\n\n if (!hasSpaceToDraw || isRepeatSameTickAndNotEnd || !isMajorTickOrEnd) {\n this.labelVisibilities[i] = false;\n } else {\n previousPosition = currentPosition;\n previousLabel = currentLabel;\n }\n }\n }\n\n private hasSpaceToDraw(g: Graphics, previousPosition: number, tickLabelPosition: number, previousTickLabel: string, tickLabel: string) {\n const tickLabelSize = g.measureText(tickLabel, this.scaleFont);\n const previousTickLabelSize = g.measureText(previousTickLabel, this.scaleFont);\n let interval = tickLabelPosition - previousPosition;\n let textLength = Math.floor(this.horizontal ? (tickLabelSize.width / 2.0 + previousTickLabelSize.width / 2.0)\n : tickLabelSize.height);\n let noLapOnPrevious = true;\n let noLapOnEnd = true;\n // if it is not the end tick label\n if (tickLabelPosition != this.labelPositions[this.labelPositions.length - 1]) {\n noLapOnPrevious = interval > (textLength + this.tickLabelGap);\n const endTickLabelSize = g.measureText(this.labels[this.labels.length - 1], this.scaleFont);\n interval = this.labelPositions[this.labelPositions.length - 1] - tickLabelPosition;\n textLength = Math.floor(this.horizontal ? (tickLabelSize.width / 2.0 + endTickLabelSize.width / 2.0)\n : tickLabelSize.height);\n noLapOnEnd = interval > textLength + this.tickLabelGap;\n }\n return noLapOnPrevious && noLapOnEnd;\n }\n\n private isMajorTick(tickValue: number) {\n if (!this.logScale) {\n return true;\n }\n\n const log10 = Math.log10(tickValue);\n if (log10 === Math.round(log10)) {\n return true;\n }\n\n return false;\n }\n\n private format(v: number) {\n if (this.timeFormat === 0) {\n if (this.scaleFormat) {\n return new DecimalFormat(this.scaleFormat).format(v);\n } else {\n return String(Number(v.toFixed(2)));\n }\n }\n\n const dt = new Date(v);\n switch (this.timeFormat) {\n case 1: // yyyy-MM-dd HH:mm:ss\n return this.formatDate(dt, {\n year: true,\n month: true,\n day: true,\n }) + '\\n' + this.formatTime(dt, {\n hours: true,\n minutes: true,\n seconds: true,\n milliseconds: false,\n });\n case 2: // yyyy-MM-dd HH:mm:ss.SSS\n return this.formatDate(dt, {\n year: true,\n month: true,\n day: true,\n }) + '\\n' + this.formatTime(dt, {\n hours: true,\n minutes: true,\n seconds: true,\n milliseconds: true,\n });\n case 3: // HH:mm:ss\n return this.formatTime(dt, {\n hours: true,\n minutes: true,\n seconds: true,\n milliseconds: false,\n });\n case 4: // HH:mm:ss.SSS\n return this.formatTime(dt, {\n hours: true,\n minutes: true,\n seconds: true,\n milliseconds: true,\n });\n case 5: // HH:mm\n return this.formatTime(dt, {\n hours: true,\n minutes: true,\n seconds: false,\n milliseconds: false,\n });\n case 6: // yyyy-MM-dd\n return this.formatDate(dt, {\n year: true,\n month: true,\n day: true,\n });\n case 7: // MMMMM d\n const mmmmm = months[dt.getUTCMonth()];\n const d = dt.getUTCDate();\n return `${mmmmm} ${d}`;\n case 8: // Auto\n const length = Math.abs(this.maximum - this.minimum);\n if (length <= 5000) { // ss.SSS\n return this.formatTime(dt, {\n hours: false,\n minutes: false,\n seconds: true,\n milliseconds: true,\n });\n } else if (length <= 1800000) { // HH:mm:ss\n return this.formatTime(dt, {\n hours: true,\n minutes: true,\n seconds: true,\n milliseconds: false,\n });\n } else if (length <= 86400000) { // HH:mm\n return this.formatTime(dt, {\n hours: true,\n minutes: true,\n seconds: false,\n milliseconds: false,\n });\n } else if (length <= 604800000) { // MM-dd HH:mm\n return this.formatDate(dt, {\n year: false,\n month: true,\n day: true,\n }) + '\\n' + this.formatTime(dt, {\n hours: true,\n minutes: true,\n seconds: false,\n milliseconds: false,\n });\n } else if (length <= 2592000000) { // MM-dd\n return this.formatDate(dt, {\n year: false,\n month: true,\n day: true,\n });\n } else { // yyyy-MM-dd\n return this.formatDate(dt, {\n year: true,\n month: true,\n day: true,\n });\n }\n }\n return '';\n }\n\n private formatDate(dt: Date, opts: FormatDateOptions) {\n let result = '';\n if (opts.year) {\n result += dt.getUTCFullYear();\n }\n if (opts.month) {\n if (opts.year) {\n result += '-';\n }\n const month = dt.getUTCMonth();\n result += (month < 10 ? '0' : '') + month;\n }\n if (opts.day) {\n if (opts.month) {\n result += '-';\n }\n const day = dt.getUTCDate();\n result += (day < 10 ? '0' : '') + day;\n }\n return result;\n }\n\n private formatTime(dt: Date, opts: FormatTimeOptions) {\n let result = '';\n if (opts.hours) {\n const h = dt.getUTCHours();\n result += (h < 10 ? '0' : '') + h;\n }\n if (opts.minutes) {\n if (opts.hours) {\n result += ':';\n }\n const m = dt.getUTCMinutes();\n result += (m < 10 ? '0' : '') + m;\n }\n if (opts.seconds) {\n if (opts.minutes) {\n result += ':';\n }\n const s = dt.getUTCSeconds();\n result += (s < 10 ? '0' : '') + s;\n }\n if (opts.milliseconds) {\n if (opts.seconds) {\n result += '.';\n }\n const ms = dt.getUTCMilliseconds();\n result += (ms < 10 ? '00' : ms < 100 ? '0' : '') + ms;\n }\n return result;\n }\n\n get spaceBetweenMarkAndLabel() { return this.scale * 2; }\n get majorTickLength() { return this.scale * 6; }\n get minorTickLength() { return this.scale * 3; }\n get minorTickMarkStepHint() { return this.scale * 4; }\n get tickLabelGap() { return this.scale * 2; }\n}\n","import { Color } from '../../Color';\nimport { ColorMap } from '../../ColorMap';\nimport { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics, Path } from '../../Graphics';\nimport { shrink } from '../../positioning';\nimport { BooleanProperty, ColorMapProperty, ColorProperty, FloatProperty, FontProperty, IntProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\nimport { LinearScale } from './LinearScale';\n\nconst PROP_COLOR_MAP = 'color_map';\nconst PROP_CROP_BOTTOM = 'crop_bottom';\nconst PROP_CROP_LEFT = 'crop_left';\nconst PROP_CROP_RIGHT = 'crop_right';\nconst PROP_CROP_TOP = 'crop_top';\nconst PROP_DATA_HEIGHT = 'data_height';\nconst PROP_DATA_WIDTH = 'data_width';\nconst PROP_FONT = 'font';\nconst PROP_GRAPH_AREA_HEIGHT = 'graph_area_height';\nconst PROP_GRAPH_AREA_WIDTH = 'graph_area_width';\nconst PROP_MAXIMUM = 'maximum';\nconst PROP_MINIMUM = 'minimum';\nconst PROP_SHOW_RAMP = 'show_ramp';\nconst PROP_X_AXIS_AXIS_COLOR = 'x_axis_axis_color';\nconst PROP_X_AXIS_AXIS_TITLE = 'x_axis_axis_title';\nconst PROP_X_AXIS_MAJOR_TICK_STEP_HINT = 'x_axis_major_tick_step_hint';\nconst PROP_X_AXIS_MAXIMUM = 'x_axis_maximum';\nconst PROP_X_AXIS_MINIMUM = 'x_axis_minimum';\nconst PROP_X_AXIS_SCALE_FONT = 'x_axis_scale_font';\nconst PROP_X_AXIS_SHOW_MINOR_TICKS = 'x_axis_show_minor_ticks';\nconst PROP_X_AXIS_TITLE_FONT = 'x_axis_title_font';\nconst PROP_X_AXIS_VISIBLE = 'x_axis_visible';\nconst PROP_Y_AXIS_AXIS_COLOR = 'y_axis_axis_color';\nconst PROP_Y_AXIS_AXIS_TITLE = 'y_axis_axis_title';\nconst PROP_Y_AXIS_MAJOR_TICK_STEP_HINT = 'y_axis_major_tick_step_hint';\nconst PROP_Y_AXIS_MAXIMUM = 'y_axis_maximum';\nconst PROP_Y_AXIS_MINIMUM = 'y_axis_minimum';\nconst PROP_Y_AXIS_SCALE_FONT = 'y_axis_scale_font';\nconst PROP_Y_AXIS_SHOW_MINOR_TICKS = 'y_axis_show_minor_ticks';\nconst PROP_Y_AXIS_TITLE_FONT = 'y_axis_title_font';\nconst PROP_Y_AXIS_VISIBLE = 'y_axis_visible';\n\nexport class IntensityGraph extends Widget {\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new ColorMapProperty(PROP_COLOR_MAP));\n this.properties.add(new IntProperty(PROP_CROP_BOTTOM));\n this.properties.add(new IntProperty(PROP_CROP_LEFT));\n this.properties.add(new IntProperty(PROP_CROP_RIGHT));\n this.properties.add(new IntProperty(PROP_CROP_TOP));\n this.properties.add(new IntProperty(PROP_DATA_HEIGHT));\n this.properties.add(new IntProperty(PROP_DATA_WIDTH));\n this.properties.add(new IntProperty(PROP_GRAPH_AREA_HEIGHT));\n this.properties.add(new IntProperty(PROP_GRAPH_AREA_WIDTH));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new FloatProperty(PROP_MAXIMUM));\n this.properties.add(new FloatProperty(PROP_MINIMUM));\n this.properties.add(new BooleanProperty(PROP_SHOW_RAMP));\n this.properties.add(new ColorProperty(PROP_X_AXIS_AXIS_COLOR));\n this.properties.add(new StringProperty(PROP_X_AXIS_AXIS_TITLE));\n this.properties.add(new IntProperty(PROP_X_AXIS_MAJOR_TICK_STEP_HINT));\n this.properties.add(new FloatProperty(PROP_X_AXIS_MAXIMUM));\n this.properties.add(new FloatProperty(PROP_X_AXIS_MINIMUM));\n this.properties.add(new FontProperty(PROP_X_AXIS_SCALE_FONT));\n this.properties.add(new BooleanProperty(PROP_X_AXIS_SHOW_MINOR_TICKS));\n this.properties.add(new FontProperty(PROP_X_AXIS_TITLE_FONT));\n this.properties.add(new BooleanProperty(PROP_X_AXIS_VISIBLE));\n this.properties.add(new ColorProperty(PROP_Y_AXIS_AXIS_COLOR));\n this.properties.add(new StringProperty(PROP_Y_AXIS_AXIS_TITLE));\n this.properties.add(new IntProperty(PROP_Y_AXIS_MAJOR_TICK_STEP_HINT));\n this.properties.add(new FloatProperty(PROP_Y_AXIS_MAXIMUM));\n this.properties.add(new FloatProperty(PROP_Y_AXIS_MINIMUM));\n this.properties.add(new FontProperty(PROP_Y_AXIS_SCALE_FONT));\n this.properties.add(new BooleanProperty(PROP_Y_AXIS_SHOW_MINOR_TICKS));\n this.properties.add(new FontProperty(PROP_Y_AXIS_TITLE_FONT));\n this.properties.add(new BooleanProperty(PROP_Y_AXIS_VISIBLE));\n }\n\n draw(g: Graphics) {\n const { scale } = this;\n let area = this.area;\n if (this.borderAlarmSensitive) {\n area = shrink(area, 2 * scale);\n }\n const backgroundColor = this.alarmSensitiveBackgroundColor;\n g.fillRect({ ...area, color: backgroundColor });\n\n // The graph area is what we fix. Axis are all positioned in function of it.\n const { graphAreaWidth, graphAreaHeight } = this;\n\n let xTitleHeight = 0;\n if (this.xAxisVisible) {\n xTitleHeight = g.measureText(this.xAxisAxisTitle, this.xAxisTitleFont).height;\n }\n\n let yTitleWidth = 0;\n if (this.yAxisVisible) {\n yTitleWidth = g.measureText(this.yAxisAxisTitle, this.yAxisTitleFont).height;\n }\n\n const xScale = new LinearScale(scale, this.xAxisScaleFont, this.xAxisMinimum,\n this.xAxisMaximum, false, this.xAxisMajorTickStepHint, this.xAxisAxisColor,\n this.xAxisShowMinorTicks, this.xAxisVisible);\n const xScaleMargin = xScale.calculateMargin(g, true);\n const yScale = new LinearScale(scale, this.yAxisScaleFont, this.yAxisMinimum,\n this.yAxisMaximum, false, this.yAxisMajorTickStepHint, this.yAxisAxisColor,\n this.yAxisShowMinorTicks, this.yAxisVisible);\n const yScaleMargin = yScale.calculateMargin(g, false);\n\n const xScaleHeight = xScale.measureHorizontalHeight(g);\n const yScaleHeight = graphAreaHeight + (2 * yScaleMargin);\n const yScaleWidth = yScale.drawVertical(g, area.x + yTitleWidth, area.y, yScaleHeight, true);\n const xScaleWidth = graphAreaWidth + (2 * xScaleMargin);\n\n const xScaleX = area.x + yTitleWidth + yScaleWidth - xScaleMargin;\n const xScaleY2 = area.y + yScaleHeight + xScaleHeight - yScaleMargin;\n xScale.drawHorizontal(g, xScaleX, xScaleY2, xScaleWidth);\n\n const lineWidth = scale * 1;\n const verticalLineX = Math.round(area.x + yTitleWidth + yScaleWidth) - (lineWidth / 2);\n const verticalLineY = Math.round(area.y + yScaleMargin) - (lineWidth / 2);\n g.strokePath({\n path: new Path(verticalLineX, verticalLineY)\n .lineTo(verticalLineX, verticalLineY + graphAreaHeight),\n color: this.yAxisAxisColor,\n opacity: 100 / 255,\n lineWidth,\n });\n const horizontalLineX = verticalLineX;\n const horizontalLineY = verticalLineY + graphAreaHeight + lineWidth;\n g.strokePath({\n path: new Path(horizontalLineX, horizontalLineY)\n .lineTo(horizontalLineX + graphAreaWidth, horizontalLineY),\n color: this.xAxisAxisColor,\n opacity: 100 / 255,\n lineWidth,\n });\n\n const { dataWidth, dataHeight, colorMap } = this;\n const { minimum: min, maximum: max } = this;\n const [mapMin, mapMax] = colorMap.getMinMax();\n\n if (this.value && this.value.length) {\n const offscreen = document.createElement('canvas');\n const { cropLeft, cropRight, cropTop, cropBottom } = this;\n offscreen.width = dataWidth - cropLeft - cropRight;\n offscreen.height = dataHeight - cropTop - cropBottom;\n const offscreenCtx = offscreen.getContext('2d')!;\n\n // Note: fillRect said to be more efficient than putImageData.\n for (let x = cropLeft; x < (dataWidth - cropRight); x++) {\n for (let y = cropTop; y < (dataHeight - cropBottom); y++) {\n let value = this.value[y * dataWidth + x];\n if (colorMap.autoscale) {\n const ratio = (value - min) / (max - min);\n value = mapMin + (ratio * (mapMax - mapMin));\n }\n const [red, green, blue] = colorMap.lookup(value);\n offscreenCtx.fillStyle = `rgb(${red},${green},${blue})`;\n offscreenCtx.fillRect(x - cropLeft, y - cropTop, 1, 1);\n }\n }\n\n const x = Math.round(area.x + yTitleWidth + yScaleWidth);\n const y = Math.round(area.y + yScale.margin);\n g.ctx.drawImage(offscreen, x, y, graphAreaWidth, graphAreaHeight);\n }\n\n if (this.showRamp) {\n const rampScale = new LinearScale(scale, this.font, min, max, false,\n 50 * scale, this.alarmSensitiveForegroundColor, false, true);\n const rampY = area.y + yScale.margin;\n const rampFullHeight = graphAreaHeight;\n const rampScaleWidth = rampScale.drawVertical(g, area.x + area.width, rampY, rampFullHeight, false, true);\n const rampX = area.x + yTitleWidth + yScaleWidth + graphAreaWidth + this.gap;\n const rampWidth = area.width - yTitleWidth - yScaleWidth - graphAreaWidth - rampScaleWidth - this.gap;\n const rampHeight = rampFullHeight - (2 * rampScale.margin);\n\n const offscreen = document.createElement('canvas');\n offscreen.width = rampWidth;\n offscreen.height = rampHeight;\n const offscreenCtx = offscreen.getContext('2d')!;\n for (let y = 0; y < rampHeight; y++) {\n let value = max - (y / rampHeight * (max - min));\n if (colorMap.autoscale) {\n const ratio = (value - min) / (max - min);\n value = mapMin + (ratio * (mapMax - mapMin));\n }\n const [red, green, blue] = colorMap.lookup(value);\n offscreenCtx.fillStyle = `rgb(${red},${green},${blue})`;\n offscreenCtx.fillRect(0, y, rampWidth, 1);\n }\n g.ctx.drawImage(offscreen, rampX, rampY + rampScale.margin);\n }\n\n if (this.xAxisVisible) {\n let textX = area.x + yScaleWidth + (graphAreaWidth / 2);\n if (this.yAxisVisible) {\n textX += yTitleWidth;\n }\n g.fillText({\n x: textX,\n y: area.y + area.height,\n align: 'center',\n baseline: 'bottom',\n font: this.xAxisTitleFont,\n color: this.xAxisAxisColor,\n text: this.xAxisAxisTitle,\n });\n }\n\n if (this.yAxisVisible) {\n g.ctx.save();\n g.ctx.translate(area.x + (yTitleWidth / 2), area.y + yScaleHeight / 2);\n g.ctx.rotate(-Math.PI / 2);\n g.fillText({\n x: 0,\n y: 0,\n align: 'center',\n baseline: 'middle',\n font: this.yAxisTitleFont,\n color: this.yAxisAxisColor,\n text: this.yAxisAxisTitle,\n });\n g.ctx.restore();\n }\n }\n\n get gap(): number { return this.scale * 3; }\n\n get colorMap(): ColorMap { return this.properties.getValue(PROP_COLOR_MAP); }\n get cropBottom(): number { return this.properties.getValue(PROP_CROP_BOTTOM); }\n get cropLeft(): number { return this.properties.getValue(PROP_CROP_LEFT); }\n get cropRight(): number { return this.properties.getValue(PROP_CROP_RIGHT); }\n get cropTop(): number { return this.properties.getValue(PROP_CROP_TOP); }\n get dataHeight(): number { return this.properties.getValue(PROP_DATA_HEIGHT); }\n get dataWidth(): number { return this.properties.getValue(PROP_DATA_WIDTH); }\n get font(): Font { return this.properties.getValue(PROP_FONT).scale(this.scale); }\n get graphAreaHeight(): number {\n return this.scale * this.properties.getValue(PROP_GRAPH_AREA_HEIGHT);\n }\n get graphAreaWidth(): number {\n return this.scale * this.properties.getValue(PROP_GRAPH_AREA_WIDTH);\n }\n get maximum(): number { return this.properties.getValue(PROP_MAXIMUM); }\n get minimum(): number { return this.properties.getValue(PROP_MINIMUM); }\n get showRamp(): boolean { return this.properties.getValue(PROP_SHOW_RAMP); }\n\n get xAxisAxisColor(): Color { return this.properties.getValue(PROP_X_AXIS_AXIS_COLOR); }\n get xAxisAxisTitle(): string { return this.properties.getValue(PROP_X_AXIS_AXIS_TITLE); }\n get xAxisMajorTickStepHint(): number { return this.scale * this.properties.getValue(PROP_X_AXIS_MAJOR_TICK_STEP_HINT); }\n get xAxisMaximum(): number { return this.properties.getValue(PROP_X_AXIS_MAXIMUM); }\n get xAxisMinimum(): number { return this.properties.getValue(PROP_X_AXIS_MINIMUM); }\n get xAxisScaleFont(): Font { return this.properties.getValue(PROP_X_AXIS_SCALE_FONT).scale(this.scale); }\n get xAxisShowMinorTicks(): boolean { return this.properties.getValue(PROP_X_AXIS_SHOW_MINOR_TICKS); }\n get xAxisTitleFont(): Font { return this.properties.getValue(PROP_X_AXIS_TITLE_FONT).scale(this.scale); }\n get xAxisVisible(): boolean { return this.properties.getValue(PROP_X_AXIS_VISIBLE); }\n\n get yAxisAxisColor(): Color { return this.properties.getValue(PROP_Y_AXIS_AXIS_COLOR); }\n get yAxisAxisTitle(): string { return this.properties.getValue(PROP_Y_AXIS_AXIS_TITLE); }\n get yAxisMajorTickStepHint(): number { return this.scale * this.properties.getValue(PROP_Y_AXIS_MAJOR_TICK_STEP_HINT); }\n get yAxisMaximum(): number { return this.properties.getValue(PROP_Y_AXIS_MAXIMUM); }\n get yAxisMinimum(): number { return this.properties.getValue(PROP_Y_AXIS_MINIMUM); }\n get yAxisScaleFont(): Font { return this.properties.getValue(PROP_Y_AXIS_SCALE_FONT).scale(this.scale); }\n get yAxisShowMinorTicks(): boolean { return this.properties.getValue(PROP_Y_AXIS_SHOW_MINOR_TICKS); }\n get yAxisTitleFont(): Font { return this.properties.getValue(PROP_Y_AXIS_TITLE_FONT).scale(this.scale); }\n get yAxisVisible(): boolean { return this.properties.getValue(PROP_Y_AXIS_VISIBLE); }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { OpenPVEvent } from '../../events';\nimport { Font } from '../../Font';\nimport { Graphics, Path } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { Bounds, shrink, toBorderBox } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FloatProperty, FontProperty, IntProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { XMLNode } from '../../XMLNode';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\ninterface State {\n label: string;\n color: Color;\n value?: number;\n}\n\nconst PROP_BIT = 'bit';\nconst PROP_DATA_TYPE = 'data_type';\nconst PROP_EFFECT_3D = 'effect_3d';\nconst PROP_STATE_COUNT = 'state_count';\nconst PROP_SQUARE_LED = 'square_led';\nconst PROP_OFF_COLOR = 'off_color';\nconst PROP_OFF_LABEL = 'off_label';\nconst PROP_FONT = 'font';\nconst PROP_ON_COLOR = 'on_color';\nconst PROP_ON_LABEL = 'on_label';\nconst PROP_BULB_BORDER = 'bulb_border';\nconst PROP_BULB_BORDER_COLOR = 'bulb_border_color';\nconst PROP_STATE_COLOR_FALLBACK = 'state_color_fallback';\nconst PROP_STATE_LABEL_FALLBACK = 'state_label_fallback';\nconst PROP_SHOW_BOOLEAN_LABEL = 'show_boolean_label';\n\nexport class LED extends Widget {\n\n private areaRegion?: HitRegionSpecification;\n private states: State[] = [];\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new IntProperty(PROP_BIT));\n this.properties.add(new IntProperty(PROP_DATA_TYPE));\n this.properties.add(new BooleanProperty(PROP_EFFECT_3D));\n this.properties.add(new BooleanProperty(PROP_SQUARE_LED));\n this.properties.add(new IntProperty(PROP_STATE_COUNT, 2));\n this.properties.add(new ColorProperty(PROP_OFF_COLOR));\n this.properties.add(new StringProperty(PROP_OFF_LABEL));\n this.properties.add(new ColorProperty(PROP_ON_COLOR));\n this.properties.add(new StringProperty(PROP_ON_LABEL));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new BooleanProperty(PROP_SHOW_BOOLEAN_LABEL));\n this.properties.add(new ColorProperty(PROP_STATE_COLOR_FALLBACK));\n this.properties.add(new StringProperty(PROP_STATE_LABEL_FALLBACK));\n\n // Old displays don't have these properties\n this.properties.add(new IntProperty(PROP_BULB_BORDER, 3));\n this.properties.add(new ColorProperty(PROP_BULB_BORDER_COLOR, Color.DARK_GRAY));\n }\n\n parseNode(node: XMLNode) {\n super.parseNode(node);\n if (this.stateCount > 2) {\n for (let i = 0; i < this.stateCount; i++) {\n const colorProperty = new ColorProperty(`state_color_${i}`);\n colorProperty.value = node.getColor(`state_color_${i}`);\n this.properties.add(colorProperty);\n\n const labelProperty = new StringProperty(`state_label_${i}`);\n labelProperty.value = node.getString(`state_label_${i}`);\n this.properties.add(labelProperty);\n\n const valueProperty = new FloatProperty(`state_value_${i}`);\n valueProperty.value = node.getFloat(`state_value_${i}`);\n this.properties.add(valueProperty);\n\n this.states.push({\n label: this.properties.getValue(labelProperty.name),\n color: this.properties.getValue(colorProperty.name),\n value: this.properties.getValue(valueProperty.name),\n });\n }\n }\n }\n\n init() {\n this.areaRegion = {\n id: `${this.wuid}-area`,\n click: () => {\n const event: OpenPVEvent = { pvName: this.pvName! };\n this.display.fireEvent('openpv', event);\n },\n cursor: 'pointer',\n tooltip: () => this.tooltip,\n };\n }\n\n get booleanValue() {\n if (this.dataType === 0) { // Bit\n if (this.bit < 0) {\n return Boolean(this.pv?.toNumber());\n } else if (this.pv?.value !== undefined) {\n return ((this.pv?.value >> this.bit) & 1) > 0;\n } else {\n return false;\n }\n } else if (this.dataType === 1) { // Enum\n return false;\n } else {\n return false;\n }\n }\n\n get bulbColor(): Color {\n if (this.stateCount <= 2) {\n return this.booleanValue ? this.onColor : this.offColor;\n }\n\n for (const state of this.states) {\n if (state.value === this.pv?.value) {\n return state.color;\n }\n }\n return this.stateColorFallback;\n }\n\n get label(): string {\n if (this.stateCount === 2) {\n return this.booleanValue ? this.onLabel : this.offLabel;\n }\n\n for (const state of this.states) {\n if (state.value === this.pv?.value) {\n return state.label;\n }\n }\n return this.stateLabelFallback;\n }\n\n draw(g: Graphics) {\n const area = shrink(this.bounds, 3 * this.scale);\n if (this.squareLed) {\n if (this.effect3d) {\n this.drawSquare3d(g, area);\n } else {\n this.drawSquare2d(g, area);\n }\n } else {\n if (this.effect3d) {\n this.drawCircle3d(g, area);\n } else {\n this.drawCircle2d(g, area);\n }\n }\n\n if (this.showBooleanLabel) {\n g.fillText({\n x: area.x + area.width / 2,\n y: area.y + area.height / 2,\n font: this.font,\n baseline: 'middle',\n align: 'center',\n color: this.foregroundColor,\n text: this.label,\n });\n }\n }\n\n private drawCircle2d(g: Graphics, area: Bounds) {\n const cx = area.x + (area.width / 2);\n const cy = area.y + (area.height / 2);\n let rx = area.width / 2;\n let ry = area.height / 2;\n if (this.bulbBorder > 0) {\n rx -= (this.bulbBorder / 2.0);\n ry -= (this.bulbBorder / 2.0);\n }\n\n g.fillEllipse({ cx, cy, rx, ry, color: this.bulbColor });\n g.strokeEllipse({ cx, cy, rx, ry, color: this.bulbBorderColor, lineWidth: this.bulbBorder });\n\n if (this.pv && this.pv.navigable && !this.pv.disconnected) {\n const hitArea = g.addHitRegion(this.areaRegion!);\n hitArea.addEllipse(cx, cy, rx, ry, 0, 0, 2 * Math.PI);\n }\n }\n\n private drawCircle3d(g: Graphics, area: Bounds) {\n const cx = area.x + (area.width / 2);\n const cy = area.y + (area.height / 2);\n let rx = area.width / 2;\n let ry = area.height / 2;\n g.fillEllipse({ cx, cy, rx, ry, color: Color.WHITE });\n\n let gradient = g.createLinearGradient(area.x, area.y, area.x + area.width, area.y + area.height);\n gradient.addColorStop(0, this.bulbBorderColor.toString());\n gradient.addColorStop(1, this.bulbBorderColor.withAlpha(0).toString());\n g.fillEllipse({ cx, cy, rx, ry, gradient });\n\n const innerWidth = area.width - (2 * this.bulbBorder);\n const innerHeight = area.height - (2 * this.bulbBorder);\n rx = innerWidth / 2;\n ry = innerHeight / 2;\n g.fillEllipse({ cx, cy, rx, ry, color: this.bulbColor });\n\n gradient = g.createLinearGradient(area.x, area.y, area.x + area.width, area.y + area.height);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, this.bulbBorderColor.withAlpha(0).toString());\n g.fillEllipse({ cx, cy, rx, ry, gradient });\n\n if (this.pv && this.pv.navigable && !this.pv.disconnected) {\n const hitArea = g.addHitRegion(this.areaRegion!);\n hitArea.addEllipse(cx, cy, rx, ry, 0, 0, 2 * Math.PI);\n }\n }\n\n private drawSquare2d(g: Graphics, area: Bounds) {\n const box = toBorderBox(area.x, area.y, area.width, area.height, this.bulbBorder);\n g.fillRect({\n ...box,\n color: this.bulbColor,\n });\n g.strokeRect({\n ...box,\n color: this.bulbBorderColor,\n lineWidth: this.bulbBorder,\n });\n\n if (this.pv && this.pv.navigable && !this.pv.disconnected) {\n const hitArea = g.addHitRegion(this.areaRegion!);\n hitArea.addRect(area.x, area.y, area.width, area.height);\n }\n }\n\n private drawSquare3d(g: Graphics, area: Bounds) {\n g.fillRect({\n ...area,\n color: this.bulbBorderColor,\n });\n\n if (this.pv && this.pv.navigable && !this.pv.disconnected) {\n const hitArea = g.addHitRegion(this.areaRegion!);\n hitArea.addRect(area.x, area.y, area.width, area.height);\n }\n\n // Left border\n let gradient = g.createLinearGradient(area.x, area.y, area.x + area.width, area.y);\n gradient.addColorStop(0, 'rgba(0,0,0,0.078)');\n gradient.addColorStop(1, 'rgba(0,0,0,0.39)');\n g.fillPath({\n gradient,\n path: new Path(area.x, area.y)\n .lineTo(area.x + this.bulbBorder, area.y + this.bulbBorder)\n .lineTo(area.x + this.bulbBorder, area.y + area.height - this.bulbBorder)\n .lineTo(area.x, area.y + area.height)\n });\n\n // Top border\n gradient = g.createLinearGradient(area.x, area.y, area.x, area.y + area.height);\n gradient.addColorStop(0, 'rgba(0,0,0,0.078)');\n gradient.addColorStop(1, 'rgba(0,0,0,0.39)');\n g.fillPath({\n gradient,\n path: new Path(area.x, area.y)\n .lineTo(area.x + this.bulbBorder, area.y + this.bulbBorder)\n .lineTo(area.x + area.width - this.bulbBorder, area.y + this.bulbBorder)\n .lineTo(area.x + area.width, area.y)\n });\n\n // Right border\n gradient = g.createLinearGradient(area.x, area.y, area.x + area.width, area.y);\n gradient.addColorStop(0, 'rgba(255,255,255,0.078)');\n gradient.addColorStop(1, 'rgba(255,255,255,0.39)');\n g.fillPath({\n gradient,\n path: new Path(area.x + area.width, area.y)\n .lineTo(area.x + area.width - this.bulbBorder, area.y + this.bulbBorder)\n .lineTo(area.x + area.width - this.bulbBorder, area.y + area.height - this.bulbBorder)\n .lineTo(area.x + area.width, area.y + area.height)\n });\n\n // Bottom border\n gradient = g.createLinearGradient(area.x, area.y, area.x, area.y + area.height);\n gradient.addColorStop(0, 'rgba(255,255,255,0.078)');\n gradient.addColorStop(1, 'rgba(255,255,255,0.39)');\n g.fillPath({\n gradient,\n path: new Path(area.x, area.y + area.height)\n .lineTo(area.x + this.bulbBorder, area.y + area.height - this.bulbBorder)\n .lineTo(area.x + area.width - this.bulbBorder, area.y + area.height - this.bulbBorder)\n .lineTo(area.x + area.width, area.y + area.height)\n });\n\n // Bulb\n const x = area.x + this.bulbBorder;\n const y = area.y + this.bulbBorder;\n const width = area.width - (2 * this.bulbBorder);\n const height = area.height - (2 * this.bulbBorder);\n\n g.fillRect({ x, y, width, height, color: this.bulbColor });\n\n // Bulb gradient overlay\n gradient = g.createLinearGradient(area.x, area.y, area.x + area.width, area.y + area.height);\n gradient.addColorStop(0, 'rgba(255,255,255,0.784)');\n gradient.addColorStop(1, this.bulbColor.withAlpha(0).toString());\n g.fillRect({ x, y, width, height, gradient });\n }\n\n get bit(): number { return this.properties.getValue(PROP_BIT); }\n get dataType(): number { return this.properties.getValue(PROP_DATA_TYPE); }\n get squareLed(): boolean { return this.properties.getValue(PROP_SQUARE_LED); }\n get showBooleanLabel(): boolean { return this.properties.getValue(PROP_SHOW_BOOLEAN_LABEL); }\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n get effect3d(): boolean { return this.properties.getValue(PROP_EFFECT_3D); }\n get stateCount(): number { return this.properties.getValue(PROP_STATE_COUNT); }\n get bulbBorder(): number {\n return this.scale * this.properties.getValue(PROP_BULB_BORDER);\n }\n get bulbBorderColor(): Color { return this.properties.getValue(PROP_BULB_BORDER_COLOR); }\n get offLabel(): string { return this.properties.getValue(PROP_OFF_LABEL); }\n get offColor(): Color { return this.properties.getValue(PROP_OFF_COLOR); }\n get onLabel(): string { return this.properties.getValue(PROP_ON_LABEL); }\n get onColor(): Color { return this.properties.getValue(PROP_ON_COLOR); }\n get stateLabelFallback(): string { return this.properties.getValue(PROP_STATE_LABEL_FALLBACK); }\n get stateColorFallback(): Color { return this.properties.getValue(PROP_STATE_COLOR_FALLBACK); }\n}\n","import { Color } from '../../Color';\nimport { DecimalFormat } from '../../DecimalFormat';\nimport { Display } from '../../Display';\nimport { OpenPVEvent } from '../../events';\nimport { Font } from '../../Font';\nimport { Graphics, Path } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { Bounds, rotatePoint, shrink, toRadians } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FontProperty, IntProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { Ramp } from '../figures/Ramp';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst NEEDLE_WIDTH = 16;\nconst RAMP_WIDTH = 12;\nconst GAP_BTW_NEEDLE_SCALE = -5;\nconst SPACE_ANGLE = 45;\nconst ALPHA = toRadians(SPACE_ANGLE);\nconst HW_RATIO = (1 - Math.sin(ALPHA) / 2) / (2 * Math.cos(ALPHA));\n\nconst PROP_COLOR_HI = 'color_hi';\nconst PROP_COLOR_HIHI = 'color_hihi';\nconst PROP_COLOR_LO = 'color_lo';\nconst PROP_COLOR_LOLO = 'color_lolo';\nconst PROP_FONT = 'font';\nconst PROP_LEVEL_HI = 'level_hi';\nconst PROP_LEVEL_HIHI = 'level_hihi';\nconst PROP_LEVEL_LO = 'level_lo';\nconst PROP_LEVEL_LOLO = 'level_lolo';\nconst PROP_LOG_SCALE = 'log_scale';\nconst PROP_MINIMUM = 'minimum';\nconst PROP_MAXIMUM = 'maximum';\nconst PROP_NEEDLE_COLOR = 'needle_color';\nconst PROP_RAMP_GRADIENT = 'ramp_gradient';\nconst PROP_SCALE_FONT = 'scale_font';\nconst PROP_SHOW_HI = 'show_hi';\nconst PROP_SHOW_HIHI = 'show_hihi';\nconst PROP_SHOW_LO = 'show_lo';\nconst PROP_SHOW_LOLO = 'show_lolo';\nconst PROP_SHOW_RAMP = 'show_ramp';\nconst PROP_VALUE_LABEL_FORMAT = 'value_label_format';\n\nexport class Meter extends Widget {\n\n private areaRegion?: HitRegionSpecification;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new ColorProperty(PROP_COLOR_HI));\n this.properties.add(new ColorProperty(PROP_COLOR_HIHI));\n this.properties.add(new ColorProperty(PROP_COLOR_LO));\n this.properties.add(new ColorProperty(PROP_COLOR_LOLO));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new IntProperty(PROP_LEVEL_HI));\n this.properties.add(new IntProperty(PROP_LEVEL_HIHI));\n this.properties.add(new IntProperty(PROP_LEVEL_LO));\n this.properties.add(new IntProperty(PROP_LEVEL_LOLO));\n this.properties.add(new BooleanProperty(PROP_LOG_SCALE));\n this.properties.add(new IntProperty(PROP_MAXIMUM));\n this.properties.add(new IntProperty(PROP_MINIMUM));\n this.properties.add(new ColorProperty(PROP_NEEDLE_COLOR));\n this.properties.add(new BooleanProperty(PROP_RAMP_GRADIENT));\n this.properties.add(new FontProperty(PROP_SCALE_FONT));\n this.properties.add(new BooleanProperty(PROP_SHOW_HI));\n this.properties.add(new BooleanProperty(PROP_SHOW_HIHI));\n this.properties.add(new BooleanProperty(PROP_SHOW_LO));\n this.properties.add(new BooleanProperty(PROP_SHOW_LOLO));\n this.properties.add(new BooleanProperty(PROP_SHOW_RAMP, true));\n this.properties.add(new StringProperty(PROP_VALUE_LABEL_FORMAT));\n }\n\n init() {\n this.areaRegion = {\n id: `${this.wuid}-area`,\n click: () => {\n const event: OpenPVEvent = { pvName: this.pvName! };\n this.display.fireEvent('openpv', event);\n },\n tooltip: () => this.tooltip,\n cursor: 'pointer',\n };\n }\n\n draw(g: Graphics) {\n g.fillRect({\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n color: this.backgroundColor,\n });\n if (this.showRamp) {\n this.drawRamp(g);\n }\n\n if (this.pv && this.pv.navigable && !this.pv.disconnected) {\n const area = g.addHitRegion(this.areaRegion!);\n area.addRect(this.x, this.y, this.width, this.height);\n }\n }\n\n private drawRamp(g: Graphics) {\n const minText = String(this.minimum);\n const fm1 = g.measureText(minText, this.scaleFont);\n const maxText = String(this.maximum);\n const fm2 = g.measureText(maxText, this.scaleFont);\n const M = Math.max(fm1.width, fm2.width) / 2;\n let h = this.height;\n let w = this.width;\n if (h > HW_RATIO * (w - 2 * M)) {\n h = Math.floor(HW_RATIO * (w - 2 * M));\n }\n const r = h / (1 - Math.sin(ALPHA) / 2);\n const x = Math.floor(this.x - r * (1.0 - Math.cos(ALPHA)) + M);\n const y = this.y;\n\n const scaleBounds: Bounds = {\n x, y,\n width: Math.floor(2 * r),\n height: Math.floor(2 * r),\n };\n\n const { rampWidth } = this;\n const rampBounds = shrink(scaleBounds, scaleBounds.width / 4 - rampWidth, scaleBounds.height / 4 - rampWidth);\n rampBounds.width = Math.min(rampBounds.width, rampBounds.height);\n rampBounds.height = rampBounds.width;\n\n const ramp = new Ramp(rampWidth, 180 - 45, 45);\n ramp.lolo = this.levelLoLo;\n ramp.loloColor = this.colorLoLo;\n ramp.showLoLo = true;\n ramp.lo = this.levelLo;\n ramp.loColor = this.colorLo;\n ramp.showLo = true;\n ramp.hi = this.levelHi;\n ramp.hiColor = this.colorHi;\n ramp.showHi = true;\n ramp.hihi = this.levelHiHi;\n ramp.hihiColor = this.colorHiHi;\n ramp.showHiHi = true;\n ramp.minimum = this.minimum;\n ramp.maximum = this.maximum;\n ramp.gradient = this.rampGradient;\n ramp.logScale = this.logScale;\n ramp.draw(g, scaleBounds, rampBounds);\n\n this.drawNeedle(g, scaleBounds, ramp);\n\n const font = Font.ARIAL_12_BOLD.scale(this.scale);\n if (this.pv && this.pv.value !== undefined) {\n const stringValue = this.format(this.pv.value);\n const fm = g.measureText(stringValue, font);\n g.fillText({\n x: scaleBounds.x + scaleBounds.width / 2 - fm.width / 2,\n y: scaleBounds.y + scaleBounds.height / 2 - scaleBounds.height / 4 - (ramp.getRadius() - scaleBounds.height / 4) / 2 - fm.height / 2,\n align: 'left',\n baseline: 'top',\n font,\n text: stringValue,\n color: this.foregroundColor,\n });\n }\n }\n\n private drawNeedle(g: Graphics, area: Bounds, ramp: Ramp) {\n const cx = area.x + (area.width / 2);\n const cy = area.y + (area.height / 2);\n let valuePosition;\n if (this.pv && this.pv.value !== undefined) {\n const v = ramp.getValueInRange(this.pv.value);\n valuePosition = 360 - ramp.getValuePosition(v);\n if (this.maximum > this.minimum) {\n if (v > this.maximum) {\n valuePosition += 8;\n } else if (v < this.minimum) {\n valuePosition -= 8;\n }\n } else {\n if (v > this.minimum) {\n valuePosition -= 8;\n } else if (v < this.maximum) {\n valuePosition += 8;\n }\n }\n } else {\n valuePosition = 360 - ramp.getValuePosition(this.minimum + this.maximum / 2);\n }\n\n const angle = toRadians(valuePosition);\n const { needleWidth, gapBetweenNeedleScale, scale } = this;\n const p1 = rotatePoint(cx + area.width / 4, cy - needleWidth / 2 + (3 * scale), cx, cy, angle);\n const p2 = rotatePoint(cx + ramp.getRadius() - gapBetweenNeedleScale, cy, cx, cy, angle);\n const p3 = rotatePoint(cx + area.width / 4, cy + needleWidth / 2 - (3 * scale), cx, cy, angle);\n g.fillPath({\n color: this.needleColor,\n path: new Path(p1.x, p1.y)\n .lineTo(p2.x, p2.y)\n .lineTo(p3.x, p3.y)\n .closePath()\n });\n }\n\n get needleWidth() {\n return this.scale * NEEDLE_WIDTH;\n }\n\n get gapBetweenNeedleScale() {\n return this.scale * GAP_BTW_NEEDLE_SCALE;\n }\n\n get rampWidth() {\n return this.scale * RAMP_WIDTH;\n }\n\n private format(v: number) {\n if (this.valueLabelFormat) {\n return new DecimalFormat(this.valueLabelFormat).format(v);\n } else {\n return String(Number(v.toFixed(3)));\n }\n }\n\n get colorLo(): Color { return this.properties.getValue(PROP_COLOR_LO); }\n get colorLoLo(): Color { return this.properties.getValue(PROP_COLOR_LOLO); }\n get colorHi(): Color { return this.properties.getValue(PROP_COLOR_HI); }\n get colorHiHi(): Color { return this.properties.getValue(PROP_COLOR_HIHI); }\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n get levelLo(): number { return this.properties.getValue(PROP_LEVEL_LO); }\n get levelLoLo(): number { return this.properties.getValue(PROP_LEVEL_LOLO); }\n get levelHi(): number { return this.properties.getValue(PROP_LEVEL_HI); }\n get levelHiHi(): number { return this.properties.getValue(PROP_LEVEL_HIHI); }\n get logScale(): boolean { return this.properties.getValue(PROP_LOG_SCALE); }\n get minimum(): number { return this.properties.getValue(PROP_MINIMUM); }\n get maximum(): number { return this.properties.getValue(PROP_MAXIMUM); }\n get needleColor(): Color { return this.properties.getValue(PROP_NEEDLE_COLOR); }\n get rampGradient(): boolean { return this.properties.getValue(PROP_RAMP_GRADIENT); }\n get scaleFont(): Font {\n return this.properties.getValue(PROP_SCALE_FONT).scale(this.scale);\n }\n get showLo(): boolean { return this.properties.getValue(PROP_SHOW_LO); }\n get showLoLo(): boolean { return this.properties.getValue(PROP_SHOW_LOLO); }\n get showHi(): boolean { return this.properties.getValue(PROP_SHOW_HI); }\n get showHiHi(): boolean { return this.properties.getValue(PROP_SHOW_HIHI); }\n get showRamp(): boolean { return this.properties.getValue(PROP_SHOW_RAMP); }\n get valueLabelFormat(): string { return this.properties.getValue(PROP_VALUE_LABEL_FORMAT); }\n}\n","import { Color } from '../../Color';\nimport { DecimalFormat } from '../../DecimalFormat';\nimport { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics, Path } from '../../Graphics';\nimport { Bounds, shrink, translatePoints } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FloatProperty, FontProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\nimport { LinearScale } from './LinearScale';\n\nconst PROP_COLOR_HI = 'color_hi';\nconst PROP_COLOR_HIHI = 'color_hihi';\nconst PROP_COLOR_LO = 'color_lo';\nconst PROP_COLOR_LOLO = 'color_lolo';\nconst PROP_COLOR_FILLBACKGROUND = 'color_fillbackground';\nconst PROP_EFFECT_3D = 'effect_3d';\nconst PROP_FILL_COLOR = 'fill_color';\nconst PROP_FILLCOLOR_ALARM_SENSITIVE = 'fillcolor_alarm_sensitive';\nconst PROP_FONT = 'font';\nconst PROP_HORIZONTAL = 'horizontal';\nconst PROP_INDICATOR_MODE = 'indicator_mode';\nconst PROP_LEVEL_HI = 'level_hi';\nconst PROP_LEVEL_HIHI = 'level_hihi';\nconst PROP_LEVEL_LO = 'level_lo';\nconst PROP_LEVEL_LOLO = 'level_lolo';\nconst PROP_LIMITS_FROM_PV = 'limits_from_pv';\nconst PROP_LOG_SCALE = 'log_scale';\nconst PROP_MAXIMUM = 'maximum';\nconst PROP_MAJOR_TICK_STEP_HINT = 'major_tick_step_hint';\nconst PROP_MINIMUM = 'minimum';\nconst PROP_ORIGIN = 'origin';\nconst PROP_ORIGIN_IGNORED = 'origin_ignored';\nconst PROP_SCALE_FONT = 'scale_font';\nconst PROP_SCALE_FORMAT = 'scale_format';\nconst PROP_SHOW_HI = 'show_hi';\nconst PROP_SHOW_HIHI = 'show_hihi';\nconst PROP_SHOW_LABEL = 'show_label';\nconst PROP_SHOW_LO = 'show_lo';\nconst PROP_SHOW_LOLO = 'show_lolo';\nconst PROP_SHOW_MARKERS = 'show_markers';\nconst PROP_SHOW_MINOR_TICKS = 'show_minor_ticks';\nconst PROP_SHOW_SCALE = 'show_scale';\nconst PROP_TRANSPARENT_BACKGROUND = 'transparent_background';\nconst PROP_VALUE_LABEL_FORMAT = 'value_label_format';\n\nexport class ProgressBar extends Widget {\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new ColorProperty(PROP_COLOR_HI));\n this.properties.add(new ColorProperty(PROP_COLOR_HIHI));\n this.properties.add(new ColorProperty(PROP_COLOR_LO));\n this.properties.add(new ColorProperty(PROP_COLOR_LOLO));\n this.properties.add(new ColorProperty(PROP_COLOR_FILLBACKGROUND));\n this.properties.add(new BooleanProperty(PROP_EFFECT_3D));\n this.properties.add(new ColorProperty(PROP_FILL_COLOR));\n this.properties.add(new BooleanProperty(PROP_FILLCOLOR_ALARM_SENSITIVE, false));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new BooleanProperty(PROP_HORIZONTAL));\n this.properties.add(new BooleanProperty(PROP_INDICATOR_MODE));\n this.properties.add(new FloatProperty(PROP_LEVEL_HI));\n this.properties.add(new FloatProperty(PROP_LEVEL_HIHI));\n this.properties.add(new FloatProperty(PROP_LEVEL_LO));\n this.properties.add(new FloatProperty(PROP_LEVEL_LOLO));\n this.properties.add(new BooleanProperty(PROP_LIMITS_FROM_PV));\n this.properties.add(new BooleanProperty(PROP_LOG_SCALE));\n this.properties.add(new FloatProperty(PROP_MAXIMUM));\n this.properties.add(new FloatProperty(PROP_MAJOR_TICK_STEP_HINT));\n this.properties.add(new FloatProperty(PROP_MINIMUM));\n this.properties.add(new FloatProperty(PROP_ORIGIN, 0));\n this.properties.add(new BooleanProperty(PROP_ORIGIN_IGNORED, true));\n this.properties.add(new FontProperty(PROP_SCALE_FONT));\n this.properties.add(new StringProperty(PROP_SCALE_FORMAT));\n this.properties.add(new BooleanProperty(PROP_SHOW_HI));\n this.properties.add(new BooleanProperty(PROP_SHOW_HIHI));\n this.properties.add(new BooleanProperty(PROP_SHOW_LABEL));\n this.properties.add(new BooleanProperty(PROP_SHOW_LO));\n this.properties.add(new BooleanProperty(PROP_SHOW_LOLO));\n this.properties.add(new BooleanProperty(PROP_SHOW_MARKERS));\n this.properties.add(new BooleanProperty(PROP_SHOW_MINOR_TICKS));\n this.properties.add(new BooleanProperty(PROP_SHOW_SCALE));\n this.properties.add(new BooleanProperty(PROP_TRANSPARENT_BACKGROUND));\n this.properties.add(new StringProperty(PROP_VALUE_LABEL_FORMAT));\n }\n\n draw(g: Graphics) {\n let area = this.area;\n if (this.borderAlarmSensitive) {\n area = shrink(this.area, 2 * this.scale);\n }\n const backgroundColor = this.alarmSensitiveBackgroundColor;\n if (!this.transparentBackground) {\n g.fillRect({ ...area, color: backgroundColor });\n }\n\n if (this.horizontal) {\n this.drawHorizontal(g, area);\n } else {\n this.drawVertical(g, area);\n }\n }\n\n private drawVertical(g: Graphics, area: Bounds) {\n const foregroundColor = this.alarmSensitiveForegroundColor;\n\n const linearScale = new LinearScale(this.scale, this.scaleFont, this.min,\n this.max, this.logScale, this.majorTickStepHint, foregroundColor,\n this.showMinorTicks, this.showScale);\n linearScale.scaleFormat = this.scaleFormat;\n const scaleWidth = linearScale.drawVertical(g, area.x, area.y, area.height, true);\n\n let markerWidth = 0;\n if (this.showMarkers) {\n markerWidth = this.drawVerticalMarkers(g, linearScale, area);\n }\n\n this.drawVerticalBar(g, linearScale, {\n x: area.x + scaleWidth,\n y: area.y + linearScale.margin,\n width: area.width - scaleWidth - markerWidth,\n height: area.height - (2 * linearScale.margin),\n });\n }\n\n private drawVerticalMarkers(g: Graphics, linearScale: LinearScale, area: Bounds) {\n const { lolo, lo, hi, hihi } = this;\n const font = Font.ARIAL_9.scale(this.scale);\n let markerWidth = 0;\n if (this.showLoLo && lolo !== undefined) {\n const fm = g.measureText(\"LOLO\", font);\n markerWidth = Math.max(markerWidth, fm.width);\n }\n if (this.showLo && lo !== undefined) {\n const fm = g.measureText(\"LO\", font);\n markerWidth = Math.max(markerWidth, fm.width);\n }\n if (this.showHi && hi !== undefined) {\n const fm = g.measureText(\"HI\", font);\n markerWidth = Math.max(markerWidth, fm.width);\n }\n if (this.showHiHi && hihi !== undefined) {\n const fm = g.measureText(\"HIHI\", font);\n markerWidth = Math.max(markerWidth, fm.width);\n }\n\n const x2 = area.x + area.width; // Stick to right side\n if (this.showLoLo && lolo !== undefined) {\n const tickX = x2 - markerWidth - this.markerGap;\n const y = Math.round(linearScale.getValuePosition(lolo));\n g.strokePath({\n path: new Path(tickX, y).lineTo(tickX - this.markerTickLength, y),\n color: this.colorLoLo,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x: tickX + this.markerGap,\n y,\n text: 'LOLO',\n align: 'left',\n baseline: 'middle',\n color: this.colorLoLo,\n font,\n });\n }\n if (this.showLo && lo !== undefined) {\n const tickX = x2 - markerWidth - this.markerGap;\n const y = Math.round(linearScale.getValuePosition(lo));\n g.strokePath({\n path: new Path(tickX, y).lineTo(tickX - this.markerTickLength, y),\n color: this.colorLo,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x: tickX + this.markerGap,\n y,\n text: 'LO',\n align: 'left',\n baseline: 'middle',\n color: this.colorLo,\n font,\n });\n }\n if (this.showHi && hi !== undefined) {\n const tickX = x2 - markerWidth - this.markerGap;\n const y = Math.round(linearScale.getValuePosition(hi));\n g.strokePath({\n path: new Path(tickX, y).lineTo(tickX - this.markerTickLength, y),\n color: this.colorHi,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x: tickX + this.markerGap,\n y,\n text: 'HI',\n align: 'left',\n baseline: 'middle',\n color: this.colorHi,\n font,\n });\n }\n if (this.showHiHi && hihi !== undefined) {\n const tickX = x2 - markerWidth - this.markerGap;\n const y = Math.round(linearScale.getValuePosition(hihi));\n g.strokePath({\n path: new Path(tickX, y).lineTo(tickX - this.markerTickLength, y),\n color: this.colorHiHi,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x: tickX + this.markerGap,\n y,\n text: 'HIHI',\n align: 'left',\n baseline: 'middle',\n color: this.colorHiHi,\n font,\n });\n }\n\n return this.markerTickLength + this.markerGap + markerWidth;\n }\n\n private drawVerticalBar(g: Graphics, linearScale: LinearScale, area: Bounds) {\n const { outlineWidth } = this;\n g.fillRect({ ...area, color: this.colorFillbackground });\n if (this.effect3d) {\n const gradient = g.createLinearGradient(area.x, 0, area.x + area.width, 0);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, this.colorFillbackground.withAlpha(0).toString());\n g.fillRect({ ...area, gradient });\n const outline = shrink(area, outlineWidth / 2);\n g.strokeRect({\n ...outline,\n color: Color.GRAY,\n lineWidth: outlineWidth,\n });\n }\n\n const fillColor = this.alarmSensitiveFillColor;\n if (this.indicatorMode) {\n const position = Math.round(linearScale.getValuePosition(this.getFillValue()));\n const h = area.width;\n const b = this.thumbBreadth;\n const points = translatePoints([\n { x: 0, y: b / 2 },\n { x: h / 2, y: 0 },\n { x: h - 1, y: b / 2 },\n { x: h / 2, y: b },\n ], area.x, position - b / 2);\n const path = Path.fromPoints(points);\n if (this.effect3d) {\n const { x: x1, y: y1 } = points[0];\n const { x: x2, y: y2 } = points[2];\n const gradient = g.createLinearGradient(x1, y1, x2, y2);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, fillColor.toString());\n g.fillPath({ path, gradient });\n g.strokePath({ path, color: Color.GRAY, lineWidth: outlineWidth });\n } else {\n g.fillPath({ path, color: fillColor });\n }\n } else {\n let fillStart = this.originIgnored ? this.min : this.origin;\n let fillStop = this.getFillValue();\n if (fillStop < fillStart) {\n const swap = fillStart;\n fillStart = fillStop;\n fillStop = swap;\n }\n const y1 = Math.round(linearScale.getValuePosition(fillStart));\n const y2 = Math.round(linearScale.getValuePosition(fillStop));\n const fillArea = shrink({\n ...area,\n y: y1,\n height: y2 - y1,\n }, outlineWidth);\n\n g.fillRect({ ...fillArea, color: fillColor });\n if (this.effect3d) {\n const gradient = g.createLinearGradient(fillArea.x, 0, fillArea.x + fillArea.width, 0);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, fillColor.withAlpha(0).toString());\n g.fillRect({ ...fillArea, gradient });\n }\n }\n\n const value = this.pv?.value;\n if (this.showLabel && value !== undefined) {\n g.fillText({\n x: area.x + (area.width / 2),\n y: area.y + (area.height / 2),\n align: 'center',\n baseline: 'middle',\n color: this.alarmSensitiveForegroundColor,\n font: this.font,\n text: this.format(value),\n });\n }\n }\n\n private drawHorizontal(g: Graphics, area: Bounds) {\n const foregroundColor = this.alarmSensitiveForegroundColor;\n\n const linearScale = new LinearScale(this.scale, this.scaleFont, this.min,\n this.max, this.logScale, this.majorTickStepHint, foregroundColor,\n this.showMinorTicks, this.showScale);\n linearScale.scaleFormat = this.scaleFormat;\n const scaleHeight = linearScale.drawHorizontal(g, area.x, area.y + area.height, area.width);\n\n let markerHeight = 0;\n if (this.showMarkers) {\n markerHeight = this.drawHorizontalMarkers(g, linearScale, area);\n }\n\n this.drawHorizontalBar(g, linearScale, {\n x: area.x + linearScale.margin,\n y: area.y + markerHeight,\n width: area.width - (2 * linearScale.margin),\n height: area.height - scaleHeight - markerHeight,\n });\n }\n\n private drawHorizontalMarkers(g: Graphics, linearScale: LinearScale, area: Bounds) {\n const { lolo, lo, hi, hihi } = this;\n const font = Font.ARIAL_9.scale(this.scale);\n let markerHeight = 0;\n if (this.showLoLo && lolo !== undefined) {\n const fm = g.measureText(\"LOLO\", font);\n markerHeight = Math.max(markerHeight, fm.height);\n }\n if (this.showLo && lo !== undefined) {\n const fm = g.measureText(\"LO\", font);\n markerHeight = Math.max(markerHeight, fm.height);\n }\n if (this.showHi && hi !== undefined) {\n const fm = g.measureText(\"HI\", font);\n markerHeight = Math.max(markerHeight, fm.height);\n }\n if (this.showHiHi && hihi !== undefined) {\n const fm = g.measureText(\"HIHI\", font);\n markerHeight = Math.max(markerHeight, fm.height);\n }\n\n const y = area.y;\n if (this.showLoLo && lolo !== undefined) {\n const x = Math.round(linearScale.getValuePosition(lolo));\n const tickY = y + markerHeight + this.markerGap;\n g.strokePath({\n path: new Path(x, tickY).lineTo(x, tickY + this.markerTickLength),\n color: this.colorLoLo,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x,\n y,\n text: 'LOLO',\n align: 'center',\n baseline: 'top',\n color: this.colorLoLo,\n font,\n });\n }\n if (this.showLo && lo !== undefined) {\n const x = Math.round(linearScale.getValuePosition(lo));\n const tickY = y + markerHeight + this.markerGap;\n g.strokePath({\n path: new Path(x, tickY).lineTo(x, tickY + this.markerTickLength),\n color: this.colorLo,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x,\n y,\n text: 'LO',\n align: 'center',\n baseline: 'top',\n color: this.colorLo,\n font,\n });\n }\n if (this.showHi && hi !== undefined) {\n const x = Math.round(linearScale.getValuePosition(hi));\n const tickY = y + markerHeight + this.markerGap;\n g.strokePath({\n path: new Path(x, tickY).lineTo(x, tickY + this.markerTickLength),\n color: this.colorHi,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x,\n y,\n text: 'HI',\n align: 'center',\n baseline: 'top',\n color: this.colorHi,\n font,\n });\n }\n if (this.showHiHi && hihi !== undefined) {\n const x = Math.round(linearScale.getValuePosition(hihi));\n const tickY = y + markerHeight + this.markerGap;\n g.strokePath({\n path: new Path(x, tickY).lineTo(x, tickY + this.markerTickLength),\n color: this.colorHiHi,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x,\n y,\n text: 'HIHI',\n align: 'center',\n baseline: 'top',\n color: this.colorHiHi,\n font,\n });\n }\n\n return this.markerTickLength + this.markerGap + markerHeight;\n }\n\n private drawHorizontalBar(g: Graphics, linearScale: LinearScale, area: Bounds) {\n const { outlineWidth } = this;\n g.fillRect({ ...area, color: this.colorFillbackground });\n if (this.effect3d) {\n const gradient = g.createLinearGradient(0, area.y, 0, area.y + area.height);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, this.colorFillbackground.withAlpha(0).toString());\n g.fillRect({ ...area, gradient });\n const outline = shrink(area, outlineWidth / 2);\n g.strokeRect({\n ...outline,\n color: Color.GRAY,\n lineWidth: outlineWidth,\n });\n }\n\n const fillColor = this.alarmSensitiveFillColor;\n if (this.indicatorMode) {\n const position = Math.round(linearScale.getValuePosition(this.getFillValue()));\n const h = area.height;\n const b = this.thumbBreadth;\n const points = translatePoints([\n { x: b / 2, y: 0 },\n { x: b, y: h / 2 },\n { x: b / 2, y: h - 1 },\n { x: 0, y: h / 2 },\n ], position - b / 2, area.y);\n const path = Path.fromPoints(points);\n if (this.effect3d) {\n const { x: x1, y: y1 } = points[0];\n const { x: x2, y: y2 } = points[2];\n const gradient = g.createLinearGradient(x1, y1, x2, y2);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, fillColor.toString());\n g.fillPath({ path, gradient });\n g.strokePath({ path, color: Color.GRAY, lineWidth: outlineWidth });\n } else {\n g.fillPath({ path, color: fillColor });\n }\n } else {\n let fillStart = this.originIgnored ? this.min : this.origin;\n let fillStop = this.getFillValue();\n if (fillStop < fillStart) {\n const swap = fillStart;\n fillStart = fillStop;\n fillStop = swap;\n }\n const x1 = Math.round(linearScale.getValuePosition(fillStart));\n const x2 = Math.round(linearScale.getValuePosition(fillStop));\n const fillArea = shrink({\n ...area,\n x: x1,\n width: x2 - x1,\n }, outlineWidth);\n g.fillRect({ ...fillArea, color: fillColor });\n if (this.effect3d) {\n const gradient = g.createLinearGradient(0, fillArea.y, 0, fillArea.y + fillArea.height);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, fillColor.withAlpha(0).toString());\n g.fillRect({ ...fillArea, gradient });\n }\n }\n\n const value = this.pv?.value;\n if (this.showLabel && value !== undefined) {\n g.fillText({\n x: area.x + (area.width / 2),\n y: area.y + (area.height / 2),\n align: 'center',\n baseline: 'middle',\n color: this.alarmSensitiveForegroundColor,\n font: this.font,\n text: this.format(value),\n });\n }\n }\n\n get min() {\n if (this.limitsFromPv) {\n return this.pv?.lowerDisplayLimit ?? this.minimum;\n } else {\n return this.minimum;\n }\n }\n\n get max() {\n if (this.limitsFromPv) {\n return this.pv?.upperDisplayLimit ?? this.maximum;\n } else {\n return this.maximum;\n }\n }\n\n get lolo() {\n if (this.limitsFromPv && this.pv && !this.pv.disconnected) {\n return this.pv.lowerAlarmLimit;\n } else {\n return this.levelLoLo;\n }\n }\n\n get lo() {\n if (this.limitsFromPv && this.pv && !this.pv.disconnected) {\n return this.pv.lowerWarningLimit;\n } else {\n return this.levelLo;\n }\n }\n\n get hi() {\n if (this.limitsFromPv && this.pv && !this.pv.disconnected) {\n return this.pv.upperWarningLimit;\n } else {\n return this.levelHi;\n }\n }\n\n get hihi() {\n if (this.limitsFromPv && this.pv && !this.pv.disconnected) {\n return this.pv.upperAlarmLimit;\n } else {\n return this.levelHiHi;\n }\n }\n\n get markerTickLength() { return this.scale * 10; }\n get markerTickLineWidth() { return this.scale * 2; }\n get markerGap() { return this.scale * 3; }\n get thumbBreadth() { return this.scale * 13; }\n get outlineWidth() { return this.scale * 1; }\n get alarmSensitiveFillColor() {\n if (this.fillColorAlarmSensitive) {\n if (this.isMajorSeverity()) {\n return Color.RED;\n } else if (this.isMinorSeverity()) {\n return Color.ORANGE;\n }\n }\n return this.fillColor;\n }\n\n private getFillValue() {\n let value = this.pv?.value ?? this.min;\n value = Math.max(this.min, value);\n value = Math.min(this.max, value);\n return value;\n }\n\n private format(v: number) {\n if (this.valueLabelFormat) {\n return new DecimalFormat(this.valueLabelFormat).format(v);\n } else {\n return String(Number(v.toFixed(2)));\n }\n }\n\n get colorLo(): Color { return this.properties.getValue(PROP_COLOR_LO); }\n get colorLoLo(): Color { return this.properties.getValue(PROP_COLOR_LOLO); }\n get colorHi(): Color { return this.properties.getValue(PROP_COLOR_HI); }\n get colorHiHi(): Color { return this.properties.getValue(PROP_COLOR_HIHI); }\n get colorFillbackground(): Color { return this.properties.getValue(PROP_COLOR_FILLBACKGROUND); }\n get effect3d(): boolean { return this.properties.getValue(PROP_EFFECT_3D); }\n get fillColorAlarmSensitive(): boolean { return this.properties.getValue(PROP_FILLCOLOR_ALARM_SENSITIVE); }\n get fillColor(): Color { return this.properties.getValue(PROP_FILL_COLOR); }\n get font(): Font { return this.properties.getValue(PROP_FONT).scale(this.scale); }\n get horizontal(): boolean { return this.properties.getValue(PROP_HORIZONTAL); }\n get indicatorMode(): boolean { return this.properties.getValue(PROP_INDICATOR_MODE); }\n get levelLo(): number { return this.properties.getValue(PROP_LEVEL_LO); }\n get levelLoLo(): number { return this.properties.getValue(PROP_LEVEL_LOLO); }\n get levelHi(): number { return this.properties.getValue(PROP_LEVEL_HI); }\n get levelHiHi(): number { return this.properties.getValue(PROP_LEVEL_HIHI); }\n get limitsFromPv(): boolean { return this.properties.getValue(PROP_LIMITS_FROM_PV); }\n get logScale(): boolean { return this.properties.getValue(PROP_LOG_SCALE); }\n get minimum(): number { return this.properties.getValue(PROP_MINIMUM); }\n get majorTickStepHint(): number { return this.scale * this.properties.getValue(PROP_MAJOR_TICK_STEP_HINT); }\n get maximum(): number { return this.properties.getValue(PROP_MAXIMUM); }\n get origin(): number { return this.properties.getValue(PROP_ORIGIN); }\n get originIgnored(): boolean { return this.properties.getValue(PROP_ORIGIN_IGNORED); }\n get scaleFont(): Font { return this.properties.getValue(PROP_SCALE_FONT).scale(this.scale); }\n get scaleFormat(): string { return this.properties.getValue(PROP_SCALE_FORMAT); }\n get showHi(): boolean { return this.properties.getValue(PROP_SHOW_HI); }\n get showHiHi(): boolean { return this.properties.getValue(PROP_SHOW_HIHI); }\n get showLabel(): boolean { return this.properties.getValue(PROP_SHOW_LABEL); }\n get showLo(): boolean { return this.properties.getValue(PROP_SHOW_LO); }\n get showLoLo(): boolean { return this.properties.getValue(PROP_SHOW_LOLO); }\n get showMarkers(): boolean { return this.properties.getValue(PROP_SHOW_MARKERS); }\n get showMinorTicks(): boolean { return this.properties.getValue(PROP_SHOW_MINOR_TICKS); }\n get showScale(): boolean { return this.properties.getValue(PROP_SHOW_SCALE); }\n get transparentBackground(): boolean { return this.properties.getValue(PROP_TRANSPARENT_BACKGROUND); }\n get valueLabelFormat(): string { return this.properties.getValue(PROP_VALUE_LABEL_FORMAT); }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics, Path } from '../../Graphics';\nimport { Bounds, shrink } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FloatProperty, FontProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\nimport { LinearScale } from './LinearScale';\n\nconst PROP_COLOR_HI = 'color_hi';\nconst PROP_COLOR_HIHI = 'color_hihi';\nconst PROP_COLOR_LO = 'color_lo';\nconst PROP_COLOR_LOLO = 'color_lolo';\nconst PROP_COLOR_FILLBACKGROUND = 'color_fillbackground';\nconst PROP_FILL_COLOR = 'fill_color';\nconst PROP_FILLCOLOR_ALARM_SENSITIVE = 'fillcolor_alarm_sensitive';\nconst PROP_EFFECT_3D = 'effect_3d';\nconst PROP_LEVEL_HI = 'level_hi';\nconst PROP_LEVEL_HIHI = 'level_hihi';\nconst PROP_LEVEL_LO = 'level_lo';\nconst PROP_LEVEL_LOLO = 'level_lolo';\nconst PROP_LIMITS_FROM_PV = 'limits_from_pv';\nconst PROP_LOG_SCALE = 'log_scale';\nconst PROP_MAXIMUM = 'maximum';\nconst PROP_MAJOR_TICK_STEP_HINT = 'major_tick_step_hint';\nconst PROP_MINIMUM = 'minimum';\nconst PROP_SCALE_FONT = 'scale_font';\nconst PROP_SCALE_FORMAT = 'scale_format';\nconst PROP_SHOW_HI = 'show_hi';\nconst PROP_SHOW_HIHI = 'show_hihi';\nconst PROP_SHOW_LO = 'show_lo';\nconst PROP_SHOW_LOLO = 'show_lolo';\nconst PROP_SHOW_MARKERS = 'show_markers';\nconst PROP_SHOW_MINOR_TICKS = 'show_minor_ticks';\nconst PROP_SHOW_SCALE = 'show_scale';\nconst PROP_TRANSPARENT_BACKGROUND = 'transparent_background';\n\nconst OUTLINE_COLOR_3D = new Color(160, 160, 160);\n\nexport class Tank extends Widget {\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new ColorProperty(PROP_COLOR_HI));\n this.properties.add(new ColorProperty(PROP_COLOR_HIHI));\n this.properties.add(new ColorProperty(PROP_COLOR_LO));\n this.properties.add(new ColorProperty(PROP_COLOR_LOLO));\n this.properties.add(new ColorProperty(PROP_COLOR_FILLBACKGROUND));\n this.properties.add(new BooleanProperty(PROP_EFFECT_3D));\n this.properties.add(new ColorProperty(PROP_FILL_COLOR));\n this.properties.add(new BooleanProperty(PROP_FILLCOLOR_ALARM_SENSITIVE, false));\n this.properties.add(new FloatProperty(PROP_LEVEL_HI));\n this.properties.add(new FloatProperty(PROP_LEVEL_HIHI));\n this.properties.add(new FloatProperty(PROP_LEVEL_LO));\n this.properties.add(new FloatProperty(PROP_LEVEL_LOLO));\n this.properties.add(new BooleanProperty(PROP_LIMITS_FROM_PV));\n this.properties.add(new BooleanProperty(PROP_LOG_SCALE));\n this.properties.add(new FloatProperty(PROP_MAXIMUM));\n this.properties.add(new FloatProperty(PROP_MAJOR_TICK_STEP_HINT));\n this.properties.add(new FloatProperty(PROP_MINIMUM));\n this.properties.add(new FontProperty(PROP_SCALE_FONT));\n this.properties.add(new StringProperty(PROP_SCALE_FORMAT));\n this.properties.add(new BooleanProperty(PROP_SHOW_HI));\n this.properties.add(new BooleanProperty(PROP_SHOW_HIHI));\n this.properties.add(new BooleanProperty(PROP_SHOW_LO));\n this.properties.add(new BooleanProperty(PROP_SHOW_LOLO));\n this.properties.add(new BooleanProperty(PROP_SHOW_MARKERS));\n this.properties.add(new BooleanProperty(PROP_SHOW_MINOR_TICKS));\n this.properties.add(new BooleanProperty(PROP_SHOW_SCALE));\n this.properties.add(new BooleanProperty(PROP_TRANSPARENT_BACKGROUND));\n }\n\n draw(g: Graphics) {\n const { scale, min, max } = this;\n let area = this.area;\n if (this.borderAlarmSensitive) {\n area = shrink(area, 2 * scale);\n }\n const backgroundColor = this.alarmSensitiveBackgroundColor;\n if (!this.transparentBackground) {\n g.fillRect({ ...area, color: backgroundColor });\n }\n\n const foregroundColor = this.alarmSensitiveForegroundColor;\n const linearScale = new LinearScale(scale, this.scaleFont, min,\n max, this.logScale, this.majorTickStepHint, foregroundColor,\n this.showMinorTicks, this.showScale);\n linearScale.scaleFormat = this.scaleFormat;\n const scaleWidth = linearScale.drawVertical(g, area.x, area.y, area.height, true);\n\n let markerWidth = 0;\n if (this.showMarkers) {\n markerWidth = this.drawMarkers(g, area, linearScale);\n }\n\n this.drawTank(g, area, scaleWidth, markerWidth, linearScale);\n }\n\n private drawMarkers(g: Graphics, area: Bounds, linearScale: LinearScale) {\n const { lolo, lo, hi, hihi } = this;\n const font = Font.ARIAL_9.scale(this.scale);\n let markerWidth = 0;\n if (this.showLoLo && lolo !== undefined) {\n const fm = g.measureText(\"LOLO\", font);\n markerWidth = Math.max(markerWidth, fm.width);\n }\n if (this.showLo && lo !== undefined) {\n const fm = g.measureText(\"LO\", font);\n markerWidth = Math.max(markerWidth, fm.width);\n }\n if (this.showHi && hi !== undefined) {\n const fm = g.measureText(\"HI\", font);\n markerWidth = Math.max(markerWidth, fm.width);\n }\n if (this.showHiHi && hihi !== undefined) {\n const fm = g.measureText(\"HIHI\", font);\n markerWidth = Math.max(markerWidth, fm.width);\n }\n\n const x = area.x + area.width - markerWidth - this.markerGap - this.markerTickLength;\n if (this.showLoLo && lolo !== undefined) {\n const y = Math.round(linearScale.getValuePosition(lolo));\n g.strokePath({\n path: new Path(x, y).lineTo(x + this.markerTickLength, y),\n color: this.colorLoLo,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x: x + this.markerTickLength + this.markerGap,\n y,\n text: 'LOLO',\n align: 'left',\n baseline: 'middle',\n color: this.colorLoLo,\n font,\n });\n }\n if (this.showLo && lo !== undefined) {\n const y = Math.round(linearScale.getValuePosition(lo));\n g.strokePath({\n path: new Path(x, y).lineTo(x + this.markerTickLength, y),\n color: this.colorLo,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x: x + this.markerTickLength + this.markerGap,\n y,\n text: 'LO',\n align: 'left',\n baseline: 'middle',\n color: this.colorLo,\n font,\n });\n }\n if (this.showHi && hi !== undefined) {\n const y = Math.round(linearScale.getValuePosition(hi));\n g.strokePath({\n path: new Path(x, y).lineTo(x + this.markerTickLength, y),\n color: this.colorHi,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x: x + this.markerTickLength + this.markerGap,\n y,\n text: 'HI',\n align: 'left',\n baseline: 'middle',\n color: this.colorHi,\n font,\n });\n }\n if (this.showHiHi && hihi !== undefined) {\n const y = Math.round(linearScale.getValuePosition(hihi));\n g.strokePath({\n path: new Path(x, y).lineTo(x + this.markerTickLength, y),\n color: this.colorHiHi,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x: x + this.markerTickLength + this.markerGap,\n y,\n text: 'HIHI',\n align: 'left',\n baseline: 'middle',\n color: this.colorHiHi,\n font,\n });\n }\n return this.markerTickLength + this.markerGap + markerWidth;\n }\n\n private drawTank(g: Graphics, area: Bounds, scaleWidth: number, markerWidth: number, linearScale: LinearScale) {\n const foregroundColor = this.alarmSensitiveForegroundColor;\n const { scale, outlineWidth } = this;\n const x = area.x + scaleWidth;\n const y = area.y + linearScale.margin;\n const width = area.width - scaleWidth - markerWidth;\n const height = area.height - (2 * linearScale.margin);\n\n let fillCorner = this.defaultCorner;\n let intersectFactor = 11.0 / 20.0;\n if (width < 2 * fillCorner) { // Make gradient effect a little darker\n intersectFactor = 12.0 / 20.0;\n }\n const rectWidth = Math.floor(width * intersectFactor);\n if (fillCorner > (2 * rectWidth) - width - (2 * outlineWidth)) {\n fillCorner = (2 * rectWidth) - width;\n }\n\n const valuePosition = linearScale.getValuePosition(this.getFillValue());\n const fillColor = this.alarmSensitiveFillColor;\n if (this.effect3d) {\n g.fillRect({\n x,\n y,\n width,\n height,\n rx: fillCorner / 2,\n ry: fillCorner / 2,\n color: Color.WHITE,\n });\n let gradient = g.createLinearGradient(x, y, x + rectWidth + (2 * scale), y);\n gradient.addColorStop(0, this.colorFillbackground.toString());\n gradient.addColorStop(1, Color.WHITE.withAlpha(0).toString());\n g.fillRect({\n x,\n y,\n width: rectWidth,\n height,\n rx: fillCorner / 2,\n ry: fillCorner / 2,\n gradient,\n });\n gradient = g.createLinearGradient(x + width - rectWidth - (2 * scale), y, x + width, y);\n gradient.addColorStop(0, Color.WHITE.withAlpha(0).toString());\n gradient.addColorStop(1, this.colorFillbackground.toString());\n g.fillRect({\n x: x + width - rectWidth,\n y,\n width: rectWidth,\n height,\n rx: fillCorner / 2,\n ry: fillCorner / 2,\n gradient,\n });\n\n const fillY = valuePosition;\n const fillHeight = y + height - valuePosition;\n gradient = g.createLinearGradient(x, fillY, x + rectWidth + (2 * scale), fillY);\n gradient.addColorStop(0, fillColor.toString());\n gradient.addColorStop(1, Color.WHITE.withAlpha(0).toString());\n g.fillRect({\n x,\n y: fillY,\n width: rectWidth,\n height: fillHeight,\n rx: fillCorner / 2,\n ry: fillCorner / 2,\n gradient,\n });\n gradient = g.createLinearGradient(x + width - rectWidth - (2 * scale), fillY, x + width, fillY);\n gradient.addColorStop(0, Color.WHITE.withAlpha(0).toString());\n gradient.addColorStop(1, fillColor.toString());\n g.fillRect({\n x: x + width - rectWidth,\n y: fillY,\n width: rectWidth,\n height: fillHeight,\n rx: fillCorner / 2,\n ry: fillCorner / 2,\n gradient,\n });\n } else {\n g.fillRect({\n x,\n y,\n width,\n height,\n rx: fillCorner / 2,\n ry: fillCorner / 2,\n color: this.colorFillbackground,\n });\n g.fillRect({\n x,\n y: valuePosition,\n width,\n height: y + height - valuePosition,\n rx: fillCorner / 2,\n ry: fillCorner / 2,\n color: fillColor,\n });\n }\n\n // Outline\n let outline: Bounds = shrink({\n x,\n y,\n width,\n height,\n }, outlineWidth / 2);\n g.strokeRect({\n ...outline,\n rx: fillCorner / 2,\n ry: fillCorner / 2,\n color: this.effect3d ? OUTLINE_COLOR_3D : foregroundColor,\n lineWidth: outlineWidth,\n });\n }\n\n get min() {\n if (this.limitsFromPv) {\n return this.pv?.lowerDisplayLimit ?? this.minimum;\n } else {\n return this.minimum;\n }\n }\n\n get max() {\n if (this.limitsFromPv) {\n return this.pv?.upperDisplayLimit ?? this.maximum;\n } else {\n return this.maximum;\n }\n }\n\n get lolo() {\n if (this.limitsFromPv && this.pv && !this.pv.disconnected) {\n return this.pv.lowerAlarmLimit;\n } else {\n return this.levelLoLo;\n }\n }\n\n get lo() {\n if (this.limitsFromPv && this.pv && !this.pv.disconnected) {\n return this.pv.lowerWarningLimit;\n } else {\n return this.levelLo;\n }\n }\n\n get hi() {\n if (this.limitsFromPv && this.pv && !this.pv.disconnected) {\n return this.pv.upperWarningLimit;\n } else {\n return this.levelHi;\n }\n }\n\n get hihi() {\n if (this.limitsFromPv && this.pv && !this.pv.disconnected) {\n return this.pv.upperAlarmLimit;\n } else {\n return this.levelHiHi;\n }\n }\n\n get defaultCorner() { return this.scale * 15; }\n get markerTickLength() { return this.scale * 10; }\n get markerTickLineWidth() { return this.scale * 2; }\n get markerGap() { return this.scale * 3; }\n get outlineWidth() { return this.scale * 1; }\n get alarmSensitiveFillColor() {\n if (this.fillColorAlarmSensitive) {\n if (this.isMajorSeverity()) {\n return Color.RED;\n } else if (this.isMinorSeverity()) {\n return Color.ORANGE;\n }\n }\n return this.fillColor;\n }\n\n private getFillValue() {\n let value = this.pv?.value ?? this.min;\n value = Math.max(this.min, value);\n value = Math.min(this.max, value);\n return value;\n }\n\n get colorLo(): Color { return this.properties.getValue(PROP_COLOR_LO); }\n get colorLoLo(): Color { return this.properties.getValue(PROP_COLOR_LOLO); }\n get colorHi(): Color { return this.properties.getValue(PROP_COLOR_HI); }\n get colorHiHi(): Color { return this.properties.getValue(PROP_COLOR_HIHI); }\n get colorFillbackground(): Color { return this.properties.getValue(PROP_COLOR_FILLBACKGROUND); }\n get fillColorAlarmSensitive(): boolean { return this.properties.getValue(PROP_FILLCOLOR_ALARM_SENSITIVE); }\n get fillColor(): Color { return this.properties.getValue(PROP_FILL_COLOR); }\n get effect3d(): boolean { return this.properties.getValue(PROP_EFFECT_3D); }\n get levelLo(): number { return this.properties.getValue(PROP_LEVEL_LO); }\n get levelLoLo(): number { return this.properties.getValue(PROP_LEVEL_LOLO); }\n get levelHi(): number { return this.properties.getValue(PROP_LEVEL_HI); }\n get levelHiHi(): number { return this.properties.getValue(PROP_LEVEL_HIHI); }\n get limitsFromPv(): boolean { return this.properties.getValue(PROP_LIMITS_FROM_PV); }\n get logScale(): boolean { return this.properties.getValue(PROP_LOG_SCALE); }\n get minimum(): number { return this.properties.getValue(PROP_MINIMUM); }\n get majorTickStepHint(): number { return this.scale * this.properties.getValue(PROP_MAJOR_TICK_STEP_HINT); }\n get maximum(): number { return this.properties.getValue(PROP_MAXIMUM); }\n get scaleFont(): Font { return this.properties.getValue(PROP_SCALE_FONT).scale(this.scale); }\n get scaleFormat(): string { return this.properties.getValue(PROP_SCALE_FORMAT); }\n get showLo(): boolean { return this.properties.getValue(PROP_SHOW_LO); }\n get showLoLo(): boolean { return this.properties.getValue(PROP_SHOW_LOLO); }\n get showHi(): boolean { return this.properties.getValue(PROP_SHOW_HI); }\n get showHiHi(): boolean { return this.properties.getValue(PROP_SHOW_HIHI); }\n get showMarkers(): boolean { return this.properties.getValue(PROP_SHOW_MARKERS); }\n get showMinorTicks(): boolean { return this.properties.getValue(PROP_SHOW_MINOR_TICKS); }\n get showScale(): boolean { return this.properties.getValue(PROP_SHOW_SCALE); }\n get transparentBackground(): boolean { return this.properties.getValue(PROP_TRANSPARENT_BACKGROUND); }\n}\n","import { Display } from '../../Display';\nimport { OpenPVEvent } from '../../events';\nimport { Font } from '../../Font';\nimport { Graphics } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { shrink } from '../../positioning';\nimport { BooleanProperty, FontProperty, IntProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\n\nconst PROP_FONT = 'font';\nconst PROP_FORMAT_TYPE = 'format_type';\nconst PROP_HORIZONTAL_ALIGNMENT = 'horizontal_alignment';\nconst PROP_PRECISION = 'precision';\nconst PROP_PRECISION_FROM_PV = 'precision_from_pv';\nconst PROP_VERTICAL_ALIGNMENT = 'vertical_alignment';\n\nexport class TextUpdate extends Widget {\n\n private areaRegion?: HitRegionSpecification;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new IntProperty(PROP_FORMAT_TYPE));\n this.properties.add(new IntProperty(PROP_HORIZONTAL_ALIGNMENT));\n this.properties.add(new IntProperty(PROP_PRECISION));\n this.properties.add(new BooleanProperty(PROP_PRECISION_FROM_PV));\n this.properties.add(new IntProperty(PROP_VERTICAL_ALIGNMENT));\n }\n\n init() {\n this.areaRegion = {\n id: `${this.wuid}-area`,\n click: () => {\n const event: OpenPVEvent = { pvName: this.pvName! };\n this.display.fireEvent('openpv', event);\n },\n tooltip: () => this.tooltip,\n cursor: 'pointer',\n };\n }\n\n draw(g: Graphics) {\n const ctx = g.ctx;\n if (!this.transparent) {\n g.fillRect({\n ... this.area,\n color: this.backgroundColor,\n });\n } else if (this.backgroundAlarmSensitive && this.alarm) {\n g.fillRect({\n ... this.area,\n color: this.alarmSensitiveBackgroundColor,\n });\n }\n\n if (this.pv && this.pv.navigable && !this.pv.disconnected) {\n const area = g.addHitRegion(this.areaRegion!);\n area.addRect(this.x, this.y, this.width, this.height);\n }\n\n ctx.fillStyle = this.alarmSensitiveForegroundColor.toString();\n ctx.font = this.font.getFontString();\n\n const { scale } = this;\n let textBounds = this.area;\n if (this.borderAlarmSensitive) {\n textBounds = shrink(textBounds, 2 * scale, 2 * scale);\n }\n\n let x = textBounds.x;\n if (this.horizAlignment === 0) { // LEFT\n ctx.textAlign = 'start';\n } else if (this.horizAlignment === 1) { // CENTER\n x += textBounds.width / 2;\n ctx.textAlign = 'center';\n } else if (this.horizAlignment === 2) { // RIGHT\n x += textBounds.width;\n ctx.textAlign = 'end';\n }\n\n let y = textBounds.y;\n if (this.vertAlignment === 0) { // TOP\n ctx.textBaseline = 'top';\n } else if (this.vertAlignment === 1) { // MIDDLE\n y = y + (textBounds.height / 2);\n ctx.textBaseline = 'middle';\n } else if (this.vertAlignment === 2) { // BOTTOM\n y = y + textBounds.height;\n ctx.textBaseline = 'bottom';\n }\n\n let text = this.text;\n if (this.pv && this.pv.value !== undefined) {\n const precision = this.precisionFromPV ? this.pv.precision : this.precision;\n text = this.pv.formatValue(this.formatType, precision);\n }\n ctx.fillText(text, x, y);\n }\n\n get font(): Font {\n return this.properties.getValue(PROP_FONT).scale(this.scale);\n }\n get formatType(): number { return this.properties.getValue(PROP_FORMAT_TYPE); }\n get horizAlignment(): number { return this.properties.getValue(PROP_HORIZONTAL_ALIGNMENT); }\n get precision(): number { return this.properties.getValue(PROP_PRECISION); }\n get precisionFromPV(): boolean { return this.properties.getValue(PROP_PRECISION_FROM_PV); }\n get vertAlignment(): number { return this.properties.getValue(PROP_VERTICAL_ALIGNMENT); }\n}\n","import { Color } from '../../Color';\nimport { DecimalFormat } from '../../DecimalFormat';\nimport { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics, Path } from '../../Graphics';\nimport { Bounds, shrink } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FloatProperty, FontProperty, IntProperty, StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from '../others/AbstractContainerWidget';\nimport { LinearScale } from './LinearScale';\n\nconst PROP_COLOR_HI = 'color_hi';\nconst PROP_COLOR_HIHI = 'color_hihi';\nconst PROP_COLOR_LO = 'color_lo';\nconst PROP_COLOR_LOLO = 'color_lolo';\nconst PROP_COLOR_FILLBACKGROUND = 'color_fillbackground';\nconst PROP_FILL_COLOR = 'fill_color';\nconst PROP_FILLCOLOR_ALARM_SENSITIVE = 'fillcolor_alarm_sensitive';\nconst PROP_FONT = 'font';\nconst PROP_EFFECT_3D = 'effect_3d';\nconst PROP_LEVEL_HI = 'level_hi';\nconst PROP_LEVEL_HIHI = 'level_hihi';\nconst PROP_LEVEL_LO = 'level_lo';\nconst PROP_LEVEL_LOLO = 'level_lolo';\nconst PROP_LIMITS_FROM_PV = 'limits_from_pv';\nconst PROP_LOG_SCALE = 'log_scale';\nconst PROP_MAXIMUM = 'maximum';\nconst PROP_MAJOR_TICK_STEP_HINT = 'major_tick_step_hint';\nconst PROP_MINIMUM = 'minimum';\nconst PROP_SCALE_FONT = 'scale_font';\nconst PROP_SCALE_FORMAT = 'scale_format';\nconst PROP_SHOW_BULB = 'show_bulb';\nconst PROP_SHOW_HI = 'show_hi';\nconst PROP_SHOW_HIHI = 'show_hihi';\nconst PROP_SHOW_LO = 'show_lo';\nconst PROP_SHOW_LOLO = 'show_lolo';\nconst PROP_SHOW_MARKERS = 'show_markers';\nconst PROP_SHOW_MINOR_TICKS = 'show_minor_ticks';\nconst PROP_SHOW_SCALE = 'show_scale';\nconst PROP_TRANSPARENT_BACKGROUND = 'transparent_background';\nconst PROP_UNIT = 'unit';\nconst PROP_VALUE_LABEL_FORMAT = 'value_label_format';\n\nconst OUTLINE_COLOR_3D = new Color(160, 160, 160);\n\nexport class Thermometer extends Widget {\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new ColorProperty(PROP_COLOR_HI));\n this.properties.add(new ColorProperty(PROP_COLOR_HIHI));\n this.properties.add(new ColorProperty(PROP_COLOR_LO));\n this.properties.add(new ColorProperty(PROP_COLOR_LOLO));\n this.properties.add(new ColorProperty(PROP_COLOR_FILLBACKGROUND));\n this.properties.add(new ColorProperty(PROP_FILL_COLOR));\n this.properties.add(new BooleanProperty(PROP_FILLCOLOR_ALARM_SENSITIVE, false));\n this.properties.add(new BooleanProperty(PROP_EFFECT_3D));\n this.properties.add(new FloatProperty(PROP_LEVEL_HI));\n this.properties.add(new FloatProperty(PROP_LEVEL_HIHI));\n this.properties.add(new FloatProperty(PROP_LEVEL_LO));\n this.properties.add(new FloatProperty(PROP_LEVEL_LOLO));\n this.properties.add(new BooleanProperty(PROP_LIMITS_FROM_PV));\n this.properties.add(new FontProperty(PROP_FONT));\n this.properties.add(new BooleanProperty(PROP_LOG_SCALE));\n this.properties.add(new FloatProperty(PROP_MAXIMUM));\n this.properties.add(new FloatProperty(PROP_MAJOR_TICK_STEP_HINT));\n this.properties.add(new FloatProperty(PROP_MINIMUM));\n this.properties.add(new FontProperty(PROP_SCALE_FONT));\n this.properties.add(new StringProperty(PROP_SCALE_FORMAT));\n this.properties.add(new BooleanProperty(PROP_SHOW_BULB));\n this.properties.add(new BooleanProperty(PROP_SHOW_HI));\n this.properties.add(new BooleanProperty(PROP_SHOW_HIHI));\n this.properties.add(new BooleanProperty(PROP_SHOW_LO));\n this.properties.add(new BooleanProperty(PROP_SHOW_LOLO));\n this.properties.add(new BooleanProperty(PROP_SHOW_MARKERS));\n this.properties.add(new BooleanProperty(PROP_SHOW_MINOR_TICKS));\n this.properties.add(new BooleanProperty(PROP_SHOW_SCALE));\n this.properties.add(new BooleanProperty(PROP_TRANSPARENT_BACKGROUND));\n this.properties.add(new IntProperty(PROP_UNIT));\n this.properties.add(new StringProperty(PROP_VALUE_LABEL_FORMAT));\n }\n\n draw(g: Graphics) {\n const { scale, min, max } = this;\n let area = this.area;\n if (this.borderAlarmSensitive) {\n area = shrink(this.area, 2 * this.scale);\n }\n const backgroundColor = this.alarmSensitiveBackgroundColor;\n const foregroundColor = this.alarmSensitiveForegroundColor;\n const fillColor = this.alarmSensitiveFillColor;\n if (!this.transparentBackground) {\n g.fillRect({ ...area, color: backgroundColor });\n }\n\n let pipeHeight = area.height;\n if (this.showBulb) {\n let diameter = Math.min(area.width / 2, this.bulbMaxDiameter);\n pipeHeight = (area.height < diameter) ? 0 : (area.height - diameter);\n }\n let pipeArea = { ...area, height: pipeHeight };\n\n const linearScale = new LinearScale(scale, this.scaleFont, min,\n max, this.logScale, this.majorTickStepHint, foregroundColor,\n this.showMinorTicks, this.showScale);\n linearScale.scaleFormat = this.scaleFormat;\n\n let unitHeight = 0;\n let unitText = '';\n if (this.unit === 0) {\n unitText = '°C';\n } else if (this.unit === 1) {\n unitText = '°F';\n } else if (this.unit === 2) {\n unitText = 'K';\n }\n if (unitText) {\n const unitFont = Font.ARIAL_9.scale(scale);\n const fm = g.measureText(unitText, unitFont);\n const padding = 2 * scale;\n unitHeight = fm.height + (2 * padding);\n g.fillText({\n x: area.x + (area.width / 2) - (this.pipeWidth / 2) - padding,\n y: area.y + padding,\n baseline: 'top',\n align: 'right',\n color: foregroundColor,\n font: unitFont,\n text: unitText,\n });\n }\n\n const x2 = pipeArea.x + (pipeArea.width / 2) - (this.pipeWidth / 2) - (1 * scale);\n const scaleArea: Bounds = {\n ...pipeArea,\n y: pipeArea.y + unitHeight,\n height: pipeArea.height - unitHeight + linearScale.calculateMargin(g, false),\n };\n const scaleWidth = linearScale.drawVertical(g, x2, scaleArea.y, scaleArea.height, false);\n const cornerSize = Math.floor(this.pipeWidth / 2);\n\n pipeArea = {\n ...pipeArea,\n y: linearScale.getValuePosition(max) - cornerSize,\n height: linearScale.scaleLength + (2 * cornerSize),\n };\n\n this.drawPipe(g, pipeArea, linearScale);\n\n if (this.showMarkers) {\n this.drawMarkers(g, area, linearScale);\n }\n\n if (this.showBulb) {\n let diameter = Math.min(area.width / 2, this.bulbMaxDiameter);\n const lineWidth = 1 * scale;\n const cx = area.x + area.width / 2;\n const cy = area.y + pipeHeight + (diameter / 2);\n const rx = diameter / 2;\n const ry = diameter / 2;\n g.fillEllipse({ cx, cy, rx, ry, color: fillColor });\n if (this.effect3d) {\n const gradient = g.createLinearGradient(cx - rx, cy - ry, cx + rx, cy + ry);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, fillColor.withAlpha(0).toString());\n g.fillEllipse({ cx, cy, rx, ry, gradient });\n }\n g.strokeEllipse({\n cx,\n cy,\n rx: rx - (lineWidth / 2),\n ry: ry - (lineWidth / 2),\n color: this.effect3d ? OUTLINE_COLOR_3D : foregroundColor,\n lineWidth,\n });\n\n // Cover border between pipe and bulb\n const joint: Bounds = {\n x: Math.round(pipeArea.x + (pipeArea.width / 2) - (this.pipeWidth / 2)) + this.outlineWidth,\n y: Math.floor(linearScale.getValuePosition(min)),\n width: this.pipeWidth - (2 * this.outlineWidth),\n height: scale * 3,\n };\n if (this.effect3d) {\n // On pipe, gradient does not consider outline, so do same\n const gx1 = Math.round(pipeArea.x + (pipeArea.width / 2) - (this.pipeWidth / 2));\n const gx2 = gx1 + this.pipeWidth;\n const gradient = g.createLinearGradient(gx1, joint.y, gx2, joint.y);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, fillColor.toString());\n g.fillRect({ ...joint, gradient });\n } else {\n g.fillRect({ ...joint, color: fillColor });\n }\n\n const value = this.pv?.value;\n if (value) {\n g.fillText({\n x: cx,\n y: cy,\n align: 'center',\n baseline: 'middle',\n color: fillColor.contrast(),\n font: this.font,\n text: this.format(value),\n });\n }\n\n }\n }\n\n private drawPipe(g: Graphics, area: Bounds, linearScale: LinearScale) {\n const { scale, outlineWidth, min, max } = this;\n const foregroundColor = this.alarmSensitiveForegroundColor;\n const fillColor = this.alarmSensitiveFillColor;\n const pipeBounds: Bounds = {\n x: Math.round(area.x + (area.width / 2) - (this.pipeWidth / 2)),\n y: area.y,\n width: this.pipeWidth,\n height: area.height,\n };\n\n const value = this.getFillValue();\n let valuePosition = linearScale.getValuePosition(value);\n if (max > min) {\n if (value > max) {\n valuePosition -= (10 * scale);\n } else if (value < min) {\n valuePosition += (10 * scale);\n }\n } else {\n if (value > min) {\n valuePosition += (10 * scale);\n } else if (value < max) {\n valuePosition -= (10 * scale);\n }\n }\n\n const cornerSize = this.pipeWidth / 2;\n const { x, y, width, height } = pipeBounds;\n if (this.effect3d) {\n let gradient = g.createLinearGradient(x, y, x + width, y);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, this.colorFillbackground.toString());\n g.fillRect({\n ...pipeBounds,\n rx: cornerSize / 2,\n ry: cornerSize / 2,\n gradient,\n });\n gradient = g.createLinearGradient(x, y, x + width, y);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, fillColor.toString());\n g.fillRect({\n x,\n y: valuePosition,\n width,\n height: y + height - valuePosition,\n rx: cornerSize / 2,\n ry: cornerSize / 2,\n gradient,\n });\n } else {\n g.fillRect({\n ...pipeBounds,\n rx: cornerSize / 2,\n ry: cornerSize / 2,\n color: this.colorFillbackground,\n });\n g.fillRect({\n x,\n y: valuePosition,\n width,\n height: y + height - valuePosition,\n rx: cornerSize / 2,\n ry: cornerSize / 2,\n color: fillColor,\n });\n }\n\n let outline: Bounds = shrink(pipeBounds, outlineWidth / 2);\n g.strokeRect({\n ...outline,\n rx: cornerSize / 2,\n ry: cornerSize / 2,\n color: this.effect3d ? OUTLINE_COLOR_3D : foregroundColor,\n lineWidth: outlineWidth,\n });\n }\n\n private drawMarkers(g: Graphics, area: Bounds, linearScale: LinearScale) {\n const { lolo, lo, hi, hihi } = this;\n const font = Font.ARIAL_9.scale(this.scale);\n const x = area.x + (area.width / 2) + (this.pipeWidth / 2);\n if (this.showLoLo && lolo !== undefined) {\n const y = Math.round(linearScale.getValuePosition(lolo));\n g.strokePath({\n path: new Path(x, y).lineTo(x + this.markerTickLength, y),\n color: this.colorLoLo,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x: x + this.markerTickLength + this.markerGap,\n y,\n text: 'LOLO',\n align: 'left',\n baseline: 'middle',\n color: this.colorLoLo,\n font,\n });\n }\n if (this.showLo && lo !== undefined) {\n const y = Math.round(linearScale.getValuePosition(lo));\n g.strokePath({\n path: new Path(x, y).lineTo(x + this.markerTickLength, y),\n color: this.colorLo,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x: x + this.markerTickLength + this.markerGap,\n y,\n text: 'LO',\n align: 'left',\n baseline: 'middle',\n color: this.colorLo,\n font,\n });\n }\n if (this.showHi && hi !== undefined) {\n const y = Math.round(linearScale.getValuePosition(hi));\n g.strokePath({\n path: new Path(x, y).lineTo(x + this.markerTickLength, y),\n color: this.colorHi,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x: x + this.markerTickLength + this.markerGap,\n y,\n text: 'HI',\n align: 'left',\n baseline: 'middle',\n color: this.colorHi,\n font,\n });\n }\n if (this.showHiHi && hihi !== undefined) {\n const y = Math.round(linearScale.getValuePosition(hihi));\n g.strokePath({\n path: new Path(x, y).lineTo(x + this.markerTickLength, y),\n color: this.colorHiHi,\n lineWidth: this.markerTickLineWidth,\n });\n g.fillText({\n x: x + this.markerTickLength + this.markerGap,\n y,\n text: 'HIHI',\n align: 'left',\n baseline: 'middle',\n color: this.colorHiHi,\n font,\n });\n }\n }\n\n get min() {\n if (this.limitsFromPv) {\n return this.pv?.lowerDisplayLimit ?? this.minimum;\n } else {\n return this.minimum;\n }\n }\n\n get max() {\n if (this.limitsFromPv) {\n return this.pv?.upperDisplayLimit ?? this.maximum;\n } else {\n return this.maximum;\n }\n }\n\n get lolo() {\n if (this.limitsFromPv && this.pv && !this.pv.disconnected) {\n return this.pv.lowerAlarmLimit;\n } else {\n return this.levelLoLo;\n }\n }\n\n get lo() {\n if (this.limitsFromPv && this.pv && !this.pv.disconnected) {\n return this.pv.lowerWarningLimit;\n } else {\n return this.levelLo;\n }\n }\n\n get hi() {\n if (this.limitsFromPv && this.pv && !this.pv.disconnected) {\n return this.pv.upperWarningLimit;\n } else {\n return this.levelHi;\n }\n }\n\n get hihi() {\n if (this.limitsFromPv && this.pv && !this.pv.disconnected) {\n return this.pv.upperAlarmLimit;\n } else {\n return this.levelHiHi;\n }\n }\n\n get pipeWidth() { return this.scale * 15; }\n get bulbMaxDiameter() { return this.scale * 40; }\n get outlineWidth() { return this.scale * 1; }\n get markerTickLength() { return this.scale * 10; }\n get markerTickLineWidth() { return this.scale * 2; }\n get markerGap() { return this.scale * 3; }\n get alarmSensitiveFillColor() {\n if (this.fillColorAlarmSensitive) {\n if (this.isMajorSeverity()) {\n return Color.RED;\n } else if (this.isMinorSeverity()) {\n return Color.ORANGE;\n }\n }\n return this.fillColor;\n }\n\n private getFillValue() {\n let value = this.pv?.value ?? this.min;\n value = Math.max(this.min, value);\n value = Math.min(this.max, value);\n return value;\n }\n\n private format(v: number) {\n if (this.valueLabelFormat) {\n return new DecimalFormat(this.valueLabelFormat).format(v);\n } else {\n return String(Number(v.toFixed(3)));\n }\n }\n\n get colorLo(): Color { return this.properties.getValue(PROP_COLOR_LO); }\n get colorLoLo(): Color { return this.properties.getValue(PROP_COLOR_LOLO); }\n get colorHi(): Color { return this.properties.getValue(PROP_COLOR_HI); }\n get colorHiHi(): Color { return this.properties.getValue(PROP_COLOR_HIHI); }\n get colorFillbackground(): Color { return this.properties.getValue(PROP_COLOR_FILLBACKGROUND); }\n get fillColorAlarmSensitive(): boolean { return this.properties.getValue(PROP_FILLCOLOR_ALARM_SENSITIVE); }\n get fillColor(): Color { return this.properties.getValue(PROP_FILL_COLOR); }\n get font(): Font { return this.properties.getValue(PROP_FONT).scale(this.scale); }\n get effect3d(): boolean { return this.properties.getValue(PROP_EFFECT_3D); }\n get levelLo(): number { return this.properties.getValue(PROP_LEVEL_LO); }\n get levelLoLo(): number { return this.properties.getValue(PROP_LEVEL_LOLO); }\n get levelHi(): number { return this.properties.getValue(PROP_LEVEL_HI); }\n get levelHiHi(): number { return this.properties.getValue(PROP_LEVEL_HIHI); }\n get limitsFromPv(): boolean { return this.properties.getValue(PROP_LIMITS_FROM_PV); }\n get logScale(): boolean { return this.properties.getValue(PROP_LOG_SCALE); }\n get minimum(): number { return this.properties.getValue(PROP_MINIMUM); }\n get majorTickStepHint(): number { return this.scale * this.properties.getValue(PROP_MAJOR_TICK_STEP_HINT); }\n get maximum(): number { return this.properties.getValue(PROP_MAXIMUM); }\n get scaleFont(): Font { return this.properties.getValue(PROP_SCALE_FONT).scale(this.scale); }\n get scaleFormat(): string { return this.properties.getValue(PROP_SCALE_FORMAT); }\n get showBulb(): boolean { return this.properties.getValue(PROP_SHOW_BULB); }\n get showMarkers(): boolean { return this.properties.getValue(PROP_SHOW_MARKERS); }\n get showMinorTicks(): boolean { return this.properties.getValue(PROP_SHOW_MINOR_TICKS); }\n get showLo(): boolean { return this.properties.getValue(PROP_SHOW_LO); }\n get showLoLo(): boolean { return this.properties.getValue(PROP_SHOW_LOLO); }\n get showHi(): boolean { return this.properties.getValue(PROP_SHOW_HI); }\n get showHiHi(): boolean { return this.properties.getValue(PROP_SHOW_HIHI); }\n get showScale(): boolean { return this.properties.getValue(PROP_SHOW_SCALE); }\n get transparentBackground(): boolean { return this.properties.getValue(PROP_TRANSPARENT_BACKGROUND); }\n get unit(): number { return this.properties.getValue(PROP_UNIT); }\n get valueLabelFormat(): string { return this.properties.getValue(PROP_VALUE_LABEL_FORMAT); }\n}\n","import { Color } from '../../../Color';\nimport { Font } from '../../../Font';\nimport { LinearScale } from '../LinearScale';\nimport { XYGraph } from './XYGraph';\n\nconst LOWEST_LOG_10 = -323.3062; // 4.940656e-324\nconst HIGHEST_LOG_10 = 308.2547; // 1.797629e308\n\nexport class Axis {\n\n linearScale?: LinearScale;\n\n // Update during draw operation, influenced by zoom actions\n private _effectiveMinimum?: number;\n private _effectiveMaximum?: number;\n\n constructor(private widget: XYGraph, readonly index: number) {\n }\n\n get scale() { return this.widget.scale; }\n\n private getValue(propertySufix: string) {\n return this.widget.properties.getValue(`axis_${this.index}_${propertySufix}`);\n }\n\n isDateEnabled() {\n return this.timeFormat !== 0;\n }\n\n isHorizontal() {\n return this.index === 0 || (this.index !== 1 && !this.yAxis);\n }\n\n isVertical() {\n return !this.isHorizontal();\n }\n\n isPrimary() {\n return this.index <= 1;\n }\n\n get effectiveMinimum(): number {\n return this._effectiveMinimum ?? this.minimum;\n }\n\n set effectiveMinimum(effectiveMinimum: number) {\n this._effectiveMinimum = effectiveMinimum;\n }\n\n get effectiveMaximum(): number {\n return this._effectiveMaximum ?? this.maximum;\n }\n\n set effectiveMaximum(effectiveMaximum: number) {\n this._effectiveMaximum = effectiveMaximum;\n }\n\n performAutoScale() {\n const range = this.widget.calculateAutoscaledRange(this);\n if (range) {\n this.effectiveMinimum = range.start;\n this.effectiveMaximum = range.stop;\n this.widget.requestRepaint();\n }\n }\n\n applyZoom(center: number, ratio: number) { // Positive means zoom-in\n let min = this.effectiveMinimum;\n let max = this.effectiveMaximum;\n let t1: number;\n let t2: number;\n if (this.logScale) {\n max = Math.log10(max);\n min = Math.log10(min);\n const c = Math.log10(center) * ratio;\n const e = 1 - ratio;\n t1 = c + min * e;\n t2 = c + max * e;\n if (t1 < LOWEST_LOG_10) { // clamp lower value\n t1 = LOWEST_LOG_10;\n }\n t1 = Math.pow(10, t1);\n if (t2 > HIGHEST_LOG_10) { // clamp upper value\n t2 = HIGHEST_LOG_10;\n }\n t2 = Math.pow(10, t2);\n } else {\n const f = Math.max(Math.abs(min), Math.abs(max));\n min /= f;\n max /= f;\n const c = (center / f) * ratio;\n const e = 1 - ratio;\n t1 = (c + min * e) * f;\n t2 = (c + max * e) * f;\n }\n\n this.effectiveMinimum = t1!;\n this.effectiveMaximum = t2!;\n this.widget.requestRepaint();\n }\n\n get autoScale(): boolean { return this.getValue('auto_scale'); }\n get autoScaleTreshold(): number { return this.getValue('auto_scale_treshold'); }\n get axisColor(): Color { return this.getValue('axis_color'); }\n get axisTitle(): string { return this.getValue('axis_title'); }\n get dashGridLine(): boolean { return this.getValue('dash_grid_line'); }\n get gridColor(): Color { return this.getValue('grid_color'); }\n get leftBottomSide(): boolean { return this.getValue('left_bottom_side'); }\n get logScale(): boolean { return this.getValue('log_scale'); }\n private get maximum(): number { return this.getValue('maximum'); }\n private get minimum(): number { return this.getValue('minimum'); }\n get scaleFont(): Font { return this.getValue('scale_font').scale(this.scale); }\n get scaleFormat(): string { return this.getValue('scale_format'); }\n get showGrid(): boolean { return this.getValue('show_grid'); }\n get timeFormat(): number { return this.getValue('time_format'); }\n get titleFont(): Font { return this.getValue('title_font').scale(this.scale); }\n get visible(): boolean { return this.getValue('visible'); }\n get yAxis(): boolean { return this.getValue('y_axis'); }\n}\n","import { Axis } from './Axis';\n\nexport interface Command {\n undo(): void;\n redo(): void;\n}\n\ninterface Range {\n min: number;\n max: number;\n}\n\nexport class ZoomCommand implements Command {\n\n private beforeXRanges: Range[] = [];\n private beforeYRanges: Range[] = [];\n private afterXRanges: Range[] = [];\n private afterYRanges: Range[] = [];\n\n constructor(private xAxis: Axis[], private yAxis: Axis[]) {\n for (const axis of xAxis) {\n this.beforeXRanges.push({\n min: axis.effectiveMinimum,\n max: axis.effectiveMaximum,\n });\n }\n for (const axis of yAxis) {\n this.beforeYRanges.push({\n min: axis.effectiveMinimum,\n max: axis.effectiveMaximum,\n });\n }\n }\n\n saveState() {\n for (const axis of this.xAxis) {\n this.afterXRanges.push({\n min: axis.effectiveMinimum,\n max: axis.effectiveMaximum,\n });\n }\n for (const axis of this.yAxis) {\n this.afterYRanges.push({\n min: axis.effectiveMinimum,\n max: axis.effectiveMaximum,\n });\n }\n }\n\n undo() {\n for (let i = 0; i < this.xAxis.length; i++) {\n const axis = this.xAxis[i];\n const range = this.beforeXRanges[i];\n axis.effectiveMinimum = range.min;\n axis.effectiveMaximum = range.max;\n }\n for (let i = 0; i < this.yAxis.length; i++) {\n const axis = this.yAxis[i];\n const range = this.beforeYRanges[i];\n axis.effectiveMinimum = range.min;\n axis.effectiveMaximum = range.max;\n }\n }\n\n redo() {\n for (let i = 0; i < this.xAxis.length; i++) {\n const axis = this.xAxis[i];\n const range = this.afterXRanges[i];\n axis.effectiveMinimum = range.min;\n axis.effectiveMaximum = range.max;\n }\n for (let i = 0; i < this.yAxis.length; i++) {\n const axis = this.yAxis[i];\n const range = this.afterYRanges[i];\n axis.effectiveMinimum = range.min;\n axis.effectiveMaximum = range.max;\n }\n }\n}\n\nexport class CommandBuffer {\n\n private undoStack: Command[] = [];\n private redoStack: Command[] = [];\n\n canUndo() {\n return this.undoStack.length > 0;\n }\n\n canRedo() {\n return this.redoStack.length > 0;\n }\n\n add(command: Command) {\n this.undoStack.push(command);\n this.redoStack.length = 0;\n }\n\n undo() {\n const command = this.undoStack.pop();\n if (command) {\n command.undo();\n this.redoStack.push(command);\n }\n }\n\n redo() {\n const command = this.redoStack.pop();\n if (command) {\n command.redo();\n this.undoStack.push(command);\n }\n }\n}\n","import { OpiGrabEvent, OpiMouseEvent } from '../../../EventHandler';\nimport { HitRegionSpecification } from '../../../HitRegionSpecification';\nimport { Bounds } from '../../../positioning';\nimport { ZoomCommand } from './CommandBuffer';\nimport { XYGraph } from './XYGraph';\n\nexport class PlotAreaRegion implements HitRegionSpecification {\n\n id: string;\n cursor?: string;\n selection?: Bounds;\n\n private grabStart?: OpiMouseEvent;\n private prevGrabEvent?: OpiGrabEvent;\n private grabZoomCommand?: ZoomCommand;\n\n constructor(id: string, private widget: XYGraph) {\n this.id = id;\n }\n\n tooltip() {\n return this.widget.tooltip;\n }\n\n mouseDown(evt: OpiMouseEvent) {\n const { widget } = this;\n switch (widget.toolbar?.currentTool) {\n case 'rubberband-zoom':\n case 'horizontal-zoom':\n case 'vertical-zoom':\n this.grabStart = evt;\n break;\n case 'panning':\n this.grabZoomCommand = new ZoomCommand(\n widget.getXAxes(), widget.getYAxes());\n break;\n }\n }\n\n grab(evt: OpiGrabEvent) {\n switch (this.widget.toolbar?.currentTool) {\n case 'rubberband-zoom':\n case 'horizontal-zoom':\n case 'vertical-zoom':\n if (this.grabStart) {\n this.selection = {\n ...this.grabStart.point,\n width: evt.dx,\n height: evt.dy,\n };\n this.widget.requestRepaint();\n }\n break;\n case 'panning':\n this.pan(evt);\n this.prevGrabEvent = evt;\n this.widget.requestRepaint();\n break;\n }\n }\n\n grabEnd() {\n const { grabZoomCommand, selection, widget } = this;\n switch (widget.toolbar?.currentTool) {\n case 'rubberband-zoom':\n if (selection) {\n const rubberbandZoomCommand = new ZoomCommand(\n widget.getXAxes(), widget.getYAxes());\n this.rangeZoomXAxes(selection);\n this.rangeZoomYAxes(selection);\n rubberbandZoomCommand.saveState();\n widget.toolbar.addCommand(rubberbandZoomCommand);\n }\n break;\n case 'horizontal-zoom':\n if (selection) {\n const horizontalZoomCommand = new ZoomCommand(\n widget.getXAxes(), widget.getYAxes());\n this.rangeZoomXAxes(selection);\n horizontalZoomCommand.saveState();\n widget.toolbar.addCommand(horizontalZoomCommand);\n }\n break;\n case 'vertical-zoom':\n if (selection) {\n const verticalZoomCommand = new ZoomCommand(\n widget.getXAxes(), widget.getYAxes());\n this.rangeZoomYAxes(selection);\n verticalZoomCommand.saveState();\n widget.toolbar.addCommand(verticalZoomCommand);\n }\n break;\n case 'panning':\n if (grabZoomCommand) {\n grabZoomCommand.saveState();\n widget.toolbar.addCommand(grabZoomCommand);\n }\n break;\n }\n this.selection = undefined;\n this.prevGrabEvent = undefined;\n this.grabZoomCommand = undefined;\n this.widget.requestRepaint();\n }\n\n click(evt: OpiMouseEvent) {\n const { widget } = this;\n switch (widget.toolbar?.currentTool) {\n case 'zoom-in':\n const zoomInCommand = new ZoomCommand(\n widget.getXAxes(), widget.getYAxes());\n for (const axis of widget.getAxes()) {\n const pos = axis.isHorizontal() ? evt.point.x : evt.point.y;\n const center = axis.linearScale!.getPositionValue(pos);\n axis.applyZoom(center, 0.1);\n }\n zoomInCommand.saveState();\n widget.toolbar.addCommand(zoomInCommand);\n break;\n case 'zoom-out':\n const zoomOutCommand = new ZoomCommand(\n widget.getXAxes(), widget.getYAxes());\n for (const axis of widget.getAxes()) {\n const pos = axis.isHorizontal() ? evt.point.x : evt.point.y;\n const center = axis.linearScale!.getPositionValue(pos);\n axis.applyZoom(center, -0.1);\n }\n zoomOutCommand.saveState();\n widget.toolbar.addCommand(zoomOutCommand);\n break;\n }\n }\n\n private rangeZoomXAxes(selection: Bounds) {\n for (const axis of this.widget.getXAxes()) {\n let v1 = axis.linearScale!.getPositionValue(selection.x);\n let v2 = axis.linearScale!.getPositionValue(selection.x + selection.width);\n if (v1 > v2) {\n const swap = v1;\n v1 = v2;\n v2 = swap;\n }\n const range = axis.linearScale!.getMinMax();\n v1 = Math.max(range.start, v1);\n v2 = Math.min(range.stop, v2);\n\n axis.effectiveMinimum = v1;\n axis.effectiveMaximum = v2;\n }\n }\n\n private rangeZoomYAxes(selection: Bounds) {\n for (const axis of this.widget.getYAxes()) {\n let v1 = axis.linearScale!.getPositionValue(selection.y);\n let v2 = axis.linearScale!.getPositionValue(selection.y + selection.height);\n if (v1 > v2) {\n const swap = v1;\n v1 = v2;\n v2 = swap;\n }\n const range = axis.linearScale!.getMinMax();\n v1 = Math.max(range.start, v1);\n v2 = Math.min(range.stop, v2);\n\n axis.effectiveMinimum = v1;\n axis.effectiveMaximum = v2;\n }\n }\n\n private pan(evt: OpiGrabEvent) {\n const { prevGrabEvent, widget } = this;\n if (prevGrabEvent) {\n const relx = prevGrabEvent.dx - evt.dx;\n if (relx !== 0) {\n for (const axis of widget.getXAxes()) {\n const linearScale = axis.linearScale!;\n const range = linearScale.getMinMax();\n const startPos = linearScale.getValuePosition(range.start) + relx;\n const stopPos = linearScale.getValuePosition(range.stop) + relx;\n axis.effectiveMinimum = linearScale.getPositionValue(startPos);\n axis.effectiveMaximum = linearScale.getPositionValue(stopPos);\n }\n }\n const rely = prevGrabEvent.dy - evt.dy;\n if (rely !== 0) {\n for (const axis of widget.getYAxes()) {\n const linearScale = axis.linearScale!;\n const range = linearScale.getMinMax();\n const startPos = linearScale.getValuePosition(range.start) + rely;\n const stopPos = linearScale.getValuePosition(range.stop) + rely;\n axis.effectiveMinimum = linearScale.getPositionValue(startPos);\n axis.effectiveMaximum = linearScale.getPositionValue(stopPos);\n }\n }\n }\n }\n}\n","\nexport interface Sample {\n x: number;\n y: number;\n}\n\n/**\n * Sample buffer that limits samples to a fixed total.\n * When the buffer is full, samples are dropped in FIFO order.\n */\nclass CircularBuffer {\n private pointer = 0;\n private samples: (Sample | undefined)[] = [];\n\n constructor(bufferSize: number) {\n this.samples = Array(bufferSize).fill(undefined);\n }\n\n /**\n * Adds a sample to this buffer. Samples may be added in non-chronological order.\n */\n push(x: number, y: number) {\n this.samples[this.pointer] = { x, y };\n this.pointer = (this.pointer + 1) % this.samples.length;\n }\n\n clear() {\n this.samples.fill(undefined);\n this.pointer = 0;\n }\n\n isFull() {\n const peek = (this.pointer + 1) % this.samples.length;\n return this.samples[peek] !== undefined;\n }\n\n isEmpty() {\n return this.tail() === undefined;\n }\n\n tail() {\n if (this.pointer === 0) {\n return this.samples[this.samples.length - 1];\n } else {\n return this.samples[this.pointer - 1];\n }\n }\n\n /**\n * Returns a copy of this buffer's current content.\n */\n snapshot(sort = false) {\n if (sort) {\n const result = this.samples.filter(s => s !== undefined) as Sample[];\n return result.sort((s1, s2) => s1.x - s2.x);\n } else {\n const oldest = this.samples.slice(this.pointer).filter(s => s !== undefined) as Sample[];\n const newest = this.samples.slice(0, this.pointer).filter(s => s !== undefined) as Sample[];\n return oldest.concat(newest);\n }\n }\n}\n\nexport class TraceBuffer {\n\n private traceData: CircularBuffer;\n\n private x = 0;\n private xPending = false;\n private y = 0;\n private yTimestamp?= 0;\n private yPending = false;\n\n private xArray: number[] = [];\n private xArrayPending = false;\n private yArray: number[] = [];\n private yArrayPending = false;\n\n constructor(\n private bufferSize: number,\n private plotMode: number,\n private updateMode: number,\n private concatenateData: boolean,\n private chronological: boolean,\n ) {\n this.traceData = new CircularBuffer(bufferSize);\n }\n\n clear() {\n this.traceData.clear();\n this.x = 0;\n this.xPending = false;\n this.y = 0;\n this.yPending = false;\n this.yTimestamp = 0;\n this.xArray = [];\n this.xArrayPending = false;\n this.yArray = [];\n this.yArrayPending = false;\n }\n\n snapshot() {\n return this.traceData.snapshot();\n }\n\n updateX(x: number) {\n this.x = x;\n this.xPending = true;\n this.maybeAddPoint();\n }\n\n updateY(y: number, timestamp?: number) {\n this.y = y;\n this.yTimestamp = timestamp;\n this.yPending = true;\n this.maybeAddPoint();\n }\n\n updateXArray(xArray: number[]) {\n this.xArray = xArray;\n this.xArrayPending = true;\n this.maybeAddArray();\n }\n\n updateYArray(yArray: number[]) {\n this.yArray = yArray;\n this.yArrayPending = true;\n this.maybeAddArray();\n }\n\n private maybeAddPoint() {\n if (this.plotMode === 1 && this.traceData.isFull()) { // Plot n pts & stop\n return;\n }\n const { xPending, yPending, chronological, updateMode } = this;\n if (updateMode === 0) { // X or Y\n if ((chronological && yPending) || (!chronological && (xPending || yPending))) {\n this.addPoint();\n }\n } else if (updateMode === 1) { // X and Y\n if ((chronological && yPending) || (!chronological && (xPending && yPending))) {\n this.addPoint();\n }\n } else if (updateMode === 2) { // X\n if ((chronological && yPending) || (!chronological && xPending)) {\n this.addPoint();\n }\n } else if (updateMode === 3) { // Y\n if (this.yPending) {\n this.addPoint();\n }\n }\n }\n\n private maybeAddArray() {\n if (this.plotMode === 1 && this.traceData.isFull()) { // Plot n pts & stop\n return;\n }\n const { xArrayPending, yArrayPending, chronological, updateMode } = this;\n if (updateMode === 0) { // X or Y\n if ((chronological && yArrayPending)\n || (!chronological && (xArrayPending || yArrayPending))) {\n this.addArray();\n }\n } else if (updateMode === 1) { // X and Y\n if ((chronological && yArrayPending)\n || (!chronological && (xArrayPending && yArrayPending))) {\n this.addArray();\n }\n } else if (updateMode === 2) { // X\n if ((chronological && yArrayPending)\n || (!chronological && xArrayPending)) {\n this.addArray();\n }\n } else if (updateMode === 3) { // Y\n if (this.yArrayPending) {\n this.addArray();\n }\n }\n }\n\n private addPoint() {\n if (!this.concatenateData) {\n this.traceData.clear();\n }\n\n let xValue = this.x;\n if (this.chronological) {\n if (this.updateMode === 5) { // Trigger\n xValue = new Date().getTime();\n } else if (this.yTimestamp !== undefined) {\n xValue = this.yTimestamp!;\n } else { // X is a sequence counter\n const tail = this.traceData.tail();\n xValue = tail ? tail.x + 1 : 0;\n }\n }\n this.traceData.push(xValue, this.y);\n this.xPending = false;\n this.yPending = false;\n }\n\n private addArray() {\n if (!this.concatenateData) {\n this.traceData.clear();\n }\n\n let { xArray, yArray } = this;\n if (this.chronological) { // X is a sequence counter\n xArray = Array(yArray.length);\n if (this.traceData.isEmpty()) {\n for (let i = 0; i < yArray.length; i++) {\n xArray[i] = i;\n }\n } else {\n const tail = this.traceData.tail()!;\n for (let i = 1; i < yArray.length; i++) {\n xArray[i - 1] = tail.x + i;\n }\n }\n }\n\n let arrayLength = Math.min(xArray.length, yArray.length);\n let until = Math.min(arrayLength, this.bufferSize); // Ignore tail\n for (let i = 0; i < until; i++) {\n this.traceData.push(xArray[i], yArray[i]);\n }\n\n this.xArrayPending = false;\n this.yArrayPending = false;\n }\n}\n","import { Color } from '../../../Color';\nimport { Graphics, Path } from '../../../Graphics';\nimport { Point } from '../../../positioning';\nimport { PV, PVListener } from '../../../pv/PV';\nimport { TraceBuffer } from './TraceBuffer';\nimport { XYGraph } from './XYGraph';\n\nexport class Trace {\n private traceData?: TraceBuffer;\n\n private xPVInstance?: PV;\n private yPVInstance?: PV;\n\n private xPVListener: PVListener = () => {\n const pv = this.xPVInstance;\n if (!pv) {\n return;\n }\n if (Array.isArray(pv.value)) {\n this.traceData?.updateXArray(pv.value);\n } else {\n const numberValue = pv.toNumber();\n if (numberValue !== undefined && numberValue !== null) {\n this.traceData?.updateX(numberValue);\n }\n }\n };\n\n private yPVListener: PVListener = () => {\n const pv = this.yPVInstance;\n if (!pv) {\n return;\n }\n if (Array.isArray(pv.value)) {\n this.traceData?.updateYArray(pv.value);\n } else {\n const xAxis = this.widget.getAxis(this.xAxisIndex);\n const numberValue = pv.toNumber();\n if (numberValue !== undefined && numberValue !== null) {\n if (xAxis.isDateEnabled()) {\n const t = (pv.time || new Date()).getTime();\n this.traceData?.updateY(numberValue, t);\n } else {\n this.traceData?.updateY(numberValue);\n }\n }\n }\n };\n\n constructor(private widget: XYGraph, private i: number) {\n }\n\n init() {\n const { bufferSize, plotMode, updateMode, concatenateData } = this;\n const chronological = !this.xPV;\n this.traceData = new TraceBuffer(bufferSize, plotMode,\n updateMode, concatenateData, chronological);\n if (this.xPV) {\n this.xPVInstance = this.widget.display.pvEngine.createPV(this.xPV);\n this.xPVInstance.addListener(this.xPVListener);\n }\n if (this.yPV) {\n this.yPVInstance = this.widget.display.pvEngine.createPV(this.yPV);\n this.yPVInstance.addListener(this.yPVListener);\n }\n\n this.widget.addPropertyListener(`trace_${this.i}_x_pv`, () => {\n const pv = this.widget.display.pvEngine.createPV(this.xPV);\n if (pv !== this.xPVInstance) {\n this.xPVInstance?.removeListener(this.xPVListener);\n this.xPVInstance = pv;\n this.xPVInstance.addListener(this.xPVListener);\n }\n });\n\n this.widget.addPropertyListener(`trace_${this.i}_y_pv`, () => {\n const pv = this.widget.display.pvEngine.createPV(this.yPV);\n if (pv !== this.yPVInstance) {\n this.yPVInstance?.removeListener(this.yPVListener);\n this.yPVInstance = pv;\n this.yPVInstance.addListener(this.yPVListener);\n }\n });\n }\n\n snapshot() {\n return this.traceData?.snapshot() || [];\n }\n\n drawTrace(g: Graphics, points: Point[]) {\n const { lineWidth } = this;\n if (this.traceType === 0) { // Solid Line\n g.strokePath({\n path: Path.fromPoints(points),\n color: this.traceColor,\n lineWidth,\n });\n } else if (this.traceType === 1) { // Dash Line\n g.strokePath({\n path: Path.fromPoints(points),\n color: this.traceColor,\n lineWidth,\n dash: [6 * this.scale, 2 * this.scale],\n });\n } else if (this.traceType === 2) { // Point\n // Nothing to do\n } else if (this.traceType === 3) { // Bar\n const yAxis = this.widget.getAxis(this.yAxisIndex).linearScale!;\n const originY = yAxis.getValuePosition(0);\n for (const point of points) {\n g.strokePath({\n path: new Path(point.x, point.y).lineTo(point.x, originY),\n lineWidth,\n color: this.traceColor,\n opacity: 100 / 255,\n });\n }\n } else if (this.traceType === 4 || this.traceType === 5) { // Area, Line Area\n const yAxis = this.widget.getAxis(this.yAxisIndex).linearScale!;\n const originY = yAxis.getValuePosition(0);\n for (let i = 1; i < points.length; i++) {\n const prev = points[i - 1];\n const point = points[i];\n g.fillPath({\n path: new Path(prev.x, prev.y)\n .lineTo(prev.x, originY)\n .lineTo(point.x, originY)\n .lineTo(point.x, point.y),\n color: this.traceColor,\n opacity: 100 / 255,\n });\n }\n if (this.traceType === 5) {\n g.strokePath({\n path: Path.fromPoints(points),\n color: this.traceColor,\n lineWidth,\n });\n }\n } else if (this.traceType === 6) { // Step Vertically\n for (let i = 1; i < points.length; i++) {\n const prev = points[i - 1];\n const point = points[i];\n g.strokePath({\n path: new Path(prev.x, prev.y)\n .lineTo(prev.x, point.y)\n .lineTo(point.x, point.y),\n color: this.traceColor,\n lineWidth,\n });\n }\n } else if (this.traceType === 7) { // Step Horizontally\n for (let i = 1; i < points.length; i++) {\n const prev = points[i - 1];\n const point = points[i];\n g.strokePath({\n path: new Path(prev.x, prev.y)\n .lineTo(point.x, prev.y)\n .lineTo(point.x, point.y),\n color: this.traceColor,\n lineWidth,\n });\n }\n } else if (this.traceType === 8) { // Dash Dot Line\n const { scale } = this;\n g.strokePath({\n path: Path.fromPoints(points),\n color: this.traceColor,\n lineWidth,\n dash: [6 * scale, 2 * scale, 2 * scale, 2 * scale],\n });\n } else if (this.traceType === 9) { // Dash Dot Dot Line\n const { scale } = this;\n g.strokePath({\n path: Path.fromPoints(points),\n color: this.traceColor,\n lineWidth,\n dash: [6 * scale, 2 * scale, 2 * scale, 2 * scale, 2 * scale, 2 * scale],\n });\n } else if (this.traceType === 10) { // Dot Line\n const { scale } = this;\n g.strokePath({\n path: Path.fromPoints(points),\n color: this.traceColor,\n lineWidth,\n dash: [2 * scale, 2 * scale],\n });\n }\n }\n\n drawPoint(g: Graphics, point: Point) {\n g.ctx.fillStyle = this.traceColor.toString();\n g.ctx.strokeStyle = this.traceColor.toString();\n g.ctx.lineWidth = 1 * this.scale;\n const r = this.pointSize / 2;\n const cx = point.x;\n const cy = point.y;\n switch (this.pointStyle) {\n case 1: // Point\n g.ctx.beginPath();\n g.ctx.ellipse(cx, cy, r, r, 0, 0, 2 * Math.PI);\n g.ctx.fill();\n break;\n case 2: // Circle\n g.ctx.beginPath();\n g.ctx.ellipse(cx, cy, r, r, 0, 0, 2 * Math.PI);\n g.ctx.stroke();\n break;\n case 3: // Filled circle (same as point?)\n g.ctx.beginPath();\n g.ctx.ellipse(cx, cy, r, r, 0, 0, 2 * Math.PI);\n g.ctx.fill();\n break;\n case 4: // Triangle\n g.ctx.lineWidth = 1 * this.scale;\n g.ctx.beginPath();\n g.ctx.moveTo(cx - r, cy + r);\n g.ctx.lineTo(cx, cy - r);\n g.ctx.lineTo(cx + r, cy + r);\n g.ctx.closePath();\n g.ctx.stroke();\n break;\n case 5: // Filled triangle\n g.ctx.lineWidth = 1 * this.scale;\n g.ctx.beginPath();\n g.ctx.moveTo(cx - r, cy + r);\n g.ctx.lineTo(cx, cy - r);\n g.ctx.lineTo(cx + r, cy + r);\n g.ctx.closePath();\n g.ctx.fill();\n break;\n case 6: // Square\n g.ctx.strokeRect(cx - r, cy - r, 2 * r, 2 * r);\n break;\n case 7: // Filled square\n g.ctx.fillRect(cx - r, cy - r, 2 * r, 2 * r);\n break;\n case 8: // Diamond\n g.ctx.beginPath();\n g.ctx.moveTo(cx - r, cy);\n g.ctx.lineTo(cx, cy - r);\n g.ctx.lineTo(cx + r, cy);\n g.ctx.lineTo(cx, cy + r);\n g.ctx.closePath();\n g.ctx.stroke();\n break;\n case 9: // Filled Diamond\n g.ctx.beginPath();\n g.ctx.moveTo(cx - r, cy);\n g.ctx.lineTo(cx, cy - r);\n g.ctx.lineTo(cx + r, cy);\n g.ctx.lineTo(cx, cy + r);\n g.ctx.closePath();\n g.ctx.stroke();\n break;\n case 10: // Cross (X)\n g.ctx.beginPath();\n g.ctx.moveTo(cx - r, cy - r);\n g.ctx.lineTo(cx + r, cy + r);\n g.ctx.moveTo(cx + r, cy - r);\n g.ctx.lineTo(cx - r, cy + r);\n g.ctx.stroke();\n break;\n case 11: // Cross (+)\n g.ctx.beginPath();\n g.ctx.moveTo(cx - r, cy);\n g.ctx.lineTo(cx + r, cy);\n g.ctx.moveTo(cx, cy - r);\n g.ctx.lineTo(cx, cy + r);\n g.ctx.stroke();\n break;\n case 12: // Bar\n g.ctx.beginPath();\n g.ctx.moveTo(cx, cy - r);\n g.ctx.lineTo(cx, cy + r);\n g.ctx.stroke();\n }\n }\n\n clearData() {\n this.traceData?.clear();\n }\n\n get scale() { return this.widget.scale; }\n\n private getValue(propertySufix: string) {\n return this.widget.properties.getValue(`trace_${this.i}_${propertySufix}`);\n }\n\n get antiAlias(): boolean { return this.getValue('anti_alias'); }\n get bufferSize(): number { return this.getValue('buffer_size'); }\n get concatenateData(): boolean { return this.getValue('concatenate_data'); }\n get lineWidth(): number { return this.scale * this.getValue('line_width'); }\n get name(): string { return this.getValue('name'); }\n get plotMode(): number { return this.getValue('plot_mode'); }\n get pointSize(): number { return this.scale * this.getValue('point_size'); }\n get pointStyle(): number { return this.getValue('point_style'); }\n get traceColor(): Color { return this.getValue('trace_color'); }\n get traceType(): number { return this.getValue('trace_type'); }\n get updateDelay(): number { return this.getValue('update_delay'); }\n get updateMode(): number { return this.getValue('update_mode'); }\n get visible(): boolean { return this.getValue('visible'); }\n get xAxisIndex(): number { return this.getValue('x_axis_index'); }\n get xPV(): string { return this.getValue('x_pv'); }\n get yAxisIndex(): number { return this.getValue('y_axis_index'); }\n get yPV(): string { return this.getValue('y_pv'); }\n}\n","import { Color } from '../../../Color';\nimport { Graphics, Path } from '../../../Graphics';\nimport { HitRegionSpecification } from '../../../HitRegionSpecification';\nimport { Bounds, Point } from '../../../positioning';\nimport { Command, CommandBuffer, ZoomCommand } from './CommandBuffer';\nimport { XYGraph } from './XYGraph';\n\nconst BUTTON_COLOR = new Color(236, 236, 236);\nconst SEPARATOR_COLOR = new Color(130, 130, 130);\n\nclass Button {\n\n readonly imageElement = new Image();\n readonly disabledImageElement = new Image();\n readonly loadPromise: Promise<void>;\n readonly disabledLoadPromise: Promise<void>;\n toggleButton = false;\n toolButton = false;\n pushed = false;\n disabled = false;\n region: HitRegionSpecification;\n\n constructor(\n toolbar: XYGraphToolbar,\n private imageFile: string,\n private disabledImageFile: string,\n tooltip: string,\n private action: () => void,\n ) {\n this.loadPromise = new Promise<void>((resolve, reject) => {\n this.imageElement.onload = () => resolve();\n });\n this.disabledLoadPromise = new Promise<void>((resolve, reject) => {\n this.disabledImageElement.onload = () => resolve();\n });\n this.region = {\n id: `${toolbar.xyGraph.wuid}-${imageFile}`,\n mouseDown: () => {\n if (!this.toggleButton) {\n this.pushed = true;\n toolbar.xyGraph.requestRepaint();\n }\n },\n mouseOut: () => {\n if (!this.toggleButton) {\n this.pushed = false;\n }\n toolbar.xyGraph.requestRepaint();\n },\n mouseUp: () => {\n if (!this.toggleButton) {\n this.pushed = false;\n toolbar.xyGraph.requestRepaint();\n }\n },\n click: () => {\n if (this.toggleButton) {\n this.pushed = !this.pushed;\n if (this.toolButton) {\n toolbar.toggleTool(this);\n }\n }\n this.action();\n toolbar.updateState();\n },\n tooltip: () => tooltip,\n };\n }\n\n loadImage(prefix: string) {\n this.imageElement.src = prefix + this.imageFile;\n this.disabledImageElement.src = prefix + this.disabledImageFile;\n }\n}\n\n\nexport class XYGraphToolbar {\n\n private buttons: Button[] = [];\n\n private showLegend: Button;\n private autoScale: Button;\n private rubberbandZoom: Button;\n private horizontalZoom: Button;\n private verticalZoom: Button;\n private zoomIn: Button;\n private zoomOut: Button;\n private panning: Button;\n private mouseArrow: Button;\n private undo: Button;\n private redo: Button;\n private camera: Button;\n\n private imagesLoaded = false;\n currentTool: 'rubberband-zoom'\n | 'horizontal-zoom'\n | 'vertical-zoom'\n | 'zoom-in'\n | 'zoom-out'\n | 'panning'\n | 'default' = 'default';\n private commandBuffer = new CommandBuffer();\n\n constructor(readonly xyGraph: XYGraph) {\n this.showLegend = this.createToggleButton('ShowLegend.png', 'Show Legend', () => {\n xyGraph.properties.setValue('show_legend', this.showLegend.pushed);\n });\n\n // Initial state\n this.showLegend.pushed = xyGraph.showLegend;\n\n // Note: the property may also be updated without the use of the toolbar.\n xyGraph.addPropertyListener('show_legend', newValue => {\n this.showLegend.pushed = newValue;\n })\n\n this.autoScale = this.createButton('AutoScale.png', 'AutoScale.png', 'Perform Auto Scale', () => {\n const autoScaleCommand = new ZoomCommand(xyGraph.getXAxes(), xyGraph.getYAxes());\n xyGraph.performAutoScale();\n autoScaleCommand.saveState();\n this.addCommand(autoScaleCommand);\n });\n this.rubberbandZoom = this.createToolButton('RubberbandZoom.png', 'Rubberband Zoom', () => {\n if (this.rubberbandZoom.pushed) {\n this.currentTool = 'rubberband-zoom';\n xyGraph.setCursor('crosshair');\n xyGraph.autoScaleAllowed = false;\n } else {\n this.currentTool = 'default';\n xyGraph.setCursor(undefined);\n xyGraph.autoScaleAllowed = true;\n }\n });\n this.horizontalZoom = this.createToolButton('HorizontalZoom.png', 'Horizontal Zoom', () => {\n if (this.horizontalZoom.pushed) {\n this.currentTool = 'horizontal-zoom';\n xyGraph.setCursor('col-resize');\n xyGraph.autoScaleAllowed = false;\n } else {\n this.currentTool = 'default';\n xyGraph.setCursor(undefined);\n xyGraph.autoScaleAllowed = true;\n }\n });\n this.verticalZoom = this.createToolButton('VerticalZoom.png', 'Vertical Zoom', () => {\n if (this.verticalZoom.pushed) {\n this.currentTool = 'vertical-zoom';\n xyGraph.setCursor('row-resize');\n xyGraph.autoScaleAllowed = false;\n } else {\n this.currentTool = 'default';\n xyGraph.setCursor(undefined);\n xyGraph.autoScaleAllowed = true;\n }\n });\n this.zoomIn = this.createToolButton('ZoomIn.png', 'Zoom In', () => {\n if (this.zoomIn.pushed) {\n this.currentTool = 'zoom-in';\n xyGraph.setCursor('zoom-in');\n xyGraph.autoScaleAllowed = false;\n } else {\n this.currentTool = 'default';\n xyGraph.setCursor(undefined);\n xyGraph.autoScaleAllowed = true;\n }\n });\n this.zoomOut = this.createToolButton('ZoomOut.png', 'Zoom Out', () => {\n if (this.zoomOut.pushed) {\n this.currentTool = 'zoom-out';\n xyGraph.setCursor('zoom-out');\n xyGraph.autoScaleAllowed = false;\n } else {\n this.currentTool = 'default';\n xyGraph.setCursor(undefined);\n xyGraph.autoScaleAllowed = true;\n }\n });\n this.panning = this.createToolButton('Panning.png', 'Panning', () => {\n if (this.panning.pushed) {\n this.currentTool = 'panning';\n xyGraph.setCursor('grab');\n xyGraph.autoScaleAllowed = false;\n } else {\n this.currentTool = 'default';\n xyGraph.setCursor(undefined);\n xyGraph.autoScaleAllowed = true;\n }\n });\n this.mouseArrow = this.createToolButton('MouseArrow.png', 'None', () => {\n this.currentTool = 'default';\n xyGraph.setCursor(undefined);\n xyGraph.autoScaleAllowed = true;\n });\n this.undo = this.createButton('Undo.png', 'Undo_Gray.png', 'Undo', () => {\n this.commandBuffer.undo();\n });\n this.undo.disabled = true;\n\n this.redo = this.createButton('Redo.png', 'Redo_Gray.png', 'Redo', () => {\n this.commandBuffer.redo();\n });\n this.redo.disabled = true;\n\n this.camera = this.createButton('camera.png', 'camera.png', 'Save Snapshot to PNG File', () => {\n const a = document.createElement('a');\n try {\n a.href = xyGraph.toDataURL();\n a.download = `${xyGraph.name}_export.png`;\n document.body.appendChild(a);\n a.click();\n } finally {\n document.body.removeChild(a);\n }\n });\n\n this.toggleTool(this.mouseArrow);\n\n const loadPromises = this.buttons.map(button => button.loadPromise)\n .concat(this.buttons.map(button => button.disabledLoadPromise));\n Promise.all(loadPromises).finally(() => {\n this.imagesLoaded = true;\n xyGraph.requestRepaint();\n });\n\n for (const button of this.buttons) {\n button.loadImage(xyGraph.display.imagesPrefix);\n }\n }\n\n updateState() {\n this.undo.disabled = !this.commandBuffer.canUndo();\n this.redo.disabled = !this.commandBuffer.canRedo();\n this.xyGraph.requestRepaint();\n }\n\n addCommand(command: Command) {\n this.commandBuffer.add(command);\n this.updateState();\n }\n\n toggleTool(button: Button) {\n const wasPushed = button.pushed; // Save\n for (const button of this.buttons) {\n if (button.toolButton) {\n button.pushed = false;\n }\n }\n if (wasPushed) { // Restore\n button.pushed = true;\n } else { // Default to Mouse Arrow\n this.mouseArrow.pushed = true;\n }\n this.xyGraph.requestRepaint();\n }\n\n private createToolButton(imageFile: string, tooltip: string, action: () => void) {\n const button = this.createToggleButton(imageFile, tooltip, action);\n button.toolButton = true;\n return button;\n }\n\n private createToggleButton(imageFile: string, tooltip: string, action: () => void) {\n const button = this.createButton(imageFile, imageFile, tooltip, action);\n button.toggleButton = true;\n return button;\n }\n\n private createButton(\n imageFile: string,\n disabledImageFile: string,\n tooltip: string,\n action: () => void,\n ) {\n const button = new Button(this, imageFile, disabledImageFile, tooltip, action);\n this.buttons.push(button);\n return button;\n }\n\n draw(g: Graphics, area: Bounds) {\n const { buttonSize } = this;\n const pos = { x: area.x, y: area.y };\n\n this.drawButton(g, pos.x, pos.y, this.showLegend);\n pos.x += buttonSize;\n\n this.maybeWrap(pos, area);\n this.drawButton(g, pos.x, pos.y, this.autoScale);\n pos.x += buttonSize;\n\n this.maybeWrap(pos, area, buttonSize / 2);\n this.drawSeparator(g, pos.x, pos.y);\n pos.x += buttonSize / 2;\n\n this.maybeWrap(pos, area);\n this.drawButton(g, pos.x, pos.y, this.rubberbandZoom);\n pos.x += buttonSize;\n\n this.maybeWrap(pos, area);\n this.drawButton(g, pos.x, pos.y, this.horizontalZoom);\n pos.x += buttonSize;\n\n this.maybeWrap(pos, area);\n this.drawButton(g, pos.x, pos.y, this.verticalZoom);\n pos.x += buttonSize;\n\n this.maybeWrap(pos, area);\n this.drawButton(g, pos.x, pos.y, this.zoomIn);\n pos.x += buttonSize;\n\n this.maybeWrap(pos, area);\n this.drawButton(g, pos.x, pos.y, this.zoomOut);\n pos.x += buttonSize;\n\n this.maybeWrap(pos, area);\n this.drawButton(g, pos.x, pos.y, this.panning);\n pos.x += buttonSize;\n\n this.maybeWrap(pos, area);\n this.drawButton(g, pos.x, pos.y, this.mouseArrow);\n pos.x += buttonSize;\n\n this.maybeWrap(pos, area, buttonSize / 2);\n this.drawSeparator(g, pos.x, pos.y);\n pos.x += buttonSize / 2;\n\n this.maybeWrap(pos, area);\n this.drawButton(g, pos.x, pos.y, this.undo);\n pos.x += buttonSize;\n\n this.maybeWrap(pos, area);\n this.drawButton(g, pos.x, pos.y, this.redo);\n pos.x += buttonSize;\n\n this.maybeWrap(pos, area, buttonSize / 2);\n this.drawSeparator(g, pos.x, pos.y);\n pos.x += buttonSize / 2;\n\n this.maybeWrap(pos, area);\n this.drawButton(g, pos.x, pos.y, this.camera);\n pos.x += buttonSize;\n\n return (pos.y + buttonSize) - area.y;\n }\n\n private maybeWrap(pos: Point, area: Bounds, size?: number) {\n size = size ?? this.buttonSize;\n if (pos.x + size > area.x + area.width) {\n pos.x = area.x;\n pos.y += this.buttonSize;\n }\n }\n\n private drawSeparator(g: Graphics, x: number, y: number) {\n const { buttonSize } = this;\n const lineWidth = 1 * this.scale;\n const pathX = Math.round(x + buttonSize / 4) - (lineWidth / 2);\n g.strokePath({\n path: new Path(pathX, y).lineTo(pathX, y + buttonSize),\n color: SEPARATOR_COLOR,\n lineWidth,\n });\n }\n\n private drawButton(g: Graphics, x: number, y: number, button: Button) {\n const { buttonSize, scale } = this;\n g.fillRect({ x, y, width: buttonSize, height: buttonSize, color: BUTTON_COLOR });\n\n if (this.xyGraph.enabled && !button.disabled) {\n g.addHitRegion(button.region).addRect(x, y, buttonSize, buttonSize);\n }\n\n const lineWidth = 1 * scale;\n const top = Math.round(y + (lineWidth / 2)) - 0.5;\n const left = Math.round(x + (lineWidth / 2)) - 0.5;\n const bottom = Math.round(y + buttonSize - lineWidth + (lineWidth / 2)) - 0.5;\n const right = Math.round(x + buttonSize - lineWidth + (lineWidth / 2)) - 0.5;\n g.strokePath({\n color: button.pushed ? Color.WHITE : Color.BLACK,\n path: new Path(right, bottom)\n .lineTo(right, top)\n .moveTo(right, bottom)\n .lineTo(left, bottom),\n lineWidth,\n });\n g.strokePath({\n color: button.pushed ? Color.BLACK : Color.WHITE,\n path: new Path(left, top)\n .lineTo(right - lineWidth, top)\n .moveTo(left, top)\n .lineTo(left, bottom - lineWidth),\n lineWidth,\n });\n if (this.imagesLoaded) {\n const imageEl = button.disabled ? button.disabledImageElement : button.imageElement;\n const naturalHeight = imageEl.naturalHeight * scale;\n const naturalWidth = imageEl.naturalWidth * scale;\n const imageX = Math.round(x + (buttonSize - naturalWidth) / 2);\n const imageY = Math.round(y + (buttonSize - naturalHeight) / 2);\n g.ctx.drawImage(imageEl, imageX, imageY, naturalWidth, naturalHeight);\n }\n }\n\n get scale() { return this.xyGraph.scale; }\n\n get buttonSize() { return 25 * this.scale; }\n}\n","import { Color } from '../../../Color';\nimport { Display } from '../../../Display';\nimport { Font } from '../../../Font';\nimport { Graphics, Path } from '../../../Graphics';\nimport { Bounds, crispen, intersect, Point, shrink } from '../../../positioning';\nimport { BooleanProperty, ColorProperty, FloatProperty, FontProperty, IntProperty, PVValueProperty, StringProperty } from '../../../properties';\nimport { Range } from '../../../Range';\nimport { Widget } from '../../../Widget';\nimport { AbstractContainerWidget } from '../../others/AbstractContainerWidget';\nimport { LinearScale } from '../LinearScale';\nimport { Axis } from './Axis';\nimport { PlotAreaRegion } from './PlotAreaRegion';\nimport { Trace } from './Trace';\nimport { XYGraphToolbar } from './XYGraphToolbar';\n\nconst PROP_AXIS_COUNT = 'axis_count';\nconst PROP_PLOT_AREA_BACKGROUND_COLOR = 'plot_area_background_color';\nconst PROP_SHOW_LEGEND = 'show_legend';\nconst PROP_SHOW_PLOT_AREA_BORDER = 'show_plot_area_border';\nconst PROP_SHOW_TOOLBAR = 'show_toolbar';\nconst PROP_TITLE = 'title';\nconst PROP_TITLE_FONT = 'title_font';\nconst PROP_TRACE_COUNT = 'trace_count';\nconst PROP_TRANSPARENT = 'transparent';\n\n\nexport class XYGraph extends Widget {\n\n toolbar?: XYGraphToolbar;\n private plotAreaRegion?: PlotAreaRegion;\n private axes: Axis[] = [];\n private traces: Trace[] = [];\n\n // Set to false, when the active tool changes\n // to one of the zoom types.\n autoScaleAllowed = true;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n\n this.properties.add(new IntProperty(PROP_AXIS_COUNT));\n this.properties.add(new ColorProperty(PROP_PLOT_AREA_BACKGROUND_COLOR));\n this.properties.add(new BooleanProperty(PROP_SHOW_LEGEND));\n this.properties.add(new BooleanProperty(PROP_SHOW_PLOT_AREA_BORDER));\n this.properties.add(new BooleanProperty(PROP_SHOW_TOOLBAR));\n this.properties.add(new StringProperty(PROP_TITLE));\n this.properties.add(new FontProperty(PROP_TITLE_FONT));\n this.properties.add(new IntProperty(PROP_TRACE_COUNT));\n this.properties.add(new BooleanProperty(PROP_TRANSPARENT));\n\n this.properties.addGenerator(() => {\n const moreProperties = [];\n\n this.axes = [];\n const axisCount = this.properties.getValue(PROP_AXIS_COUNT) as number;\n for (let i = 0; i < axisCount; i++) {\n this.axes.push(new Axis(this, i));\n moreProperties.push(...[\n new BooleanProperty(`axis_${i}_auto_scale`),\n new FloatProperty(`axis_${i}_auto_scale_treshold`),\n new ColorProperty(`axis_${i}_axis_color`),\n new StringProperty(`axis_${i}_axis_title`),\n new BooleanProperty(`axis_${i}_dash_grid_line`),\n new ColorProperty(`axis_${i}_grid_color`),\n new BooleanProperty(`axis_${i}_log_scale`),\n new FloatProperty(`axis_${i}_maximum`),\n new FloatProperty(`axis_${i}_minimum`),\n new FontProperty(`axis_${i}_scale_font`),\n new StringProperty(`axis_${i}_scale_format`),\n new BooleanProperty(`axis_${i}_show_grid`),\n new IntProperty(`axis_${i}_time_format`),\n new FontProperty(`axis_${i}_title_font`),\n new BooleanProperty(`axis_${i}_visible`),\n ]);\n if (i > 1) { // 0 is primary X, 1 is primary Y\n moreProperties.push(...[\n new BooleanProperty(`axis_${i}_left_bottom_side`),\n new BooleanProperty(`axis_${i}_y_axis`),\n ]);\n }\n }\n\n this.traces = [];\n const traceCount = this.properties.getValue(PROP_TRACE_COUNT) as number;\n for (let i = 0; i < traceCount; i++) {\n this.traces.push(new Trace(this, i));\n moreProperties.push(...[\n new BooleanProperty(`trace_${i}_anti_alias`),\n new IntProperty(`trace_${i}_buffer_size`),\n new BooleanProperty(`trace_${i}_concatenate_data`),\n new IntProperty(`trace_${i}_line_width`),\n new StringProperty(`trace_${i}_name`),\n new IntProperty(`trace_${i}_plot_mode`),\n new IntProperty(`trace_${i}_point_size`),\n new IntProperty(`trace_${i}_point_style`),\n new ColorProperty(`trace_${i}_trace_color`),\n new IntProperty(`trace_${i}_trace_type`),\n new IntProperty(`trace_${i}_update_delay`),\n new IntProperty(`trace_${i}_update_mode`),\n new BooleanProperty(`trace_${i}_visible`),\n new IntProperty(`trace_${i}_x_axis_index`),\n new StringProperty(`trace_${i}_x_pv`),\n new PVValueProperty(`trace_${i}_x_pv_value`, `trace_${i}_x_pv`),\n new IntProperty(`trace_${i}_y_axis_index`),\n new StringProperty(`trace_${i}_y_pv`),\n new PVValueProperty(`trace_${i}_y_pv_value`, `trace_${i}_y_pv`),\n ]);\n }\n\n return moreProperties;\n });\n }\n\n init() {\n this.plotAreaRegion = new PlotAreaRegion(`${this.wuid}-plotarea`, this);\n this.traces.forEach(trace => trace.init());\n }\n\n draw(g: Graphics) {\n const { scale } = this;\n let area = this.area;\n if (this.borderAlarmSensitive) {\n area = shrink(this.area, 2 * scale);\n }\n\n if (!this.transparent) {\n const backgroundColor = this.alarmSensitiveBackgroundColor;\n g.fillRect({ ...area, color: backgroundColor });\n }\n\n if (this.showToolbar) {\n this.drawToolbar(g, area);\n }\n\n if (this.title) {\n this.drawTitle(g, area);\n }\n\n // Initialize rulers\n for (const axis of this.axes) {\n if (axis.autoScale && this.autoScaleAllowed) {\n const range = this.calculateAutoscaledRange(axis);\n if (range) {\n axis.effectiveMinimum = range.start;\n axis.effectiveMaximum = range.stop;\n }\n }\n const min = axis.effectiveMinimum;\n const max = axis.effectiveMaximum;\n axis.linearScale = new LinearScale(scale, axis.scaleFont, min,\n max, axis.logScale, 50 * scale, axis.axisColor, true, axis.visible);\n axis.linearScale.scaleFormat = axis.scaleFormat;\n axis.linearScale.timeFormat = axis.timeFormat;\n }\n\n if (this.showLegend) {\n this.drawLegend(g, area);\n }\n\n g.addHitRegion(this.plotAreaRegion!).addRect(area.x, area.y, area.width, area.height);\n\n const plotArea = this.drawAxes(g, area);\n this.drawPlotArea(g, plotArea);\n\n const selection = this.plotAreaRegion?.selection;\n if (selection) {\n this.drawZoomSelection(g, plotArea, intersect(plotArea, selection));\n }\n }\n\n private drawToolbar(g: Graphics, area: Bounds) {\n if (!this.toolbar) {\n this.toolbar = new XYGraphToolbar(this);\n }\n const toolbarMargin = 3 * this.scale;\n const toolbarArea = shrink(area, toolbarMargin);\n const toolbarHeight = this.toolbar.draw(g, toolbarArea);\n area.y += toolbarMargin + toolbarHeight + toolbarMargin;\n area.height -= toolbarMargin + toolbarHeight + toolbarMargin;\n }\n\n private drawTitle(g: Graphics, area: Bounds) {\n const titleHeight = g.measureText(this.title, this.titleFont).height;\n g.fillText({\n x: area.x + area.width / 2,\n y: area.y + titleHeight / 2,\n align: 'center',\n baseline: 'middle',\n color: this.alarmSensitiveForegroundColor,\n font: this.titleFont,\n text: this.title,\n });\n const gap = 2 * this.scale;\n area.y += titleHeight + gap;\n area.height -= titleHeight + gap;\n }\n\n private drawAxes(g: Graphics, area: Bounds) {\n const { scale } = this;\n const gap = 5 * scale;\n const plotArea = { ...area };\n\n // Measure (don't draw) space required for X axes.\n let combinedXTitleHeight = 0;\n let combinedXScaleHeight = 0;\n for (const axis of this.getXAxes()) {\n if (axis.visible) {\n let titleHeight = 0;\n if (axis.axisTitle) {\n titleHeight = gap + g.measureText(axis.axisTitle, axis.titleFont).height;\n }\n combinedXTitleHeight += titleHeight;\n combinedXScaleHeight += titleHeight + axis.linearScale!.measureHorizontalHeight(g);\n }\n }\n\n let combinedYScaleWidth = 0;\n let topMargin = 0;\n // Iterate Y axis in reverse order (drawn left to right)\n for (const axis of this.getYAxes().reverse()) {\n const linearScale = axis.linearScale!;\n if (axis.visible) {\n const yScaleMargin = linearScale.calculateMargin(g, false);\n const height = plotArea.height\n - combinedXScaleHeight\n + (combinedXScaleHeight > 0 ? yScaleMargin : 0);\n\n\n let titleHeight = 0;\n if (axis.axisTitle) {\n titleHeight = g.measureText(axis.axisTitle, axis.titleFont).height;\n g.ctx.save();\n g.ctx.translate(plotArea.x + gap + (titleHeight / 2), area.y + (height / 2));\n g.ctx.rotate(-Math.PI / 2);\n g.fillText({\n x: 0,\n y: 0,\n align: 'center',\n baseline: 'middle',\n font: axis.titleFont,\n color: axis.axisColor,\n text: axis.axisTitle,\n });\n g.ctx.restore();\n titleHeight += gap;\n }\n\n const scaleWidth = titleHeight + linearScale.drawVertical(\n g, plotArea.x + titleHeight, area.y, height, true, false);\n plotArea.x += scaleWidth;\n plotArea.width -= scaleWidth;\n combinedYScaleWidth += scaleWidth;\n\n const axisMargin = linearScale.margin;\n topMargin = (topMargin === 0) ? axisMargin : Math.min(topMargin, axisMargin);\n\n const lineWidth = scale * 1;\n const verticalLineX = Math.round(plotArea.x) - (lineWidth / 2);\n const verticalLineY = Math.round(area.y + yScaleMargin) - (lineWidth / 2);\n g.strokePath({\n path: new Path(verticalLineX, verticalLineY)\n .lineTo(verticalLineX, verticalLineY + height - (2 * yScaleMargin)),\n color: axis.axisColor,\n opacity: 100 / 255,\n lineWidth,\n });\n } else {\n const length = plotArea.height - combinedXScaleHeight;\n linearScale.setDimensions(0, area.y, length, false);\n }\n }\n\n // X Axis (drawn bottom-up)\n let leftMargin = 0;\n for (const axis of this.getXAxes().reverse()) {\n const linearScale = axis.linearScale!;\n if (axis.visible) {\n const xScaleMargin = linearScale.calculateMargin(g, true);\n const xOffset = combinedYScaleWidth - xScaleMargin;\n\n let titleHeight = 0;\n if (axis.axisTitle) {\n titleHeight = g.measureText(axis.axisTitle, axis.titleFont).height;\n const textX = area.x + combinedYScaleWidth + (area.width - combinedYScaleWidth) / 2;\n g.fillText({\n x: textX,\n y: plotArea.y + plotArea.height - (titleHeight / 2),\n align: 'center',\n baseline: 'middle',\n font: axis.titleFont,\n color: axis.axisColor,\n text: axis.axisTitle,\n });\n titleHeight += gap;\n }\n\n const scaleHeight = titleHeight + linearScale.drawHorizontal(\n g, area.x + xOffset, plotArea.y + plotArea.height - titleHeight, area.width - xOffset);\n plotArea.height -= scaleHeight;\n\n const axisMargin = linearScale.margin;\n leftMargin = (leftMargin === 0) ? axisMargin : Math.min(leftMargin, axisMargin);\n\n const lineWidth = scale * 1;\n const horizontalLineX = Math.round(\n area.x + xOffset + xScaleMargin) - (lineWidth / 2);\n const horizontalLineY = Math.round(\n plotArea.y + plotArea.height) - (lineWidth / 2);\n g.strokePath({\n path: new Path(horizontalLineX, horizontalLineY)\n .lineTo(horizontalLineX + plotArea.width - xScaleMargin, horizontalLineY),\n color: axis.axisColor,\n opacity: 100 / 255,\n lineWidth,\n });\n } else {\n const x = area.x + combinedYScaleWidth;\n const width = area.width - combinedYScaleWidth;\n linearScale.setDimensions(x, 0, width, true);\n }\n }\n\n plotArea.y += topMargin;\n plotArea.width -= leftMargin;\n if (combinedXScaleHeight > 0) {\n plotArea.height -= topMargin; // Only once: margins shared between y and x are collapsed\n } else {\n plotArea.height -= (2 * topMargin);\n }\n return plotArea;\n }\n\n private drawPlotArea(g: Graphics, area: Bounds) {\n const { scale } = this;\n const lineWidth = 1 * scale;\n\n g.fillRect({ ...area, color: this.plotAreaBackgroundColor });\n if (this.showPlotAreaBorder) {\n const { x, y, width, height } = shrink(area, lineWidth / 2);\n g.strokePath({\n path: new Path(x, y).lineTo(x + width, y).lineTo(x + width, y + height),\n color: Color.BLACK,\n lineWidth,\n });\n }\n\n for (const axis of this.axes.filter(a => a.visible && a.showGrid)) {\n const linearScale = axis.linearScale!;\n if (axis.isHorizontal()) { // X Axis\n for (const x of linearScale.getGridPositions()) {\n const pathX = Math.round(linearScale.getX() + x) - (lineWidth / 2);\n g.strokePath({\n path: new Path(pathX, area.y).lineTo(pathX, area.y + area.height),\n color: axis.gridColor,\n lineWidth,\n dash: axis.dashGridLine ? [6 * scale, 2 * scale] : undefined,\n });\n }\n } else { // Y Axis\n for (const y of linearScale.getGridPositions()) {\n const pathY = Math.round(linearScale.getY() + y) - (lineWidth / 2);\n g.strokePath({\n path: new Path(area.x, pathY).lineTo(area.x + area.width, pathY),\n color: axis.gridColor,\n lineWidth,\n dash: axis.dashGridLine ? [6 * scale, 2 * scale] : undefined,\n });\n }\n }\n }\n\n // Create a clip\n g.ctx.save();\n g.ctx.beginPath();\n g.ctx.rect(area.x, area.y, area.width, area.height);\n g.ctx.clip();\n for (const trace of this.traces.filter(t => t.visible)) {\n const xAxis = this.getAxis(trace.xAxisIndex).linearScale!;\n const yAxis = this.getAxis(trace.yAxisIndex).linearScale!;\n const points: Point[] = [];\n for (const sample of trace.snapshot()) {\n const x = xAxis.getValuePosition(sample.x);\n const y = yAxis.getValuePosition(sample.y);\n points.push({ x, y });\n }\n if (points.length) {\n trace.drawTrace(g, points);\n for (const point of points) {\n trace.drawPoint(g, point);\n }\n }\n }\n g.ctx.restore(); // Reset clip\n }\n\n private drawZoomSelection(g: Graphics, plotArea: Bounds, selection: Bounds) {\n const { scale } = this;\n switch (this.toolbar?.currentTool) {\n case 'rubberband-zoom':\n g.strokeRect({\n ...selection,\n color: Color.BLACK,\n lineWidth: 1 * scale,\n });\n break;\n case 'horizontal-zoom':\n const hZoom = selection;\n hZoom.y = plotArea.y;\n hZoom.height = plotArea.height;\n g.strokeRect({\n ...crispen(hZoom),\n color: Color.BLACK,\n lineWidth: 1 * scale,\n });\n break;\n case 'vertical-zoom':\n const vZoom = selection;\n vZoom.x = plotArea.x;\n vZoom.width = plotArea.width;\n g.strokeRect({\n ...crispen(vZoom),\n color: Color.BLACK,\n lineWidth: 1 * scale,\n });\n break;\n }\n }\n\n private drawLegend(g: Graphics, area: Bounds) {\n const { scale } = this;\n const iconSize = 25 * scale;\n const innerGap = 2 * scale;\n const outGap = 5 * scale;\n const font = Font.ARIAL_10.scale(scale);\n for (const axis of this.getYAxes()) {\n const traces = this.traces.filter(t => t.visible && t.yAxisIndex === axis.index);\n const lines: Trace[][] = [];\n\n // Wrap legend symbols over the available area\n let currentLine: Trace[] = [];\n let lineWidth = 0;\n let legendWidth = 0;\n for (const trace of traces) {\n let legendWidth = iconSize + innerGap + outGap;\n if (trace.name) {\n legendWidth += g.measureText(trace.name, font).width;\n }\n if (lineWidth + legendWidth < area.width) {\n currentLine.push(trace);\n lineWidth += legendWidth;\n } else {\n lines.push(currentLine);\n legendWidth = Math.max(legendWidth, lineWidth);\n currentLine = [trace];\n lineWidth = legendWidth;\n }\n }\n if (currentLine.length) {\n lines.push(currentLine);\n legendWidth = Math.max(legendWidth, lineWidth);\n }\n if (!lines.length) {\n continue;\n }\n\n const legendHeight = iconSize * lines.length;\n const legendArea: Bounds = {\n x: Math.round(area.x + (area.width - legendWidth) / 2),\n y: Math.round(area.y + area.height - legendHeight),\n width: legendWidth,\n height: legendHeight,\n };\n area.height -= legendArea.height;\n g.fillRect({\n ...legendArea,\n color: this.plotAreaBackgroundColor,\n });\n g.strokeRect({\n ...shrink(legendArea, 1 * scale / 2),\n color: axis.axisColor,\n });\n\n let x = legendArea.x;\n let y = legendArea.y;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const topY = y + (i * iconSize);\n const midY = topY + iconSize / 2;\n for (const trace of line) {\n const maxSize = (trace.pointSize > Math.floor((iconSize - outGap) / 2))\n ? Math.floor(iconSize - outGap) : trace.pointSize;\n switch (trace.traceType) {\n case 3: // Bar\n const barX = x + iconSize / 2;\n g.strokePath({\n path: new Path(barX, topY + maxSize).lineTo(barX, topY + iconSize),\n lineWidth: trace.lineWidth,\n color: trace.traceColor,\n opacity: 100 / 255,\n });\n trace.drawPoint(g, { x: barX, y: topY + maxSize });\n break;\n case 4: // Area\n case 5: // Line Area\n const points = [\n { x, y: topY + iconSize / 2 },\n { x: x + iconSize / 2, y: topY + maxSize },\n { x: x + iconSize, y: topY + iconSize / 2 },\n { x: x + iconSize, y: topY + iconSize },\n { x, y: topY + iconSize },\n ];\n g.fillPath({\n path: Path.fromPoints(points),\n color: trace.traceColor,\n opacity: 100 / 255,\n });\n if (trace.traceType === 5) {\n g.strokePath({\n path: Path.fromPoints(points.slice(0, 3)),\n color: trace.traceColor,\n lineWidth: 1 * scale,\n });\n }\n trace.drawPoint(g, { x: x + iconSize / 2, y: topY + maxSize });\n break;\n default:\n trace.drawTrace(g, [{ x, y: midY, }, { x: x + iconSize, y: midY }])\n trace.drawPoint(g, { x: x + iconSize / 2, y: midY });\n }\n x += iconSize + innerGap;\n if (trace.name) {\n g.fillText({\n x,\n y: midY,\n align: 'left',\n baseline: 'middle',\n color: trace.traceColor,\n font,\n text: trace.name,\n });\n x += g.measureText(trace.name, font).width;\n }\n x += outGap;\n }\n }\n }\n }\n\n public setCursor(cursor: string | undefined) {\n this.plotAreaRegion!.cursor = cursor;\n }\n\n calculateAutoscaledRange(axis: Axis): Range | undefined {\n let start: number | undefined;\n let stop: number | undefined;\n const logScale = axis.logScale;\n for (const trace of this.traces) {\n if (!trace.visible) {\n continue;\n }\n if (this.axes[trace.xAxisIndex] !== axis && this.axes[trace.yAxisIndex] !== axis) {\n continue;\n }\n\n for (const sample of trace.snapshot()) {\n const value = axis.isHorizontal() ? sample.x : sample.y;\n if (start === undefined || start > value) {\n if (!logScale || value > 0) {\n start = value;\n }\n }\n if (stop === undefined || stop < value) {\n if (!logScale || value > 0) {\n stop = value;\n }\n }\n }\n }\n if (start !== undefined && stop !== undefined) {\n return { start, stop };\n }\n }\n\n performAutoScale() {\n for (const axis of this.axes) {\n if (axis.visible) {\n axis.performAutoScale();\n }\n }\n }\n\n clearGraph() {\n for (const trace of this.traces) {\n trace.clearData();\n }\n this.requestRepaint();\n }\n\n getAxes() {\n return [...this.axes];\n }\n\n getXAxes() {\n return this.axes.filter(axis => axis.isHorizontal());\n }\n\n getYAxes() {\n return this.axes.filter(axis => axis.isVertical());\n }\n\n getAxis(index: number) {\n return this.axes[index];\n }\n\n getTrace(index: number) {\n return this.traces[index];\n }\n\n get axisCount(): number { return this.properties.getValue(PROP_AXIS_COUNT); }\n get plotAreaBackgroundColor(): Color { return this.properties.getValue(PROP_PLOT_AREA_BACKGROUND_COLOR); }\n get showLegend(): boolean { return this.properties.getValue(PROP_SHOW_LEGEND); }\n get showPlotAreaBorder(): boolean { return this.properties.getValue(PROP_SHOW_PLOT_AREA_BORDER); }\n get showToolbar(): boolean { return this.properties.getValue(PROP_SHOW_TOOLBAR); }\n get title(): string { return this.properties.getValue(PROP_TITLE); }\n get titleFont(): Font { return this.properties.getValue(PROP_TITLE_FONT).scale(this.scale); }\n get traceCount(): number { return this.properties.getValue(PROP_TRACE_COUNT); }\n get transparent(): boolean { return this.properties.getValue(PROP_TRANSPARENT); }\n}\n","import { Graphics } from '../../Graphics';\nimport { XMLNode } from '../../XMLNode';\nimport { AbstractContainerWidget } from './AbstractContainerWidget';\n\nexport class GroupingContainer extends AbstractContainerWidget {\n\n parseNode(node: XMLNode) {\n super.parseNode(node);\n\n for (const widgetNode of node.getNodes('widget')) {\n const kind = widgetNode.getString('widget_type');\n const widget = this.display.createWidget(kind, this);\n if (widget) {\n widget.parseNode(widgetNode);\n this.widgets.push(widget);\n }\n }\n }\n\n // This widget covers the entire area with the background color regardless\n // of the border style. Unlike for example a Rectangle.\n // (difference easy to see with a Group Box border style).\n beforeDrawBorder(g: Graphics) {\n if (!this.transparent) {\n g.fillRect({\n x: this.holderX,\n y: this.holderY,\n width: this.holderWidth,\n height: this.holderHeight,\n color: this.backgroundColor,\n });\n }\n }\n\n draw(g: Graphics) {\n const offscreen = g.createChild(this.width, this.height);\n for (const widget of this.widgets.filter(w => w.visible)) {\n widget.drawHolder(offscreen);\n widget.draw(offscreen);\n widget.drawDecoration(offscreen);\n }\n for (const widget of this.widgets.filter(w => w.visible)) {\n widget.drawOverlay(offscreen);\n }\n\n g.copy(offscreen, this.x, this.y);\n }\n}\n","import { Color } from '../../Color';\nimport { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics } from '../../Graphics';\nimport { HitRegionSpecification } from '../../HitRegionSpecification';\nimport { Point } from '../../positioning';\nimport { BooleanProperty, ColorProperty, FontProperty, IntProperty, StringProperty } from '../../properties';\nimport { XMLNode } from '../../XMLNode';\nimport { AbstractContainerWidget } from './AbstractContainerWidget';\n\nconst PROP_MINIMUM_TAB_HEIGHT = 'minimum_tab_height';\nconst PROP_ACTIVE_TAB = 'active_tab';\nconst PROP_HORIZONTAL_TABS = 'horizontal_tabs';\nconst PROP_TAB_COUNT = 'tab_count';\n\nclass Tab {\n headerRegion: HitRegionSpecification;\n\n constructor(private widget: TabbedContainer, private i: number) {\n this.headerRegion = {\n id: `${widget.wuid}-header-${i}`,\n click: () => {\n if (widget.activeTab !== i) {\n widget.properties.setValue(PROP_ACTIVE_TAB, i);\n widget.requestRepaint();\n }\n },\n cursor: 'pointer'\n };\n }\n\n get scale() { return this.widget.scale; }\n private getValue(propertySufix: string) {\n return this.widget.properties.getValue(`tab_${this.i}_${propertySufix}`);\n }\n\n get title(): string { return this.getValue('title'); }\n get backgroundColor(): Color { return this.getValue('background_color'); }\n get foregroundColor(): Color { return this.getValue('foreground_color'); }\n get enabled(): boolean { return this.getValue('enabled'); }\n get font(): Font { return this.getValue('font').scale(this.scale); }\n}\n\nexport class TabbedContainer extends AbstractContainerWidget {\n\n private tabs: Tab[] = [];\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new IntProperty(PROP_MINIMUM_TAB_HEIGHT));\n this.properties.add(new IntProperty(PROP_ACTIVE_TAB));\n this.properties.add(new BooleanProperty(PROP_HORIZONTAL_TABS));\n this.properties.add(new IntProperty(PROP_TAB_COUNT));\n\n this.properties.addGenerator(() => {\n this.tabs = [];\n const tabCount = this.properties.getValue(PROP_TAB_COUNT) as number;\n const moreProperties = [];\n for (let i = 0; i < tabCount; i++) {\n this.tabs.push(new Tab(this, i));\n moreProperties.push(...[\n new StringProperty(`tab_${i}_title`),\n new ColorProperty(`tab_${i}_background_color`),\n new ColorProperty(`tab_${i}_foreground_color`),\n new BooleanProperty(`tab_${i}_enabled`),\n new FontProperty(`tab_${i}_font`),\n ]);\n }\n return moreProperties;\n });\n }\n\n parseNode(node: XMLNode) {\n super.parseNode(node);\n\n for (const widgetNode of node.getNodes('widget')) {\n const kind = widgetNode.getString('widget_type');\n const widget = this.display.createWidget(kind, this);\n if (widget) {\n widget.parseNode(widgetNode);\n this.widgets.push(widget);\n }\n }\n }\n\n draw(g: Graphics) {\n if (this.horizontalTabs) {\n this.drawHorizontalTabs(g);\n } else {\n this.drawVerticalTabs(g);\n }\n }\n\n measureTabOffset(g: Graphics): Point {\n if (this.horizontalTabs) {\n return { x: 0, y: this.measureLabelHeight(g) };\n } else {\n return { x: this.measureLabelWidth(g), y: 0 };\n }\n }\n\n private measureLabelHeight(g: Graphics) {\n const { scale } = this;\n const lineWidth = 1 * scale;\n let h = this.minimumTabHeight;\n for (let i = 0; i < this.tabs.length; i++) {\n const tab = this.tabs[i];\n const fm = g.measureText(tab.title, tab.font);\n const labelHeight = fm.height + lineWidth;\n if (labelHeight > h) {\n h = labelHeight;\n }\n }\n return h + this.margin;\n }\n\n private measureLabelWidth(g: Graphics) {\n const { scale } = this;\n const lineWidth = 1 * scale;\n let w = this.minimumTabWidth;\n for (let i = 0; i < this.tabs.length; i++) {\n const tab = this.tabs[i];\n const fm = g.measureText(tab.title, tab.font);\n const labelWidth = fm.width + lineWidth;\n if (labelWidth > w) {\n w = labelWidth;\n }\n }\n return w + this.margin;\n }\n\n private drawHorizontalTabs(g: Graphics) {\n const { margin, gap, scale } = this;\n const labelHeight = this.measureLabelHeight(g);\n const lineWidth = 1 * scale;\n let x = this.x;\n for (let i = 0; i < this.tabs.length; i++) {\n const tab = this.tabs[i];\n const fm = g.measureText(tab.title, tab.font);\n let rectX;\n let rectY;\n let rectWidth;\n let rectHeight;\n let rectFill;\n if (this.activeTab === i) {\n rectX = x;\n rectY = this.y;\n rectWidth = (fm.width + lineWidth) + margin + gap;\n rectHeight = labelHeight;\n rectFill = tab.backgroundColor;\n } else {\n rectX = x + gap;\n rectY = this.y + (2 * scale);\n rectWidth = (fm.width + lineWidth) + margin - gap;\n rectHeight = labelHeight - (2 * scale);\n rectFill = this.darken(tab.backgroundColor);\n }\n g.fillRect({\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n color: rectFill,\n });\n\n const hitRegion = g.addHitRegion(tab.headerRegion);\n hitRegion.addRect(rectX, rectY, rectWidth, rectHeight);\n\n const gradient = g.createLinearGradient(rectX, rectY, rectX, rectY + rectHeight);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, Color.WHITE.withAlpha(0).toString());\n g.fillRect({\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n gradient,\n });\n\n g.fillText({\n x: rectX + (rectWidth / 2),\n y: rectY + (rectHeight / 2),\n baseline: 'middle',\n align: 'center',\n font: tab.font,\n color: tab.foregroundColor,\n text: tab.title,\n });\n\n x += fm.width + lineWidth + margin - (1 * scale);\n\n if (this.activeTab === i) {\n const contentX = this.x;\n const contentY = this.y + labelHeight;\n const contentWidth = this.width;\n const contentHeight = this.height - labelHeight;\n g.fillRect({\n x: contentX,\n y: contentY,\n width: contentWidth,\n height: contentHeight,\n color: tab.backgroundColor,\n });\n\n const activeWidget = this.widgets[i];\n\n const offscreen = g.createChild(contentWidth, contentHeight);\n activeWidget.drawHolder(offscreen);\n activeWidget.draw(offscreen);\n activeWidget.drawDecoration(offscreen);\n activeWidget.drawOverlay(offscreen);\n g.copy(offscreen, contentX, contentY);\n } else {\n const inactiveWidget = this.widgets[i];\n inactiveWidget.hide();\n }\n }\n }\n\n private drawVerticalTabs(g: Graphics) {\n const { margin, gap, scale } = this;\n const tabWidth = this.measureLabelWidth(g);\n const lineWidth = 1 * scale;\n let y = this.y;\n for (let i = 0; i < this.tabs.length; i++) {\n const tab = this.tabs[i];\n const fm = g.measureText(tab.title, tab.font);\n const labelHeight = Math.max(fm.height + lineWidth + lineWidth, this.minimumTabHeight);\n let rectX;\n let rectY;\n let rectWidth;\n let rectHeight;\n let rectFill;\n if (this.activeTab === i) {\n rectX = this.x;\n rectY = y;\n rectWidth = tabWidth;\n rectHeight = labelHeight + margin + gap;\n rectFill = tab.backgroundColor;\n } else {\n rectX = this.x + (2 * scale);\n rectY = y + gap;\n rectWidth = tabWidth - (2 * scale);\n rectHeight = labelHeight + margin - gap;\n rectFill = this.darken(tab.backgroundColor);\n }\n g.fillRect({\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n color: rectFill,\n });\n\n const hitRegion = g.addHitRegion(tab.headerRegion);\n hitRegion.addRect(rectX, rectY, rectWidth, rectHeight);\n\n const gradient = g.createLinearGradient(rectX, rectY, rectX + rectWidth, rectY);\n gradient.addColorStop(0, Color.WHITE.toString());\n gradient.addColorStop(1, Color.WHITE.withAlpha(0).toString());\n g.fillRect({\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n gradient,\n });\n\n g.fillText({\n x: rectX + (rectWidth / 2),\n y: rectY + (rectHeight / 2),\n baseline: 'middle',\n align: 'center',\n font: tab.font,\n color: tab.foregroundColor,\n text: tab.title,\n });\n\n y += labelHeight + margin - (1 * scale);\n\n if (this.activeTab === i) {\n const contentX = this.x + tabWidth - (1 * scale);\n const contentY = this.y;\n const contentWidth = this.width - tabWidth;\n const contentHeight = this.height - (1 * scale);\n g.fillRect({\n x: contentX,\n y: contentY,\n width: contentWidth,\n height: contentHeight,\n color: tab.backgroundColor,\n });\n\n const activeWidget = this.widgets[i];\n\n const offscreen = g.createChild(contentWidth, contentHeight);\n activeWidget.drawHolder(offscreen);\n activeWidget.draw(offscreen);\n activeWidget.drawDecoration(offscreen);\n activeWidget.drawOverlay(offscreen);\n g.copy(offscreen, contentX, contentY);\n } else {\n const inactiveWidget = this.widgets[i];\n inactiveWidget.destroy();\n }\n }\n }\n\n private darken(color: Color) {\n const r = Math.max(0, color.red - 30);\n const g = Math.max(0, color.green - 30);\n const b = Math.max(0, color.blue - 30);\n return new Color(r, g, b);\n }\n\n get margin() { return this.scale * 10; }\n get gap() { return this.scale * 2; }\n get minimumTabWidth() { return this.scale * 20; }\n\n get minimumTabHeight(): number {\n return this.scale * this.properties.getValue(PROP_MINIMUM_TAB_HEIGHT);\n }\n get activeTab(): number { return this.properties.getValue(PROP_ACTIVE_TAB); }\n get tabCount(): number { return this.properties.getValue(PROP_TAB_COUNT); }\n get horizontalTabs(): boolean { return this.properties.getValue(PROP_HORIZONTAL_TABS); }\n}\n","import { Display } from '../../Display';\nimport { Font } from '../../Font';\nimport { Graphics } from '../../Graphics';\nimport { BooleanProperty, FontProperty, IntProperty, StringTableProperty } from '../../properties';\nimport { SpreadSheetTable } from '../../scripting/SpreadSheetTable';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from './AbstractContainerWidget';\n\nconst PROP_COLUMNS_COUNT = 'columns_count';\nconst PROP_COLUMN_HEADERS = 'column_headers';\nconst PROP_COLUMN_HEADER_VISIBLE = 'column_header_visible';\nconst PROP_DEFAULT_CONTENT = 'default_content';\nconst PROP_FONT = 'font';\n\nexport class Table extends Widget {\n\n private tableWrapper?: HTMLDivElement;\n private table?: HTMLTableElement;\n spreadsheet: SpreadSheetTable;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new IntProperty(PROP_COLUMNS_COUNT));\n this.properties.add(new StringTableProperty(PROP_COLUMN_HEADERS));\n this.properties.add(new BooleanProperty(PROP_COLUMN_HEADER_VISIBLE));\n this.properties.add(new StringTableProperty(PROP_DEFAULT_CONTENT));\n this.properties.add(new FontProperty(PROP_FONT));\n this.spreadsheet = new SpreadSheetTable(this);\n }\n\n init() {\n this.tableWrapper = document.createElement('div');\n this.tableWrapper.style.display = 'none';\n this.table = document.createElement('table');\n this.table.style.tableLayout = 'fixed';\n this.table.style.borderSpacing = '0';\n this.table.style.borderCollapse = 'collapse';\n this.tableWrapper.appendChild(this.table);\n this.display.rootPanel.appendChild(this.tableWrapper);\n\n this.spreadsheet.setContent(this.defaultContent);\n }\n\n draw(g: Graphics) {\n if (this.tableWrapper) {\n const { x, y, width, height } = this.display.measureAbsoluteArea(this);\n this.tableWrapper.style.backgroundColor = 'white';\n this.tableWrapper.style.position = 'absolute';\n this.tableWrapper.style.display = 'block';\n this.tableWrapper.style.left = `${x}px`;\n this.tableWrapper.style.top = `${y}px`;\n this.tableWrapper.style.width = `${width}px`;\n this.tableWrapper.style.height = `${height}px`;\n this.tableWrapper.style.border = '1px solid rgba(0, 0, 0, 0.1)';\n this.table!.style.font = this.font.getFontString();\n if (this.spreadsheet.dirty) {\n this.generateTableContent();\n this.spreadsheet.dirty = false;\n }\n }\n }\n\n private generateTableContent() {\n const rowCount = this.table!.rows.length;\n for (let i = rowCount - 1; i >= 0; i--) {\n this.table!.deleteRow(i);\n }\n\n if (this.columnHeaderVisible) {\n const rowEl = this.table!.insertRow();\n for (let i = 0; i < this.columnsCount; i++) {\n const header = this.columnHeaders[i];\n const cell = rowEl.insertCell();\n cell.style.color = '#aaa';\n cell.style.textAlign = 'left';\n cell.style.width = (Number(header[1]) * this.scale) + 'px';\n cell.style.overflow = 'hidden';\n cell.style.padding = `${4 * this.scale}px`;\n cell.style.borderBottom = '1px solid rgba(0, 0, 0, 0.1)';\n if (i !== 0) {\n cell.style.borderLeft = '1px solid rgba(0, 0, 0, 0.1)';\n }\n const newText = document.createTextNode(header[0]);\n cell.appendChild(newText);\n }\n\n // Filler\n rowEl.insertCell();\n }\n for (const row of this.spreadsheet.getCells()) {\n const rowEl = this.table!.insertRow();\n for (let i = 0; i < this.columnsCount; i++) {\n const cell = rowEl.insertCell();\n cell.style.textAlign = 'left';\n cell.style.overflow = 'hidden';\n cell.style.wordWrap = 'break-word';\n cell.style.textOverflow = 'ellipsis';\n cell.style.padding = `${4 * this.scale}px`;\n if (i !== 0) {\n cell.style.borderLeft = '1px solid rgba(0, 0, 0, 0.1)';\n }\n if (row[i] !== undefined) {\n const backgroundColor = row[i].backgroundColor;\n if (backgroundColor) {\n cell.style.backgroundColor = backgroundColor.toString();\n }\n const foregroundColor = row[i].foregroundColor;\n if (foregroundColor) {\n cell.style.color = foregroundColor.toString();\n }\n const newText = document.createTextNode(row[i].text || '');\n cell.appendChild(newText);\n }\n }\n\n // Filler\n rowEl.insertCell();\n }\n }\n\n hide() {\n if (this.tableWrapper) {\n this.tableWrapper.style.display = 'none';\n }\n }\n\n destroy() {\n if (this.tableWrapper) {\n this.display.rootPanel.removeChild(this.tableWrapper);\n this.tableWrapper = undefined;\n this.table = undefined;\n }\n }\n\n get columnsCount(): number { return this.properties.getValue(PROP_COLUMNS_COUNT); }\n get columnHeaders(): string[][] { return this.properties.getValue(PROP_COLUMN_HEADERS); }\n get columnHeaderVisible(): boolean {\n return this.properties.getValue(PROP_COLUMN_HEADER_VISIBLE);\n }\n get defaultContent(): string[][] { return this.properties.getValue(PROP_DEFAULT_CONTENT); }\n get font(): Font { return this.properties.getValue(PROP_FONT).scale(this.scale); }\n}\n","import { Display } from '../../Display';\nimport { Graphics } from '../../Graphics';\nimport { StringProperty } from '../../properties';\nimport { Widget } from '../../Widget';\nimport { AbstractContainerWidget } from './AbstractContainerWidget';\n\nconst PROP_URL = 'url';\n\nexport class WebBrowser extends Widget {\n\n private iframe?: HTMLIFrameElement;\n private prevUrl?: string;\n\n constructor(display: Display, parent: AbstractContainerWidget) {\n super(display, parent);\n this.properties.add(new StringProperty(PROP_URL));\n }\n\n init() {\n this.iframe = document.createElement('iframe');\n this.iframe.src = '';\n this.iframe.style.display = 'none';\n this.iframe.style.border = '0';\n this.display.rootPanel.appendChild(this.iframe);\n }\n\n draw(g: Graphics) {\n if (this.iframe) {\n const { x, y, width, height } = this.display.measureAbsoluteArea(this);\n this.iframe.style.position = 'absolute';\n this.iframe.style.display = 'block';\n this.iframe.style.left = `${x}px`;\n this.iframe.style.top = `${y}px`;\n this.iframe.style.width = `${width}px`;\n this.iframe.style.height = `${height}px`;\n if (this.url && this.prevUrl !== this.url) {\n this.iframe.src = this.url;\n this.prevUrl = this.url;\n }\n }\n }\n\n hide() {\n if (this.iframe) {\n this.iframe.style.display = 'none';\n }\n }\n\n destroy() {\n if (this.iframe) {\n this.display.rootPanel.removeChild(this.iframe);\n this.iframe = undefined;\n }\n }\n\n get url(): string { return this.properties.getValue(PROP_URL); }\n}\n","import { Color } from './Color';\nimport { ConsoleHandler, DefaultConsoleHandler } from './ConsoleHandler';\nimport { EventHandler } from './EventHandler';\nimport { OPIEvent, OPIEventHandlers, OPIEventMap, ScaleEvent, SelectionEvent } from './events';\nimport { Graphics } from './Graphics';\nimport { HitRegionSpecification } from './HitRegionSpecification';\nimport { DefaultPathResolver, PathResolver } from './PathResolver';\nimport { Bounds } from './positioning';\nimport { FormulaPVProvider } from './pv/FormulaPVProvider';\nimport { PVEngine } from './pv/PVEngine';\nimport { PVProvider } from './pv/PVProvider';\nimport { Sample } from './pv/Sample';\nimport { SimulatedPVProvider } from './pv/SimulatedPVProvider';\nimport { Widget } from './Widget';\nimport { ActionButton } from './widgets/controls/ActionButton';\nimport { BooleanButton } from './widgets/controls/BooleanButton';\nimport { BooleanSwitch } from './widgets/controls/BooleanSwitch';\nimport { CheckBox } from './widgets/controls/CheckBox';\nimport { ChoiceButton } from './widgets/controls/ChoiceButton';\nimport { Combo } from './widgets/controls/Combo';\nimport { ImageBooleanButton } from './widgets/controls/ImageBooleanButton';\nimport { MenuButton } from './widgets/controls/MenuButton';\nimport { NativeButton } from './widgets/controls/NativeButton';\nimport { RadioBox } from './widgets/controls/RadioBox';\nimport { Scrollbar } from './widgets/controls/Scrollbar';\nimport { TextInput } from './widgets/controls/TextInput';\nimport { Arc } from './widgets/graphics/Arc';\nimport { Ellipse } from './widgets/graphics/Ellipse';\nimport { ImageWidget } from './widgets/graphics/ImageWidget';\nimport { Label } from './widgets/graphics/Label';\nimport { Polygon } from './widgets/graphics/Polygon';\nimport { Polyline } from './widgets/graphics/Polyline';\nimport { Rectangle } from './widgets/graphics/Rectangle';\nimport { RoundedRectangle } from './widgets/graphics/RoundedRectangle';\nimport { ByteMonitor } from './widgets/monitors/ByteMonitor';\nimport { Gauge } from './widgets/monitors/Gauge';\nimport { ImageBooleanIndicator } from './widgets/monitors/ImageBooleanIndicator';\nimport { IntensityGraph } from './widgets/monitors/IntensityGraph';\nimport { LED } from './widgets/monitors/LED';\nimport { Meter } from './widgets/monitors/Meter';\nimport { ProgressBar } from './widgets/monitors/ProgressBar';\nimport { Tank } from './widgets/monitors/Tank';\nimport { TextUpdate } from './widgets/monitors/TextUpdate';\nimport { Thermometer } from './widgets/monitors/Thermometer';\nimport { XYGraph } from './widgets/monitors/xygraph/XYGraph';\nimport { AbstractContainerWidget } from './widgets/others/AbstractContainerWidget';\nimport { DisplayWidget } from './widgets/others/DisplayWidget';\nimport { GroupingContainer } from './widgets/others/GroupingContainer';\nimport { LinkingContainer } from './widgets/others/LinkingContainer';\nimport { TabbedContainer } from './widgets/others/TabbedContainer';\nimport { Table } from './widgets/others/Table';\nimport { WebBrowser } from './widgets/others/WebBrowser';\nimport { XMLNode } from './XMLNode';\n\n\nconst TYPE_ACTION_BUTTON = 'Action Button';\nconst TYPE_ARC = 'Arc';\nconst TYPE_BOOLEAN_BUTTON = 'Boolean Button';\nconst TYPE_BOOLEAN_SWITCH = 'Boolean Switch';\nconst TYPE_BYTE_MONITOR = 'Byte Monitor';\nconst TYPE_CHECK_BOX = 'Check Box';\nconst TYPE_CHOICE_BUTTON = 'Choice Button';\nconst TYPE_COMBO = 'Combo';\nconst TYPE_COMBO_BOX = 'Combo Box'; // Only used in old displays\nconst TYPE_ELLIPSE = 'Ellipse';\nconst TYPE_GAUGE = 'Gauge';\nconst TYPE_GROUPING_CONTAINER = 'Grouping Container';\nconst TYPE_IMAGE = 'Image';\nconst TYPE_IMAGE_BOOLEAN_BUTTON = 'Image Boolean Button';\nconst TYPE_IMAGE_BOOLEAN_INDICATOR = 'Image Boolean Indicator';\nconst TYPE_INTENSITY_GRAPH = 'Intensity Graph';\nconst TYPE_LABEL = 'Label';\nconst TYPE_LED = 'LED';\nconst TYPE_LINKING_CONTAINER = 'Linking Container';\nconst TYPE_MENU_BUTTON = 'Menu Button';\nconst TYPE_METER = 'Meter';\nconst TYPE_NATIVE_BUTTON = 'Button'; // Only used in old displays\nconst TYPE_POLYGON = 'Polygon';\nconst TYPE_POLYLINE = 'Polyline';\nconst TYPE_PROGRESS_BAR = 'Progress Bar';\nconst TYPE_RADIO_BOX = 'Radio Box';\nconst TYPE_RECTANGLE = 'Rectangle';\nconst TYPE_ROUNDED_RECTANGLE = 'Rounded Rectangle';\nconst TYPE_SCROLLBAR = 'Scrollbar';\nconst TYPE_TABBED_CONTAINER = 'Tabbed Container';\nconst TYPE_TABLE = 'Table';\nconst TYPE_TANK = 'Tank';\nconst TYPE_TEXT_INPUT = 'Text Input';\nconst TYPE_TEXT_UPDATE = 'Text Update';\nconst TYPE_THERMOMETER = 'Thermometer';\nconst TYPE_WEB_BROWSER = 'Web Browser';\nconst TYPE_XY_GRAPH = 'XY Graph';\n\nexport class Display {\n\n rootPanel: HTMLDivElement;\n private g: Graphics;\n private ctx: CanvasRenderingContext2D;\n pvEngine: PVEngine;\n private pathResolver: PathResolver;\n private consoleHandler: ConsoleHandler;\n\n private repaintRequested = false;\n\n private _editMode = false;\n private _showGrid = false;\n private _showOutline = false;\n private _showRuler = false;\n private _selection: string[] = [];\n private _scale = 1;\n private _transparent = false;\n\n /**\n * Prefix for images sourced during draw.\n * (does not include workspace images)\n */\n imagesPrefix = '';\n\n /**\n * Prefix for workspace references (images, scripts, displays)\n */\n absPrefix = '';\n relPrefix = '';\n\n instance?: DisplayWidget;\n\n private eventListeners: OPIEventHandlers = {\n closedisplay: [],\n opendisplay: [],\n openpv: [],\n selection: [],\n scale: [],\n };\n\n private displayRegion: HitRegionSpecification;\n\n constructor(private readonly targetElement: HTMLElement) {\n\n // Wrapper to not modify the user element much more\n this.rootPanel = document.createElement('div');\n this.rootPanel.className = 'display-root';\n this.rootPanel.style.overflow = 'hidden';\n this.rootPanel.style.position = 'relative';\n this.rootPanel.style.fontSize = '0';\n targetElement.appendChild(this.rootPanel);\n\n const canvas = document.createElement('canvas');\n this.rootPanel.appendChild(canvas);\n this.g = new Graphics(canvas);\n this.ctx = this.g.ctx;\n\n this.pvEngine = new PVEngine(this);\n this.pvEngine.addProvider(new SimulatedPVProvider());\n this.pvEngine.addProvider(new FormulaPVProvider());\n\n this.displayRegion = {\n id: `display-root`,\n click: () => {\n // TextInput widget should cancel input when user clicks outside\n for (const child of this.rootPanel.getElementsByTagName('input')) {\n child.blur();\n }\n for (const child of this.rootPanel.getElementsByTagName('textarea')) {\n child.blur();\n }\n for (const child of this.rootPanel.getElementsByTagName('select')) {\n child.blur();\n }\n }\n };\n\n this.pathResolver = new DefaultPathResolver(this);\n this.consoleHandler = new DefaultConsoleHandler();\n\n window.requestAnimationFrame(() => this.step());\n\n new EventHandler(this, canvas, this.g.hitCanvas);\n }\n\n addProvider(provider: PVProvider) {\n this.pvEngine.addProvider(provider);\n }\n\n addScriptLibrary(name: string, library: any) {\n this.pvEngine.addScriptLibrary(name, library);\n }\n\n setPathResolver(pathResolver: PathResolver) {\n this.pathResolver = pathResolver;\n }\n\n getPathResolver() {\n return this.pathResolver;\n }\n\n setConsoleHandler(consoleHandler: ConsoleHandler) {\n this.consoleHandler = consoleHandler;\n }\n\n getConsoleHandler() {\n return this.consoleHandler;\n }\n\n private step() {\n // Limit CPU usage to when we need it\n if (this.repaintRequested) {\n this.g.clearHitCanvas();\n this.drawScreen();\n this.repaintRequested = false;\n }\n\n window.requestAnimationFrame(() => this.step());\n }\n\n private drawScreen() {\n if (this.instance) {\n this.rootPanel.style.height = this.instance.holderHeight + 'px';\n this.rootPanel.style.width = this.instance.holderWidth + 'px';\n } else {\n this.rootPanel.style.height = '0px';\n this.rootPanel.style.width = '0px';\n }\n this.g.resize(this.rootPanel.clientWidth, this.rootPanel.clientHeight);\n\n if (this.transparent) {\n this.g.clearCanvas();\n }\n\n if (this.editMode) {\n const patternCanvas = document.createElement('canvas');\n const patternContext = patternCanvas.getContext('2d')!;\n patternCanvas.width = 16;\n patternCanvas.height = 16;\n patternContext.fillStyle = '#d6d6d6';\n patternContext.fillRect(0, 0, 8, 8);\n patternContext.fillRect(8, 8, 8, 8);\n this.ctx.fillStyle = this.ctx.createPattern(patternCanvas, 'repeat')!;\n this.ctx.fillRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n\n if (this.instance) {\n this.g.fillRect({\n ... this.instance.bounds,\n color: this.instance.backgroundColor\n });\n }\n } else if (!this.transparent) {\n this.g.fillCanvas(this.instance?.backgroundColor || Color.WHITE);\n }\n\n const displayArea = this.g.addHitRegion(this.displayRegion);\n displayArea.addRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n\n if (this.showGrid && this.instance) {\n const patternCanvas = document.createElement('canvas');\n const patternContext = patternCanvas.getContext('2d')!;\n patternCanvas.width = 25;\n patternCanvas.height = 25;\n patternContext.fillStyle = this.instance.foregroundColor.toString();\n patternContext.fillRect(0, 0, 2, 1);\n this.ctx.fillStyle = this.ctx.createPattern(patternCanvas, 'repeat')!;\n this.ctx.fillRect(25, 25, this.ctx.canvas.width - 50, this.ctx.canvas.height - 50);\n }\n\n if (this.showRuler) {\n this.ctx.lineWidth = 1;\n this.ctx.strokeStyle = 'grey';\n this.ctx.textBaseline = 'bottom';\n this.ctx.textAlign = 'center';\n this.ctx.fillStyle = 'grey';\n this.ctx.font = '12px Arial';\n\n let x = 0;\n while (x <= this.ctx.canvas.width) {\n x += 100;\n this.ctx.beginPath();\n this.ctx.moveTo(x - 75 + 0.5, this.ctx.canvas.height);\n this.ctx.lineTo(x - 75 + 0.5, this.ctx.canvas.height - 4);\n this.ctx.moveTo(x - 50 + 0.5, this.ctx.canvas.height);\n this.ctx.lineTo(x - 50 + 0.5, this.ctx.canvas.height - 6);\n this.ctx.moveTo(x - 25 + 0.5, this.ctx.canvas.height);\n this.ctx.lineTo(x - 25 + 0.5, this.ctx.canvas.height - 4);\n this.ctx.moveTo(x + 0.5, this.ctx.canvas.height);\n this.ctx.lineTo(x + 0.5, this.ctx.canvas.height - 8);\n this.ctx.stroke();\n this.ctx.fillText(String(x), x, this.ctx.canvas.height - 8);\n }\n\n this.ctx.textAlign = 'right';\n this.ctx.textBaseline = 'middle';\n let y = 0;\n while (y <= this.ctx.canvas.height) {\n y += 100;\n this.ctx.beginPath();\n this.ctx.moveTo(this.ctx.canvas.width, y - 75 + 0.5);\n this.ctx.lineTo(this.ctx.canvas.width - 4, y - 75 + 0.5);\n this.ctx.moveTo(this.ctx.canvas.width, y - 50 + 0.5);\n this.ctx.lineTo(this.ctx.canvas.width - 6, y - 50 + 0.5);\n this.ctx.moveTo(this.ctx.canvas.width, y - 25 + 0.5);\n this.ctx.lineTo(this.ctx.canvas.width - 4, y - 25 + 0.5);\n this.ctx.moveTo(this.ctx.canvas.width, y + 0.5);\n this.ctx.lineTo(this.ctx.canvas.width - 8, y + 0.5);\n this.ctx.stroke();\n this.ctx.fillText(String(y), this.ctx.canvas.width - 8, y);\n }\n }\n\n if (this.showOutline && this.instance) {\n this.ctx.lineWidth = 1;\n this.ctx.setLineDash([10, 5]);\n this.ctx.strokeStyle = 'black';\n this.ctx.strokeRect(-0.5, -0.5, this.instance.holderWidth + 1, this.instance.holderHeight + 1);\n this.ctx.setLineDash([]);\n }\n\n if (this.instance) {\n this.instance.draw(this.g);\n }\n\n // Selection on top of everything\n for (const wuid of this.selection) {\n const widget = this.findWidget(wuid);\n if (widget) {\n widget.drawSelection(this.ctx);\n }\n }\n }\n\n /**\n * Request a repaint of the canvas. The repaint is done async from a\n * UI render loop.\n */\n requestRepaint() {\n this.repaintRequested = true;\n }\n\n setTooltip(tooltip: string | undefined) {\n this.rootPanel.title = tooltip?.trim() ?? '';\n }\n\n createWidget(kind: string, parent: AbstractContainerWidget) {\n switch (kind) {\n case TYPE_ACTION_BUTTON:\n return new ActionButton(this, parent);\n case TYPE_ARC:\n return new Arc(this, parent);\n case TYPE_BOOLEAN_BUTTON:\n return new BooleanButton(this, parent);\n case TYPE_BOOLEAN_SWITCH:\n return new BooleanSwitch(this, parent);\n case TYPE_BYTE_MONITOR:\n return new ByteMonitor(this, parent);\n case TYPE_CHECK_BOX:\n return new CheckBox(this, parent);\n case TYPE_CHOICE_BUTTON:\n return new ChoiceButton(this, parent);\n case TYPE_COMBO:\n case TYPE_COMBO_BOX:\n return new Combo(this, parent);\n case TYPE_ELLIPSE:\n return new Ellipse(this, parent);\n case TYPE_GAUGE:\n return new Gauge(this, parent);\n case TYPE_GROUPING_CONTAINER:\n return new GroupingContainer(this, parent);\n case TYPE_IMAGE:\n return new ImageWidget(this, parent);\n case TYPE_IMAGE_BOOLEAN_BUTTON:\n return new ImageBooleanButton(this, parent);\n case TYPE_IMAGE_BOOLEAN_INDICATOR:\n return new ImageBooleanIndicator(this, parent);\n case TYPE_INTENSITY_GRAPH:\n return new IntensityGraph(this, parent);\n case TYPE_LABEL:\n return new Label(this, parent);\n case TYPE_LED:\n return new LED(this, parent);\n case TYPE_LINKING_CONTAINER:\n return new LinkingContainer(this, parent);\n case TYPE_MENU_BUTTON:\n return new MenuButton(this, parent);\n case TYPE_METER:\n return new Meter(this, parent);\n case TYPE_NATIVE_BUTTON:\n return new NativeButton(this, parent);\n case TYPE_POLYGON:\n return new Polygon(this, parent);\n case TYPE_POLYLINE:\n return new Polyline(this, parent);\n case TYPE_PROGRESS_BAR:\n return new ProgressBar(this, parent);\n case TYPE_RADIO_BOX:\n return new RadioBox(this, parent);\n case TYPE_RECTANGLE:\n return new Rectangle(this, parent);\n case TYPE_ROUNDED_RECTANGLE:\n return new RoundedRectangle(this, parent);\n case TYPE_SCROLLBAR:\n return new Scrollbar(this, parent);\n case TYPE_TABBED_CONTAINER:\n return new TabbedContainer(this, parent);\n case TYPE_TABLE:\n return new Table(this, parent);\n case TYPE_TANK:\n return new Tank(this, parent);\n case TYPE_TEXT_INPUT:\n return new TextInput(this, parent);\n case TYPE_TEXT_UPDATE:\n return new TextUpdate(this, parent);\n case TYPE_THERMOMETER:\n return new Thermometer(this, parent);\n case TYPE_WEB_BROWSER:\n return new WebBrowser(this, parent);\n case TYPE_XY_GRAPH:\n return new XYGraph(this, parent);\n default:\n console.warn(`Unsupported widget type: ${kind}`);\n }\n }\n\n destroy() {\n this.instance?.destroy();\n this.instance = undefined;\n this.pvEngine.clearState();\n this.requestRepaint();\n }\n\n resolvePath(path: string, widget?: Widget) {\n return this.pathResolver.resolve(path, widget);\n }\n\n setSource(href: string) {\n this.reset();\n const idx = href.lastIndexOf('/') + 1;\n this.relPrefix = href.substring(0, idx);\n\n return new Promise<void>((resolve, reject) => {\n fetch(href, {\n // Send cookies too.\n // Old versions of Firefox do not do this automatically.\n credentials: 'same-origin'\n }).then(response => {\n if (response.ok) {\n response.text().then(text => {\n this.setSourceString(text);\n resolve();\n }).catch(err => reject(err));\n }\n }).catch(err => reject(err));\n });\n }\n\n private setSourceString(source: string) {\n this.reset();\n this.instance = new DisplayWidget(this);\n const displayNode = XMLNode.parseFromXML(source);\n this.instance.parseNode(displayNode);\n this.pvEngine.init();\n this.requestRepaint();\n }\n\n private reset() {\n if (this.instance) {\n this.clearSelection();\n this.pvEngine.clearState();\n this.instance.destroy();\n this.instance = undefined;\n }\n }\n\n /**\n * Bounds of this widget relative to the root\n * of all of its parents.\n */\n measureAbsoluteArea(widget: Widget) {\n const bounds = widget.bounds;\n let parent = widget.parent;\n while (parent) {\n bounds.x += parent.x;\n bounds.y += parent.y;\n if (parent instanceof TabbedContainer) {\n const { x: xo, y: yo } = parent.measureTabOffset(this.g);\n bounds.x += xo;\n bounds.y += yo;\n }\n parent = parent.parent;\n }\n bounds.x += widget.x - widget.holderX;\n bounds.y += widget.y - widget.holderY;\n bounds.width += widget.width - widget.holderWidth;\n bounds.height += widget.height - widget.holderHeight;\n\n // Not sure why\n bounds.x += this.scale * 1;\n bounds.y += this.scale * 1;\n return bounds;\n }\n\n addEventListener<K extends keyof OPIEventMap>(type: K, listener: ((ev: OPIEventMap[K]) => void)): void;\n addEventListener(type: string, listener: (ev: OPIEvent) => void): void {\n if (!(type in this.eventListeners)) {\n throw new Error(`Unknown event '${type}'`);\n }\n this.eventListeners[type].push(listener);\n }\n\n removeEventListener<K extends keyof OPIEventMap>(type: K, listener: ((ev: OPIEventMap[K]) => void)): void;\n removeEventListener(type: string, listener: (ev: OPIEvent) => void): void {\n if (!(type in this.eventListeners)) {\n throw new Error(`Unknown event '${type}'`);\n }\n this.eventListeners[type] = this.eventListeners[type]\n .filter((el: any) => (el !== listener));\n }\n\n fireEvent(type: string, event: OPIEvent) {\n const listeners = this.eventListeners[type];\n listeners.forEach(listener => listener(event));\n }\n\n get showGrid() { return this._showGrid; }\n set showGrid(showGrid: boolean) {\n this._showGrid = showGrid;\n this.requestRepaint();\n }\n\n get showOutline() { return this._showOutline; }\n set showOutline(showOutline: boolean) {\n this._showOutline = showOutline;\n this.requestRepaint();\n }\n\n get showRuler() { return this._showRuler; }\n set showRuler(showRuler: boolean) {\n this._showRuler = showRuler;\n this.requestRepaint();\n }\n\n get selection() { return this._selection; }\n set selection(selection: string[]) {\n this._selection = selection;\n this.requestRepaint();\n const selectionEvent: SelectionEvent = {\n selected: this._selection.slice(),\n };\n this.fireEvent('selection', selectionEvent);\n }\n\n get editMode() { return this._editMode; }\n set editMode(editMode: boolean) {\n this._editMode = editMode;\n this.requestRepaint();\n }\n\n get scale() { return this._scale; }\n set scale(scale: number) {\n this._scale = scale;\n this.requestRepaint();\n const scaleEvent: ScaleEvent = { scale };\n this.fireEvent('scale', scaleEvent);\n }\n\n get transparent() { return this._transparent; }\n set transparent(transparent: boolean) {\n this._transparent = transparent;\n this.requestRepaint();\n }\n\n get widgets() { return this.instance ? this.instance.widgets : []; }\n\n clearSelection() {\n if (this.selection.length) { // Avoids unnecessary selection events\n this.selection = [];\n }\n }\n\n findWidget(wuid: string) {\n if (this.instance) {\n return this.instance.findWidget(wuid);\n }\n }\n\n findWidgetByName(name: string) {\n if (this.instance) {\n return this.instance.findWidgetByName(name);\n }\n }\n\n getPVNames() {\n return this.pvEngine.getPVNames();\n }\n\n getPV(pvName: string) {\n return this.pvEngine.getPV(pvName);\n }\n\n setValues(samples: Map<string, Sample>) {\n this.pvEngine.setValues(samples);\n }\n\n copyCanvas(area?: Bounds) {\n if (!area) {\n area = {\n x: 0,\n y: 0,\n width: this.g.canvas.width,\n height: this.g.canvas.height,\n };\n }\n const copy = document.createElement('canvas');\n copy.width = area.width;\n copy.height = area.height;\n copy.getContext('2d')!.drawImage(\n this.g.canvas, area.x, area.y, area.width, area.height,\n 0, 0, area.width, area.height);\n return copy;\n }\n\n /**\n * Returns this display as an image.\n */\n toDataURL(type = 'image/png', quality?: any) {\n return this.g.ctx.canvas.toDataURL(type, quality);\n }\n}\n"],"names":["DefaultConsoleHandler","writeInfo","message","console","log","writeError","error","writeWarning","warn","Color","constructor","red","green","blue","alpha","this","withAlpha","mixWith","color","weight","r","Math","floor","g","b","brighter","i","min","darker","max","contrast","hex","toString","length","a","getRGBValue","equals","other","TRANSPARENT","BLACK","BLUE","CYAN","DARK_GRAY","GRAY","GREEN","LIGHT_BLUE","ORANGE","PINK","PURPLE","RED","WHITE","YELLOW","BUTTON","BUTTON_DARKER","BUTTON_DARKEST","BUTTON_LIGHTEST","clickBlocker","e","document","removeEventListener","preventDefault","stopPropagation","isLeftPressed","buttons","undefined","which","regionMatches","region1","region2","id","EventHandler","display","canvas","hitCanvas","grabbing","documentMouseMoveListener","onDocumentMouseMove","documentMouseUpListener","onDocumentMouseUp","addEventListener","onCanvasClick","onCanvasMouseDown","onCanvasMouseUp","onCanvasMouseOut","onCanvasMouseMove","toPoint","event","bbox","getBoundingClientRect","x","clientX","left","y","clientY","top","clearSelection","point","editMode","selectSingleWidget","region","getActiveRegion","click","mouseDown","grab","grabPoint","Object","assign","grabTarget","mouseUp","prevEnteredRegion","mouseOut","domEvent","mouseEnter","cursor","style","tooltip","setTooltip","distance","x1","y1","x2","y2","sqrt","abs","initiateGrab","dx","dy","grabEnd","instance","widget","widgets","slice","reverse","holderX","holderY","holderWidth","holderHeight","selection","wuid","HitCanvas","parent","width","height","regions","createElement","ctx","getContext","root","clear","fillStyle","fillRect","beginHitRegion","hitRegion","generateUniqueColor","beginPath","pixel","getImageData","data","createChild","transferToParent","dw","dh","Error","drawImage","round","random","toBorderBox","lineWidth","shrink","rotatePoint","cx","cy","angle","sin","cos","relX","relY","original","v","h","crispen","translatePoint","translatePoints","points","map","toRadians","degrees","PI","convertPolarToCartesian","theta","bounds","convertCartesianToPolar","pole","pow","acos","PolarPoint","scalePoints","scale","p","roundRect","w","rx","ry","moveTo","lineTo","quadraticCurveTo","rect","Graphics","hitCtx","tmpHitCanvas","childCanvas","translate","copy","copyFitted","sw","sh","ratio","fitw","fith","copyScaled","clearHitCanvas","fillCanvas","clearCanvas","clearRect","scaleCanvas","resize","fill","gradient","opacity","globalAlpha","utils.roundRect","fillText","textBaseline","baseline","textAlign","align","font","getFontString","text","fillEllipse","startAngle","endAngle","ellipse","anticlockwise","strokeEllipse","stroke","dash","setLineDash","strokeStyle","measureText","createLinearGradient","x0","y0","strokeRect","box","strokePath","segment","path","segments","line","fillPath","addHitRegion","HitRegionBuilder","Path","push","static","getBoundingBox","tl","br","closePath","orig","addRect","addEllipse","rotation","addPath","PropertySet","properties","Map","generators","property","set","name","add","addGenerator","generator","all","values","loadProperty","node","hasNode","ActionsProperty","value","getActions","AutoScaleWidgetsProperty","getAutoScaleWidgets","BooleanProperty","getBoolean","ColorMapProperty","getColorMap","ColorProperty","getColor","FloatProperty","getFloat","FontProperty","getFont","IntProperty","getInt","MacrosProperty","getMacros","PointsProperty","getPoints","PVValueProperty","RulesProperty","getRules","ScaleOptionsProperty","getScaleOptions","ScriptsProperty","getScripts","StringProperty","rawValue","getString","StringListProperty","getStringList","StringTableProperty","getStringTable","loadXMLValues","forEach","resolveStringProperties","stringProperty","expandMacro","getProperty","propertyName","get","getValue","optional","prop","setValue","Property","defaultValue","_value","oldValue","listeners","listener","addListener","removeListener","idx","indexOf","splice","printScriptValue","String","replace","pvPropertyName","super","code","ActionSet","actions","hookFirstActionToClick","hookAllActionsToClick","action","isClickable","getAction","index","getClickActions","indexes","type","OpenDisplayAction","OpenFileAction","ExecuteJavaScriptAction","embedded","ExecuteCommandAction","command","WritePVAction","pvName","PlaySoundAction","OpenWebpageAction","hyperlink","ColorMap","interpolate","autoscale","colors","entries","dirty","addMapping","compile","sort","lookup","binarySearch","start","startColor","stop","stopColor","f","getMinMax","apply","m","n","k","l","attachEvent","t","setAttribute","appendChild","createTextNode","c","cssText","u","z","offsetWidth","scrollLeft","scrollWidth","A","parentNode","B","family","stretch","C","D","E","F","J","fonts","K","L","join","prototype","load","H","Date","getTime","Promise","test","window","navigator","vendor","exec","userAgent","parseInt","G","M","then","setTimeout","N","race","clearTimeout","body","readyState","detachEvent","d","removeChild","q","dir","I","hidden","module","exports","WEB_SAFE","Font","pixels","preload","resolve","variant","FontFaceObserver","ARIAL_9","ARIAL_10","ARIAL_11","ARIAL_12_BOLD","MacroSet","includeParentMacros","macros","replacement","RuleSet","rules","AutoScaleWidgets","autoScaleWidgets","minWidth","minHeight","ScaleOptions","widthScalable","heightScalable","keepWidthHeightRatio","ScriptSet","scripts","XMLNode","nodeName","xml","doc","DOMParser","parseFromString","documentElement","getNode","findChild","getNodes","result","childNodes","child","nodeType","hasAttribute","getTextContent","textContent","getStringAttribute","attr","attributes","getNamedItem","parseFloat","getIntAttribute","getBooleanAttribute","parseColorNode","fontNode","pointsNode","pointNode","listNode","list","stringNode","table","rowNode","row","colNode","scriptsNode","pathNode","inputs","pvNode","trigger","checkConnect","skipFirstExecution","colorMap","entry","Number","rulesNode","ruleNode","expressions","expNode","expression","outputValue","outputExpression","macrosNode","actionsNode","actionNode","actionType","description","commandDirectory","waitTime","confirmMessage","childNodeName","PV","pvEngine","_writable","_severity","AlarmSeverity","NONE","_precision","_disconnected","navigable","units","_units","requestRepaint","lowerDisplayLimit","_lowerDisplayLimit","lowerAlarmLimit","_lowerAlarmLimit","lowerWarningLimit","_lowerWarningLimit","upperWarningLimit","_upperWarningLimit","upperAlarmLimit","_upperAlarmLimit","upperDisplayLimit","_upperDisplayLimit","precision","writable","disconnected","time","_time","indexValue","_indexValue","severity","alarmName","numericValue","toNumber","_a","NaN","_b","_c","_d","formatValue","formatType","formatNumber","toISOString","toFixed","toExponential","toUpperCase","setSample","sample","valueIndex","java","ColorFontUtil","getColorFromRGB","ConsoleUtil","getConsoleHandler","DataUtil","createDoubleArray","size","Array","createIntArray","toJavaDoubleArray","arr","toJavaIntArray","PVWrapper","_pv","getName","isConnected","isWriteAllowed","WidgetWrapper","executeAction","getPVByName","pv","getPV","propertyValue","getPropertyValue","getVar","vars","setVar","setPropertyValue","setX","setY","setWidth","setHeight","setVisible","visible","setValueInUIThread","TableWrapper","spreadSheetTable","spreadsheet","getTable","XYGraphWrapper","xyGraph","clearGraph","getXBuffer","getTrace","snapshot","getYBuffer","wrapWidget","widgetType","DisplayWrapper","isActive","getWidget","findWidgetByName","FileUtil","readTextFile","filePath","href","resolvePath","request","XMLHttpRequest","open","send","status","responseText","GUIUtil","fullScreen","requestFullscreen","openConfirmDialog","confirm","openInformationDialog","alert","openWarningDialog","openErrorDialog","openPasswordDialog","password","answer","prompt","SpreadSheetTable","columnCount","cells","isEmpty","refresh","getCells","getContent","content","cell","setContent","getColumnCount","getRowCount","getCellText","col","rowContent","setColumnsCount","count","newColumns","appendRow","deleteRow","deleteColumn","insertRow","insertColumn","getCell","setCellText","setRowBackground","rowCells","backgroundColor","setRowForeground","foregroundColor","setCellBackground","setCellForeground","setColumnCellEditorData","lang","Runnable","args","run","Thread","runnable","sleep","delay","now","trace","Java","className","to","jsValue","javaType","MessageDialog","openInformation","shell","title","openConfirm","openError","SUPPORTED_DATE_FORMAT_PATTERNS","PVUtil","getDouble","getLong","getStringArray","isArray","item","getTimeInMilliseconds","dt","getTimeString","format","pattern","formatDate","getSeverity","MAJOR","MINOR","getSeverityString","getStatus","date","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","s","getUTCSeconds","getUTCMilliseconds","ScriptUtil","openOPI","target","macrosInput","fireEvent","closeCurrentOPI","iframe","contentWindow","wEval","ScriptEngine","scriptText","pvs","eval","execScript","call","trim","context","triggerPV","scriptLibraries","pvWrapper","originalGlobals","hasOwnProperty","updatedContext","PROP_ACTIONS","PROP_BACKGROUND_COLOR","PROP_BACKGROUND_ALARM_SENSITIVE","PROP_BORDER_ALARM_SENSITIVE","PROP_BORDER_COLOR","PROP_BORDER_WIDTH","PROP_BORDER_STYLE","PROP_ENABLED","PROP_FOREGROUND_COLOR","PROP_FOREGROUND_ALARM_SENSITIVE","PROP_HEIGHT","PROP_NAME","PROP_PV_NAME","PROP_PV_VALUE","PROP_RULES","PROP_SCALE_OPTIONS","PROP_SCRIPTS","PROP_TEXT","PROP_TOOLTIP","PROP_TRANSPARENT","PROP_VISIBLE","PROP_WIDGET_TYPE","PROP_WIDTH","PROP_WUID","Widget","fillRoundRectangleBackgroundBorder","parseNode","catch","createPV","script","createScript","fetch","credentials","response","ok","rule","createRule","holderRegion","init","drawHolder","insets","alarmBorder","borderAlarmSensitive","borderStyle","borderWidth","beforeDrawBorder","drawBorderStyle","borderColor","bottom","right","drawShadowBorder","drawDashedBorder","fm","transparent","drawDecoration","INVALID","drawOverlay","drawSelection","unscaledBounds","area","c1","c2","c3","c4","mode","Audio","play","location","pvProperty","expandContainerMacros","isMinorSeverity","isMajorSeverity","alarm","alarmSensitiveBackgroundColor","backgroundAlarmSensitive","alarmSensitiveForegroundColor","foregroundAlarmSensitive","relativeScale","addPropertyListener","removePropertyListener","toDataURL","quality","measureAbsoluteArea","copyCanvas","pvValue","enabled","scaleOptions","split","hide","destroy","PROP_MACROS","AbstractContainerWidget","_widgets","_connections","key","findWidget","match","connection","connections","PROP_ARROW_LENGTH","PROP_ARROWS","PROP_FILL_ARROW","PROP_LINE_COLOR","PROP_LINE_STYLE","PROP_LINE_WIDTH","PROP_SRC_WUID","PROP_SRC_TERM","PROP_TGT_WUID","PROP_TGT_TERM","PROP_ROUTER","PROP_POINTS","DIRECTION_LEFT","DIRECTION_UP","DIRECTION_DOWN","DIRECTION_RIGHT","Connection","sourceWidget","sourceWuid","targetWidget","targetWuid","draw","drawPath","router","drawManhattanConnection","drawDirectConnection","from","getPosition","sourceTerm","targetTerm","fromPoints","lineColor","getDashArray","drawStartArrow","drawStopArrow","source","getManhattanAnchor","route","lineStyle","term","direction","position","distanceLeft","distanceRight","distanceTop","distanceBottom","pointsProperty","pos","xDiff","yDiff","tolxtol","tol","minDist","fromAnchor","concat","startPoint","endPoint","arrows","arrowPoints","calculateArrowPoints","fillArrow","ppE","ppR","arrowLength","ppL","ppI","DID_SEQUENCE","PROP_AUTO_SCALE_WIDGETS","DisplayWidget","displayId","displayName","widgetNode","kind","createWidget","connectionNode","filter","measureContentBounds","scaled","LCID_SEQUENCE","PROP_GROUP_NAME","PROP_OPI_FILE","PROP_RESIZE_BEHAVIOR","LinkingContainer","linkingContainerId","opiFile","resolvedOpiFile","linkedDisplay","displayNode","parseFromXML","linkedWidget","getLinkedWidget","resizeBehavior","contentBounds","zoom","offscreen","ceil","groupName","DefaultPathResolver","startsWith","absPrefix","lastIndexOf","substring","relPrefix","CompiledFormula","formula","pvValues","updateDataSource","clearState","getPVNames","pvNames","getExpressionParameters","consequent","alternate","argument","arguments","execute","executeExpression","pval","executeConditionalExpression","executeBinaryExpression","executeLogicalExpression","executeUnaryExpression","executeCallExpression","operator","symbol","callee","asin","atan","cbrt","cosh","exp","log10","sign","sinh","tan","tanh","callParameterAcquisitionStatus","parameter","acquisitionStatus","peg$SyntaxError","expected","found","self","setPrototypeOf","peg$padEnd","str","targetLength","padString","repeat","peg$parse","input","options","peg$result","peg$FAILED","peg$source","grammarSource","peg$startRuleFunctions","Start","peg$parseStart","peg$startRuleFunction","peg$c8","peg$c10","peg$c11","peg$c14","peg$c15","peg$c16","peg$c21","peg$c22","peg$c25","peg$c26","peg$c27","peg$c28","peg$r0","peg$r1","peg$r2","peg$r3","peg$r4","peg$r5","peg$e0","peg$literalExpectation","peg$e1","peg$e2","peg$e3","peg$e4","peg$e5","peg$e6","peg$e7","peg$otherExpectation","peg$e8","peg$classExpectation","peg$e9","peg$e10","peg$e11","peg$e12","peg$e13","peg$e14","peg$e15","peg$e16","peg$e17","peg$e18","peg$e19","peg$e20","peg$e21","peg$e22","peg$e23","peg$e24","peg$e25","peg$e26","peg$e27","peg$e28","peg$e29","peg$e30","peg$e31","peg$e32","peg$e33","peg$e34","peg$e35","peg$e36","peg$e37","peg$e38","peg$e39","peg$e40","peg$f8","peg$savedPos","peg$currPos","peg$f15","head","tail","element","extractList","buildList","peg$f16","reduce","buildBinaryExpression","peg$posDetailsCache","column","peg$maxFailPos","peg$maxFailExpected","peg$silentFails","startRule","ignoreCase","parts","inverted","peg$computePosDetails","details","charCodeAt","peg$computeLocation","startPos","endPos","startPosDetails","endPosDetails","offset","end","peg$fail","s0","s1","s3","peg$parse_","peg$parseLogicalExpression","peg$parseFormula","peg$parseWhiteSpace","peg$parseIdentifier","s2","charAt","peg$parseIdentifierStart","peg$parseIdentifierPart","peg$parseIdentifierSymbol","peg$parseLiteral","substr","toLowerCase","peg$parseTRUE","peg$parseFALSE","peg$parseBooleanLiteral","peg$parsePI","peg$parseE","peg$parseConstantLiteral","s4","peg$parseDecimalIntegerLiteral","peg$parseDecimalDigit","peg$parseNumericLiteral","peg$parseStringLiteral","peg$parseParameterLiteral","peg$parseNonZeroDigit","peg$parseUnaryExpression","s5","peg$parsePrimaryExpression","peg$parseUnaryOperator","peg$parseCallExpression","s6","s7","peg$parseArgumentList","peg$parseArguments","peg$parseMultiplicativeExpression","peg$parseAdditiveExpression","peg$parseRelationalExpression","peg$parseEqualityExpression","buildLogicalExpression","buildMessage","peg$subclass","sources","src","loc","filler","last","DESCRIBE_EXPECTATION_FNS","literal","expectation","literalEscape","class","escapedParts","part","classEscape","any","ch","describeExpectation","j","descriptions","describeExpected","describeFound","FormulaCompiler","formulaString","parse","FormulaPVProvider","canProvide","startProviding","FormulaPV","stopProviding","delete","isNavigable","shutdown","compiler","compiledFormula","pvDependency","LocalPV","initializer","PV_PATTERN","stripInitializer","PVEngine","providers","disconnectAll","keys","hasPV","stripped","has","provider","toBeStopped","createLocalPV","spec","endsWith","mayInitialize","localPV","initializerEquals","setValues","samples","triggeredListeners","model","ScriptInstance","isTrigger","hasValue","scriptEngine","RuleInstance","addProvider","addScriptLibrary","library","mayTriggerNow","usesDoubles","usesInts","usesStrings","usesSeverities","expr","defaultValueStr","SimGenerator","interval","initialValue","timer","setInterval","generateSample","emit","clearInterval","ConstantGenerator","Noise","range","GaussianNoise","avg","stddev","rad","gaussian","Sine","samplesPerCycle","currentValue","Ramp","inc","SimulatedPVProvider","wrapped","SimulatedPV","fn","createGenerator","fnName","constValue","saferEval","createGaussianNoise","createNoise","createRamp","createSine","obj","Function","ramp","step","sine","PROP_FONT","PROP_PUSH_ACTION_INDEX","PROP_RELEASE_ACTION_INDEX","PROP_TOGGLE_BUTTON","PROP_IMAGE","ActionButton","pushed","imageLoaded","image","imageElement","Image","onload","areaRegion","toggleButton","releaseActionIndex","pushActionIndex","lines","textWidth","textHeight","naturalHeight","naturalWidth","hratio","magicSpacer","imageX","imageY","contentHeight","maxWidth","textX","textY","PROP_DATA_TYPE","PROP_EFFECT_3D","PROP_OFF_COLOR","PROP_OFF_LABEL","PROP_OFF_STATE","PROP_ON_COLOR","PROP_ON_LABEL","PROP_ON_STATE","PROP_SHOW_LED","PROP_SHOW_BOOLEAN_LABEL","PROP_SQUARE_BUTTON","BooleanButton","hovered","manualToggleState","booleanValue","toggleOff","toggleOn","dataType","bit","onState","offState","Boolean","toggled","squareButton","drawSquare","drawEllipse","drawHorizontal","drawVertical","showBooleanLabel","onLabel","offLabel","tlColor","brColor","effect3d","addColorStop","showLed","diameter","ledArea","ledColor","onColor","offColor","BooleanSwitch","shaftRegion","areaWidth","areaHeight","pedBounds","drawPedestal","largeWidth","largeHeight","smallWidth","smallHeight","smallMove","onLargeBounds","onSmallBounds","drawHorizontalBar","offLargeBounds","offSmallBounds","drawVerticalBar","barHeight","sm","lg","stopOpacity1","stopOpacity2","wp","PROP_LABEL","PROP_SELECTED_COLOR","BOX_BORDER_COLOR","BOX_BACKGROUND_MIX_COLOR","CheckBox","boxSize","gap","selectedColor","label","PROP_HORIZONTAL","PROP_ITEMS","PROP_ITEMS_FROM_PV","ChoiceButton","itemRegions","items","pushedItem","writeValue","horizontal","avgWidth","startX","buttonBounds","drawButton","avgHeight","startY","itemIndex","selected","itemsFromPV","BORDER_COLOR","Combo","selectEl","boxSizing","emptyOptionEl","disabled","defaultSelected","optionEl","rootPanel","selectorWidth","PROP_OFF_IMAGE","PROP_ON_IMAGE","ImageBooleanButton","onImageLoaded","offImageLoaded","onImageElement","offImageElement","onImage","offImage","MenuButton","evt","selectedIndex","NativeButton","RADIO_BORDER_COLOR","HOVER_MIX_COLOR","RadioBox","hoveredItem","radioBounds","drawRadio","radioRadius","dotRadius","PROP_MAXIMUM","PROP_MINIMUM","PROP_STEP_INCREMENT","PROP_PAGE_INCREMENT","PROP_BAR_LENGTH","PROP_SHOW_VALUE_TIP","BACKGROUND_COLOR","BUTTON_COLOR","REPEAT_INTERVAL","Scrollbar","decreasePressed","increasePressed","pageDecreasePressed","pageIncreasePressed","decreaseRegion","stepDecreaseRepeatedly","actionTimeout","increaseRegion","stepIncreaseRepeatedly","thumbRegion","grabStartValue","getCoercedValue","delta","valueChange","maximum","minimum","dragRange","setCoercedValue","pageDecreaseRegion","pageDecreaseRepeatedly","pageIncreaseRegion","pageIncreaseRepeatedly","buttonWidth","drawLeftButton","drawRightButton","extent","barLength","totalRange","valueRange","trackWidth","thumbWidth","leftTrackWidth","rightTrackWidth","thumbBounds","drawRaisedButtonBorder","pageDecreaseBounds","pageIncreaseBounds","buttonHeight","drawUpButton","drawDownButton","trackHeight","thumbHeight","northTrackHeight","southTrackHeight","drawPressedButtonBorder","triangleBounds","triangleSize","drawButtonBorder","stepIncrease","stepDecrease","stepIncrement","pageIncrease","pageDecrease","pageIncrement","showValueTip","PROP_CONFIRM_MESSAGE","PROP_FORMAT_TYPE","PROP_HORIZONTAL_ALIGNMENT","PROP_MULTILINE_INPUT","PROP_PASSWORD_INPUT","PROP_PRECISION","PROP_PRECISION_FROM_PV","PROP_VERTICAL_ALIGNMENT","TextInput","editing","inputEl","autocomplete","multilineInput","singleInputEl","passwordInput","focus","select","ctrlKey","cancelInput","tmpCanvas","offscreenCtx","horizAlignment","vertAlignment","precisionFromPV","PROP_ALPHA","PROP_FILL","PROP_START_ANGLE","PROP_TOTAL_ANGLE","Arc","drawShape","totalAngle","PROP_BG_GRADIENT_COLOR","PROP_FG_GRADIENT_COLOR","PROP_FILL_LEVEL","PROP_GRADIENT","PROP_HORIZONTAL_FILL","Ellipse","drawBackground","fillLevel","drawFill","horizontalFill","backgroundGradientStartColor","save","fillWidth","fillHeight","fillY","clip","foregroundGradientStartColor","restore","PROP_IMAGE_FILE","PROP_NO_ANIMATION","PROP_TRANSPARENCY","ImageWidget","imageLoading","snapshotImage","triggerImageLoad","imageFile","currentImageFile","transparency","imageSnapshot","noAnimation","PROP_WRAP_WORDS","Label","wrapText","wrapLine","wrapWords","Polygon","newValue","newPoints","Polyline","firstPoint","lastPoint","Rectangle","PROP_CORNER_WIDTH","PROP_CORNER_HEIGHT","RoundedRectangle","cornerWidth","cornerHeight","PROP_BIT_REVERSE","PROP_LED_BORDER","PROP_LED_BORDER_COLOR","PROP_LED_PACKED","PROP_NUM_BITS","PROP_START_BIT","PROP_SQUARE_LED","ByteMonitor","getLedColor","ii","startBit","numBits","widgetIndex","bitReverse","ledWidth","ledSpacing","ledPacked","ledBorder","ledHeight","squareLed","drawSquare3d","drawSquare2d","ledSize","drawCircle3d","drawCircle2d","ledBorderColor","DecimalFormat","formatStr","prefix","suffix","comma","minInt","minFrac","maxFrac","numberStr","intStr","fracStr","commaPos","tmp","numStr","formatBack","isNaN","Infinity","negative","isPercentage","num","formattedValue","fNumStr","getNumericString","fNumberStr","pIndex","sIndex","rampWidth","lolo","loloColor","showLoLo","lo","loColor","showLo","hi","hiColor","showHi","hihi","hihiColor","showHiHi","logScale","labelsOutside","lengthInDegrees","radius","scaleArea","rampArea","estimatedDonutWidth","SPACE_BTW_MARK_LABEL","getRenderedRange","drawRamp","leftMostAngle","rightMostAngle","getValuePosition","loLeft","gradientLeftAngle","gradientLeft","gradientRightAngle","gradientRight","RAMP_OVERLAP","midLeft","midRight","midNormal","overlap","hiRight","getRadius","limit","valuePosition","getValueInRange","PROP_COLOR_HI","PROP_COLOR_HIHI","PROP_COLOR_LO","PROP_COLOR_LOLO","PROP_VALUE_LABEL_FORMAT","PROP_LEVEL_HI","PROP_LEVEL_HIHI","PROP_LEVEL_LO","PROP_LEVEL_LOLO","PROP_LIMITS_FROM_PV","PROP_LOG_SCALE","PROP_NEEDLE_COLOR","PROP_RAMP_GRADIENT","PROP_SHOW_RAMP","Gauge","limits","limitsFromPv","levelLoLo","levelLo","levelHi","levelHiHi","showRamp","drawLabel","drawNeedle","drawNeedleCenter","strokeWidth","R","UD_FILL_PART","UP_DOWN_RATIO","LR_FILL_PART","UP_ANGLE","DOWN_ANGLE","colorLoLo","colorLo","colorHi","colorHiHi","rampGradient","formatLabelValue","needleDiameter","majorTickLength","gapBetweenNeedleScale","p1","p2","p3","needleColor","valueLabelFormat","minorTickLength","ImageBooleanIndicator","months","LinearScale","scaleFont","majorTickStepHint","showMinorTicks","showScale","labels","labelValues","labelPositions","labelVisibilities","gridStepInPixel","scaleFormat","timeFormat","margin","scaleLength","getX","getY","getGridPositions","pop","shift","setDimensions","pixelsToStart","getPositionValue","absolutePosition","calculateMargin","fm1","fm2","measureHorizontalHeight","spaceBetweenMarkAndLabel","updateLabels","maxHeight","scaleHeight","tickLength","pathX","drawMinorXTicks","leftCoordinate","ticksLeft","scaleWidth","pathY","drawMinorYTicks","minorTicksNumber","minorGridStepInPixel","minorTickMarkStepHint","tickX","scaleY2","updateLabelsForLogScale","gridStep","getGridStep","updateLabelsForLinearScale","updateVisibility","lengthInPixels","minBigger","swap","majorTickMarkStepHint","mantissa","logMin","minLogDigit","maxLogDigit","firstPosition","tickStep","addMinMaxTickInfo","addTickInfo","isMin","labelPosition","tickLabelPosition","previousPosition","previousLabel","hasSpaceToDraw","currentLabel","currentPosition","isRepeatSameTickAndNotEnd","isMajorTickOrEnd","prettyNumber","isMajorTick","previousTickLabel","tickLabel","tickLabelSize","previousTickLabelSize","textLength","noLapOnPrevious","noLapOnEnd","tickLabelGap","endTickLabelSize","tickValue","year","month","day","formatTime","hours","minutes","seconds","milliseconds","opts","ms","PROP_COLOR_MAP","PROP_CROP_BOTTOM","PROP_CROP_LEFT","PROP_CROP_RIGHT","PROP_CROP_TOP","PROP_DATA_HEIGHT","PROP_DATA_WIDTH","PROP_GRAPH_AREA_HEIGHT","PROP_GRAPH_AREA_WIDTH","PROP_X_AXIS_AXIS_COLOR","PROP_X_AXIS_AXIS_TITLE","PROP_X_AXIS_MAJOR_TICK_STEP_HINT","PROP_X_AXIS_MAXIMUM","PROP_X_AXIS_MINIMUM","PROP_X_AXIS_SCALE_FONT","PROP_X_AXIS_SHOW_MINOR_TICKS","PROP_X_AXIS_TITLE_FONT","PROP_X_AXIS_VISIBLE","PROP_Y_AXIS_AXIS_COLOR","PROP_Y_AXIS_AXIS_TITLE","PROP_Y_AXIS_MAJOR_TICK_STEP_HINT","PROP_Y_AXIS_MAXIMUM","PROP_Y_AXIS_MINIMUM","PROP_Y_AXIS_SCALE_FONT","PROP_Y_AXIS_SHOW_MINOR_TICKS","PROP_Y_AXIS_TITLE_FONT","PROP_Y_AXIS_VISIBLE","IntensityGraph","graphAreaWidth","graphAreaHeight","xAxisVisible","xAxisAxisTitle","xAxisTitleFont","yTitleWidth","yAxisVisible","yAxisAxisTitle","yAxisTitleFont","xScale","xAxisScaleFont","xAxisMinimum","xAxisMaximum","xAxisMajorTickStepHint","xAxisAxisColor","xAxisShowMinorTicks","xScaleMargin","yScale","yAxisScaleFont","yAxisMinimum","yAxisMaximum","yAxisMajorTickStepHint","yAxisAxisColor","yAxisShowMinorTicks","yScaleMargin","xScaleHeight","yScaleHeight","yScaleWidth","xScaleWidth","xScaleX","xScaleY2","verticalLineX","verticalLineY","horizontalLineX","horizontalLineY","dataWidth","dataHeight","mapMin","mapMax","cropLeft","cropRight","cropTop","cropBottom","rampScale","rampY","rampFullHeight","rampScaleWidth","rampX","rampHeight","rotate","PROP_STATE_COUNT","PROP_BULB_BORDER","PROP_BULB_BORDER_COLOR","PROP_STATE_COLOR_FALLBACK","PROP_STATE_LABEL_FALLBACK","LED","states","stateCount","colorProperty","labelProperty","valueProperty","bulbColor","state","stateColorFallback","stateLabelFallback","bulbBorder","bulbBorderColor","ALPHA","HW_RATIO","PROP_SCALE_FONT","PROP_SHOW_HI","PROP_SHOW_HIHI","PROP_SHOW_LO","PROP_SHOW_LOLO","Meter","minText","maxText","scaleBounds","rampBounds","stringValue","needleWidth","PROP_COLOR_FILLBACKGROUND","PROP_FILL_COLOR","PROP_FILLCOLOR_ALARM_SENSITIVE","PROP_INDICATOR_MODE","PROP_MAJOR_TICK_STEP_HINT","PROP_ORIGIN","PROP_ORIGIN_IGNORED","PROP_SCALE_FORMAT","PROP_SHOW_LABEL","PROP_SHOW_MARKERS","PROP_SHOW_MINOR_TICKS","PROP_SHOW_SCALE","PROP_TRANSPARENT_BACKGROUND","ProgressBar","transparentBackground","linearScale","markerWidth","showMarkers","drawVerticalMarkers","markerGap","markerTickLength","markerTickLineWidth","outlineWidth","colorFillbackground","outline","fillColor","alarmSensitiveFillColor","indicatorMode","getFillValue","thumbBreadth","fillStart","originIgnored","origin","fillStop","fillArea","showLabel","markerHeight","drawHorizontalMarkers","tickY","fillColorAlarmSensitive","OUTLINE_COLOR_3D","Tank","drawMarkers","drawTank","fillCorner","defaultCorner","intersectFactor","rectWidth","TextUpdate","textBounds","PROP_SHOW_BULB","PROP_UNIT","Thermometer","pipeHeight","showBulb","bulbMaxDiameter","pipeArea","unitHeight","unitText","unit","unitFont","padding","pipeWidth","cornerSize","drawPipe","joint","gx1","gx2","pipeBounds","LOWEST_LOG_10","HIGHEST_LOG_10","Axis","propertySufix","isDateEnabled","isHorizontal","yAxis","isVertical","isPrimary","effectiveMinimum","_effectiveMinimum","effectiveMaximum","_effectiveMaximum","performAutoScale","calculateAutoscaledRange","applyZoom","center","t1","t2","autoScale","autoScaleTreshold","axisColor","axisTitle","dashGridLine","gridColor","leftBottomSide","showGrid","titleFont","ZoomCommand","xAxis","beforeXRanges","beforeYRanges","afterXRanges","afterYRanges","axis","saveState","undo","redo","CommandBuffer","undoStack","redoStack","canUndo","canRedo","PlotAreaRegion","toolbar","currentTool","grabStart","grabZoomCommand","getXAxes","getYAxes","pan","prevGrabEvent","rubberbandZoomCommand","rangeZoomXAxes","rangeZoomYAxes","addCommand","horizontalZoomCommand","verticalZoomCommand","zoomInCommand","getAxes","zoomOutCommand","v1","v2","relx","stopPos","rely","CircularBuffer","bufferSize","pointer","isFull","peek","oldest","newest","TraceBuffer","plotMode","updateMode","concatenateData","chronological","xPending","yTimestamp","yPending","xArray","xArrayPending","yArray","yArrayPending","traceData","updateX","maybeAddPoint","updateY","timestamp","updateXArray","maybeAddArray","updateYArray","addPoint","addArray","xValue","arrayLength","until","Trace","xPVListener","xPVInstance","numberValue","yPVListener","yPVInstance","getAxis","xAxisIndex","xPV","yPV","drawTrace","traceType","traceColor","originY","yAxisIndex","prev","drawPoint","pointSize","pointStyle","clearData","antiAlias","updateDelay","SEPARATOR_COLOR","Button","disabledImageFile","disabledImageElement","toolButton","loadPromise","reject","disabledLoadPromise","toggleTool","updateState","loadImage","XYGraphToolbar","imagesLoaded","commandBuffer","showLegend","createToggleButton","createButton","autoScaleCommand","rubberbandZoom","createToolButton","setCursor","autoScaleAllowed","horizontalZoom","verticalZoom","zoomIn","zoomOut","panning","mouseArrow","camera","download","loadPromises","button","finally","imagesPrefix","wasPushed","buttonSize","maybeWrap","drawSeparator","imageEl","PROP_AXIS_COUNT","PROP_PLOT_AREA_BACKGROUND_COLOR","PROP_SHOW_LEGEND","PROP_SHOW_PLOT_AREA_BORDER","PROP_SHOW_TOOLBAR","PROP_TITLE","PROP_TITLE_FONT","PROP_TRACE_COUNT","XYGraph","axes","traces","moreProperties","axisCount","traceCount","plotAreaRegion","showToolbar","drawToolbar","drawTitle","drawLegend","plotArea","drawAxes","drawPlotArea","drawZoomSelection","area1","area2","x1a","y1a","x2a","y2a","x1b","y1b","x2b","y2b","intersect","toolbarMargin","toolbarArea","toolbarHeight","titleHeight","combinedXScaleHeight","combinedYScaleWidth","topMargin","axisMargin","leftMargin","xOffset","plotAreaBackgroundColor","showPlotAreaBorder","hZoom","vZoom","iconSize","innerGap","outGap","currentLine","legendWidth","legendHeight","legendArea","topY","midY","maxSize","barX","GroupingContainer","PROP_MINIMUM_TAB_HEIGHT","PROP_ACTIVE_TAB","PROP_HORIZONTAL_TABS","PROP_TAB_COUNT","Tab","headerRegion","activeTab","TabbedContainer","tabs","tabCount","horizontalTabs","drawHorizontalTabs","drawVerticalTabs","measureTabOffset","measureLabelHeight","measureLabelWidth","minimumTabHeight","tab","labelHeight","minimumTabWidth","labelWidth","rectX","rectY","rectHeight","rectFill","darken","contentX","contentY","contentWidth","activeWidget","tabWidth","PROP_COLUMNS_COUNT","PROP_COLUMN_HEADERS","PROP_COLUMN_HEADER_VISIBLE","PROP_DEFAULT_CONTENT","Table","tableWrapper","tableLayout","borderSpacing","borderCollapse","defaultContent","border","generateTableContent","rows","columnHeaderVisible","rowEl","columnsCount","header","columnHeaders","insertCell","overflow","borderBottom","borderLeft","newText","wordWrap","textOverflow","WebBrowser","url","prevUrl","targetElement","repaintRequested","_editMode","_showGrid","_showOutline","_showRuler","_selection","_scale","_transparent","eventListeners","closedisplay","opendisplay","openpv","fontSize","displayRegion","getElementsByTagName","blur","pathResolver","consoleHandler","requestAnimationFrame","setPathResolver","getPathResolver","setConsoleHandler","drawScreen","clientWidth","clientHeight","patternCanvas","patternContext","createPattern","showRuler","showOutline","setSource","reset","setSourceString","err","xo","yo","el","selectionEvent","scaleEvent"],"mappings":"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"}