@peter.prib/renderengine 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -2
  3. package/REFERENCE.md +2198 -0
  4. package/dist/renderengine-workspace.umd.js +46905 -0
  5. package/dist/renderengine.umd.js +42223 -0
  6. package/examples/archimate.html +66 -0
  7. package/examples/diagram-editor.html +51 -0
  8. package/package.json +65 -4
  9. package/src/BaseRenderer.js +57 -0
  10. package/src/CanvasRenderer.js +194 -0
  11. package/src/Mat4.js +111 -0
  12. package/src/OrbitCamera.js +57 -0
  13. package/src/RendererFactory.js +50 -0
  14. package/src/SVGRenderer.js +439 -0
  15. package/src/archimate.js +723 -0
  16. package/src/archimateArchiFormat.js +1693 -0
  17. package/src/archimateArchiTypes.js +72 -0
  18. package/src/archimateArchive.js +140 -0
  19. package/src/archimateCSV.js +127 -0
  20. package/src/archimateDrawio.js +182 -0
  21. package/src/archimateExchangeFormat.js +546 -0
  22. package/src/archimateRelationshipTable.js +93 -0
  23. package/src/archimateSpecializations.js +161 -0
  24. package/src/chartCatalog.js +589 -0
  25. package/src/charting/ArchimateDiagramEditor.js +1624 -0
  26. package/src/charting/ArchimateSpecializationSelector.js +134 -0
  27. package/src/charting/Axis.js +68 -0
  28. package/src/charting/CameraSeeder.js +30 -0
  29. package/src/charting/CatalogDialog.js +92 -0
  30. package/src/charting/Chart.js +37 -0
  31. package/src/charting/Chart3D.js +99 -0
  32. package/src/charting/ChartBox.js +80 -0
  33. package/src/charting/ChartData.js +27 -0
  34. package/src/charting/ChartRegistry.js +76 -0
  35. package/src/charting/CheckboxTreeSelector.js +304 -0
  36. package/src/charting/ColorField.js +107 -0
  37. package/src/charting/ColorPalette.js +88 -0
  38. package/src/charting/CommandHistory.js +176 -0
  39. package/src/charting/DataFilter.js +52 -0
  40. package/src/charting/Diagram.js +36 -0
  41. package/src/charting/Diagram3D.js +29 -0
  42. package/src/charting/DiagramClipboard.js +31 -0
  43. package/src/charting/DiagramEditor.js +3330 -0
  44. package/src/charting/DiagramEditorCommand.js +110 -0
  45. package/src/charting/DiagramEditorCommands.js +237 -0
  46. package/src/charting/DiagramEditorEdgeCommands.js +142 -0
  47. package/src/charting/DiagramEditorState.js +98 -0
  48. package/src/charting/DiagramRegistry.js +86 -0
  49. package/src/charting/DiagramTypeRegistry.js +326 -0
  50. package/src/charting/DiagramViewPropertiesDialog.js +46 -0
  51. package/src/charting/Edge.js +113 -0
  52. package/src/charting/ErrorBars.js +37 -0
  53. package/src/charting/FilterSystem.js +285 -0
  54. package/src/charting/FindReplaceDialog.js +139 -0
  55. package/src/charting/FormDialog.js +385 -0
  56. package/src/charting/Gauge.js +58 -0
  57. package/src/charting/Hierarchy.js +175 -0
  58. package/src/charting/HintPanel.js +86 -0
  59. package/src/charting/ImageSelector.js +148 -0
  60. package/src/charting/InteractionManager.js +725 -0
  61. package/src/charting/Legend.js +58 -0
  62. package/src/charting/MenuBar.js +62 -0
  63. package/src/charting/ModelFileFormat.js +115 -0
  64. package/src/charting/OrbitControls.js +77 -0
  65. package/src/charting/Palette.js +119 -0
  66. package/src/charting/PopupMenu.js +117 -0
  67. package/src/charting/PropertiesPanel.js +155 -0
  68. package/src/charting/PropertyListEditor.js +96 -0
  69. package/src/charting/PropertyLog.js +92 -0
  70. package/src/charting/SettingsCascade.js +93 -0
  71. package/src/charting/SettingsDialog.js +53 -0
  72. package/src/charting/SettingsManager.js +179 -0
  73. package/src/charting/SettingsViewPropertiesDialog.js +58 -0
  74. package/src/charting/ShapePaths.js +27 -0
  75. package/src/charting/Statistics.js +134 -0
  76. package/src/charting/TemplateCatalog.js +59 -0
  77. package/src/charting/TemplateLibrary.js +103 -0
  78. package/src/charting/TextStyle.js +168 -0
  79. package/src/charting/ViewFit.js +55 -0
  80. package/src/charting/ViewMenu.js +70 -0
  81. package/src/charting/ViewPropertiesDialog.js +77 -0
  82. package/src/charting/ViewTabStrip.js +81 -0
  83. package/src/charting/archimate/ArchiFileFormat.js +32 -0
  84. package/src/charting/archimate/ArchimateCanvasEditor.js +815 -0
  85. package/src/charting/archimate/ArchimateCsvFileFormat.js +35 -0
  86. package/src/charting/archimate/ArchimateEdge.js +137 -0
  87. package/src/charting/archimate/ArchimateElementTemplate.js +195 -0
  88. package/src/charting/archimate/ArchimatePalette.js +102 -0
  89. package/src/charting/archimate/CsvImportDialog.js +105 -0
  90. package/src/charting/archimate/CustomViewpoints.js +74 -0
  91. package/src/charting/archimate/DerivedEdge.js +29 -0
  92. package/src/charting/archimate/DrawioFileFormat.js +24 -0
  93. package/src/charting/archimate/ElementFilterRule.js +21 -0
  94. package/src/charting/archimate/ExchangeFileFormat.js +28 -0
  95. package/src/charting/archimate/ViewGroupTemplate.js +137 -0
  96. package/src/charting/archimate/ViewLineEdge.js +84 -0
  97. package/src/charting/archimate/ViewpointRule.js +45 -0
  98. package/src/charting/archimate/archimateFileFormats.js +12 -0
  99. package/src/charting/archimate/archimateNames.js +5 -0
  100. package/src/charting/archimate/csvMapping.js +122 -0
  101. package/src/charting/archimate/elementMenuItems.js +32 -0
  102. package/src/charting/archimate/elementProperties.js +146 -0
  103. package/src/charting/archimate/elementTypeChoices.js +7 -0
  104. package/src/charting/archimate/elementTypeGroups.js +19 -0
  105. package/src/charting/archimate/index.js +17 -0
  106. package/src/charting/archimate/specializationCatalogDialog.js +64 -0
  107. package/src/charting/archimate/typeGlyph.js +29 -0
  108. package/src/charting/arrangement/Arrangement.js +112 -0
  109. package/src/charting/arrangement/ArrangementCommand.js +29 -0
  110. package/src/charting/arrangement/BackgroundCommand.js +41 -0
  111. package/src/charting/arrangement/BackgroundGroup.js +18 -0
  112. package/src/charting/arrangement/GroupCommand.js +46 -0
  113. package/src/charting/arrangement/ItemGroup.js +62 -0
  114. package/src/charting/arrangement/LockCommand.js +32 -0
  115. package/src/charting/arrangement/UngroupCommand.js +27 -0
  116. package/src/charting/arrangement/alignment.js +88 -0
  117. package/src/charting/arrangement/arrangeMenuItems.js +25 -0
  118. package/src/charting/arrangement/index.js +11 -0
  119. package/src/charting/arrangement/layouts.js +233 -0
  120. package/src/charting/canvas/ArchiHint.js +78 -0
  121. package/src/charting/canvas/CanvasBoxKind.js +39 -0
  122. package/src/charting/canvas/CanvasPalette.js +49 -0
  123. package/src/charting/canvas/CanvasTemplateLibrary.js +61 -0
  124. package/src/charting/canvas/CanvasTemplateMenu.js +151 -0
  125. package/src/charting/canvas/EditHintCommand.js +28 -0
  126. package/src/charting/canvas/canvasBoxKinds.js +27 -0
  127. package/src/charting/canvas/canvasBoxMenuItems.js +40 -0
  128. package/src/charting/canvas/defaultCanvasTemplates.js +186 -0
  129. package/src/charting/canvas/diagramBoxKinds.js +12 -0
  130. package/src/charting/canvas/hintMenuItems.js +49 -0
  131. package/src/charting/charts/ArcGauge.js +55 -0
  132. package/src/charting/charts/AreaChart.js +71 -0
  133. package/src/charting/charts/BarChart.js +80 -0
  134. package/src/charting/charts/BarChart3D.js +56 -0
  135. package/src/charting/charts/BarChart3DOrbit.js +53 -0
  136. package/src/charting/charts/BarChartBase.js +70 -0
  137. package/src/charting/charts/BarGauge.js +42 -0
  138. package/src/charting/charts/BoxPlotChart.js +41 -0
  139. package/src/charting/charts/BubbleChart.js +99 -0
  140. package/src/charting/charts/BubbleChart3D.js +78 -0
  141. package/src/charting/charts/BulletGauge.js +87 -0
  142. package/src/charting/charts/CalendarHeatmapChart.js +204 -0
  143. package/src/charting/charts/CandlestickChart.js +54 -0
  144. package/src/charting/charts/ChordDiagram.js +130 -0
  145. package/src/charting/charts/DensityChart.js +73 -0
  146. package/src/charting/charts/DialGauge.js +65 -0
  147. package/src/charting/charts/DonutChart.js +15 -0
  148. package/src/charting/charts/FunnelChart.js +47 -0
  149. package/src/charting/charts/GanttChart.js +201 -0
  150. package/src/charting/charts/GaugeChart.js +175 -0
  151. package/src/charting/charts/GeoMapChart.js +146 -0
  152. package/src/charting/charts/GroupedBarChart.js +88 -0
  153. package/src/charting/charts/GroupedDistributionChart.js +70 -0
  154. package/src/charting/charts/HeatmapChart.js +80 -0
  155. package/src/charting/charts/HierarchyChart.js +39 -0
  156. package/src/charting/charts/HistogramChart.js +45 -0
  157. package/src/charting/charts/KpiTile.js +72 -0
  158. package/src/charting/charts/LagPlotChart.js +41 -0
  159. package/src/charting/charts/LineChart.js +124 -0
  160. package/src/charting/charts/MultiRingGauge.js +54 -0
  161. package/src/charting/charts/OutlineChart.js +95 -0
  162. package/src/charting/charts/ParallelCoordinatesChart.js +130 -0
  163. package/src/charting/charts/PieChart.js +56 -0
  164. package/src/charting/charts/PipeChart.js +88 -0
  165. package/src/charting/charts/PopulationPyramidChart.js +106 -0
  166. package/src/charting/charts/QQPlotChart.js +64 -0
  167. package/src/charting/charts/RadarChart.js +76 -0
  168. package/src/charting/charts/RadialBarChart.js +96 -0
  169. package/src/charting/charts/RingGauge.js +23 -0
  170. package/src/charting/charts/SankeyDiagram.js +174 -0
  171. package/src/charting/charts/ScatterChart.js +104 -0
  172. package/src/charting/charts/StackedAreaChart.js +15 -0
  173. package/src/charting/charts/StackedBarChart.js +33 -0
  174. package/src/charting/charts/StackedBarChart3DOrbit.js +58 -0
  175. package/src/charting/charts/StreamGraphChart.js +131 -0
  176. package/src/charting/charts/SunburstChart.js +57 -0
  177. package/src/charting/charts/ThermometerGauge.js +43 -0
  178. package/src/charting/charts/TreemapChart.js +54 -0
  179. package/src/charting/charts/ViolinChart.js +37 -0
  180. package/src/charting/charts/WaterfallChart.js +66 -0
  181. package/src/charting/charts/WordCloudChart.js +104 -0
  182. package/src/charting/diagramModel/AddViewCommand.js +33 -0
  183. package/src/charting/diagramModel/DiagramModel.js +39 -0
  184. package/src/charting/diagramModel/DiagramModelSearch.js +22 -0
  185. package/src/charting/diagramModel/DiagramView.js +50 -0
  186. package/src/charting/diagramModel/ModelHistory.js +43 -0
  187. package/src/charting/diagramModel/ModelReport.js +153 -0
  188. package/src/charting/diagramModel/ModelSearch.js +223 -0
  189. package/src/charting/diagramModel/RemoveViewCommand.js +25 -0
  190. package/src/charting/diagramModel/RenameViewCommand.js +21 -0
  191. package/src/charting/diagramModel/ReplaceTextCommand.js +25 -0
  192. package/src/charting/diagramModel/ViewSetChecker.js +34 -0
  193. package/src/charting/diagramModel/ViewSetModel.js +243 -0
  194. package/src/charting/diagramModel/index.js +6 -0
  195. package/src/charting/diagramModel/nameTransforms.js +29 -0
  196. package/src/charting/diagrams/ArchimateCommands.js +141 -0
  197. package/src/charting/diagrams/ArchimateDiagram.js +263 -0
  198. package/src/charting/diagrams/ArchimateModel.js +1155 -0
  199. package/src/charting/diagrams/ArchimateModelChecker.js +125 -0
  200. package/src/charting/diagrams/ArchimateModelReport.js +128 -0
  201. package/src/charting/diagrams/ArchimateModelSearch.js +41 -0
  202. package/src/charting/diagrams/ArchimateValidator.js +357 -0
  203. package/src/charting/diagrams/CanvasView.js +112 -0
  204. package/src/charting/diagrams/ContextMenu.js +37 -0
  205. package/src/charting/diagrams/DataModelDiagram.js +86 -0
  206. package/src/charting/diagrams/DataModelRelationshipStrategy.js +38 -0
  207. package/src/charting/diagrams/DerivedRelationships.js +102 -0
  208. package/src/charting/diagrams/EbnfDiagram.js +39 -0
  209. package/src/charting/diagrams/EdgeGeometry.js +553 -0
  210. package/src/charting/diagrams/EditViewItemCommand.js +128 -0
  211. package/src/charting/diagrams/ElementInstance.js +157 -0
  212. package/src/charting/diagrams/GraphDiagram.js +1340 -0
  213. package/src/charting/diagrams/GraphDiagram3D.js +152 -0
  214. package/src/charting/diagrams/GraphMetrics.js +81 -0
  215. package/src/charting/diagrams/GridOverlay.js +137 -0
  216. package/src/charting/diagrams/ImportRowsCommand.js +62 -0
  217. package/src/charting/diagrams/LabelHelper.js +108 -0
  218. package/src/charting/diagrams/MergeElementsCommand.js +101 -0
  219. package/src/charting/diagrams/NestInstanceCommand.js +34 -0
  220. package/src/charting/diagrams/NodeGeometry.js +158 -0
  221. package/src/charting/diagrams/PlaceItemsCommand.js +77 -0
  222. package/src/charting/diagrams/RadialLayout.js +101 -0
  223. package/src/charting/diagrams/RelationshipInstance.js +93 -0
  224. package/src/charting/diagrams/RemoveGroupFromViewCommand.js +28 -0
  225. package/src/charting/diagrams/RemoveLineCommand.js +27 -0
  226. package/src/charting/diagrams/ShowElementCommand.js +43 -0
  227. package/src/charting/diagrams/SvgCoordinate.js +17 -0
  228. package/src/charting/diagrams/SvgZoom.js +127 -0
  229. package/src/charting/diagrams/Tooltip.js +62 -0
  230. package/src/charting/diagrams/ViewConnectionInstance.js +102 -0
  231. package/src/charting/diagrams/ViewObjectInstance.js +56 -0
  232. package/src/charting/diagrams/commands/AddEdgeCommand.js +34 -0
  233. package/src/charting/diagrams/commands/AddNodeCommand.js +28 -0
  234. package/src/charting/diagrams/commands/AddWaypointCommand.js +27 -0
  235. package/src/charting/diagrams/commands/CreateFolderCommand.js +27 -0
  236. package/src/charting/diagrams/commands/DeleteEdgeCommand.js +30 -0
  237. package/src/charting/diagrams/commands/DeleteFolderCommand.js +47 -0
  238. package/src/charting/diagrams/commands/DeleteNodeCommand.js +35 -0
  239. package/src/charting/diagrams/commands/DeleteWaypointCommand.js +24 -0
  240. package/src/charting/diagrams/commands/GraphCommand.js +65 -0
  241. package/src/charting/diagrams/commands/InvertEdgeCommand.js +24 -0
  242. package/src/charting/diagrams/commands/MoveNodeCommand.js +44 -0
  243. package/src/charting/diagrams/commands/MoveWaypointCommand.js +27 -0
  244. package/src/charting/diagrams/commands/RenameEdgeCommand.js +23 -0
  245. package/src/charting/diagrams/commands/RenameFolderCommand.js +31 -0
  246. package/src/charting/diagrams/commands/RenameNodeCommand.js +27 -0
  247. package/src/charting/diagrams/commands/ResizeNodeCommand.js +46 -0
  248. package/src/charting/diagrams/commands/UpdateEdgeSideCommand.js +40 -0
  249. package/src/charting/diagrams/commands/index.js +17 -0
  250. package/src/charting/diagrams/duplicates.js +49 -0
  251. package/src/charting/diagrams/nesting.js +30 -0
  252. package/src/charting/diagrams/roadmap.js +77 -0
  253. package/src/charting/edgeMarkers/ArrowMarker.js +15 -0
  254. package/src/charting/edgeMarkers/CircleMarker.js +13 -0
  255. package/src/charting/edgeMarkers/CrowsFootMarker.js +16 -0
  256. package/src/charting/edgeMarkers/DiamondMarker.js +15 -0
  257. package/src/charting/edgeMarkers/EdgeMarker.js +34 -0
  258. package/src/charting/edgeMarkers/HalfArrowMarker.js +8 -0
  259. package/src/charting/edgeMarkers/HollowDiamondMarker.js +18 -0
  260. package/src/charting/edgeMarkers/HollowTriangleMarker.js +18 -0
  261. package/src/charting/edgeMarkers/OpenArrowMarker.js +17 -0
  262. package/src/charting/edgeMarkers/index.js +27 -0
  263. package/src/charting/edgeStyle/EdgeStyleCascade.js +22 -0
  264. package/src/charting/edgeStyle/EdgeStyleDialog.js +51 -0
  265. package/src/charting/edgeStyle/EdgeStyleSchema.js +43 -0
  266. package/src/charting/edgeStyle/SetStyleCommand.js +12 -0
  267. package/src/charting/edgeStyle/index.js +4 -0
  268. package/src/charting/emphasis/EmphasisRule.js +42 -0
  269. package/src/charting/emphasis/HighlightRule.js +24 -0
  270. package/src/charting/gauges/ArcTrack.js +51 -0
  271. package/src/charting/gauges/GaugeAnimation.js +51 -0
  272. package/src/charting/gauges/GaugeBands.js +48 -0
  273. package/src/charting/gauges/GaugeScale.js +87 -0
  274. package/src/charting/gauges/GaugeTrack.js +44 -0
  275. package/src/charting/gauges/GaugeValue.js +61 -0
  276. package/src/charting/gauges/HorizontalTrack.js +14 -0
  277. package/src/charting/gauges/LinearTrack.js +29 -0
  278. package/src/charting/gauges/Sparkline.js +42 -0
  279. package/src/charting/gauges/VerticalTrack.js +17 -0
  280. package/src/charting/glyphs/ArrowGlyph.js +21 -0
  281. package/src/charting/glyphs/BatteryGlyph.js +18 -0
  282. package/src/charting/glyphs/ChevronGlyph.js +18 -0
  283. package/src/charting/glyphs/CircleGlyph.js +15 -0
  284. package/src/charting/glyphs/CloudGlyph.js +19 -0
  285. package/src/charting/glyphs/ComponentGlyph.js +18 -0
  286. package/src/charting/glyphs/ConstraintGlyph.js +24 -0
  287. package/src/charting/glyphs/ContractBoxGlyph.js +10 -0
  288. package/src/charting/glyphs/CubeGlyph.js +19 -0
  289. package/src/charting/glyphs/CylinderGlyph.js +19 -0
  290. package/src/charting/glyphs/DashedDoubleArrowGlyph.js +11 -0
  291. package/src/charting/glyphs/DeviceGlyph.js +17 -0
  292. package/src/charting/glyphs/DiamondGlyph.js +17 -0
  293. package/src/charting/glyphs/DocumentGlyph.js +17 -0
  294. package/src/charting/glyphs/DoubleArrowGlyph.js +23 -0
  295. package/src/charting/glyphs/DoubleCircleGlyph.js +24 -0
  296. package/src/charting/glyphs/EllipseGlyph.js +18 -0
  297. package/src/charting/glyphs/FactoryGlyph.js +20 -0
  298. package/src/charting/glyphs/FlagGlyph.js +16 -0
  299. package/src/charting/glyphs/GapCircleGlyph.js +17 -0
  300. package/src/charting/glyphs/GearGlyph.js +37 -0
  301. package/src/charting/glyphs/Glyph.js +98 -0
  302. package/src/charting/glyphs/GroupingBoxGlyph.js +13 -0
  303. package/src/charting/glyphs/HalfCircleGlyph.js +22 -0
  304. package/src/charting/glyphs/HexagonGlyph.js +28 -0
  305. package/src/charting/glyphs/IconGlyph.js +22 -0
  306. package/src/charting/glyphs/ImageGlyph.js +16 -0
  307. package/src/charting/glyphs/JunctionGlyph.js +17 -0
  308. package/src/charting/glyphs/LollipopGlyph.js +22 -0
  309. package/src/charting/glyphs/MagnifierGlyph.js +17 -0
  310. package/src/charting/glyphs/NoteGlyph.js +33 -0
  311. package/src/charting/glyphs/ObjectBoxGlyph.js +21 -0
  312. package/src/charting/glyphs/OrJunctionGlyph.js +17 -0
  313. package/src/charting/glyphs/ParallelogramGlyph.js +20 -0
  314. package/src/charting/glyphs/PersonGlyph.js +23 -0
  315. package/src/charting/glyphs/PillGlyph.js +23 -0
  316. package/src/charting/glyphs/PinGlyph.js +18 -0
  317. package/src/charting/glyphs/PrincipleGlyph.js +23 -0
  318. package/src/charting/glyphs/ProductBoxGlyph.js +16 -0
  319. package/src/charting/glyphs/RectGlyph.js +15 -0
  320. package/src/charting/glyphs/RoundedBoxGlyph.js +13 -0
  321. package/src/charting/glyphs/StackGlyph.js +14 -0
  322. package/src/charting/glyphs/StepsGlyph.js +20 -0
  323. package/src/charting/glyphs/StickFigureGlyph.js +32 -0
  324. package/src/charting/glyphs/SystemSoftwareBoxGlyph.js +16 -0
  325. package/src/charting/glyphs/TabbedBoxGlyph.js +37 -0
  326. package/src/charting/glyphs/TargetGlyph.js +23 -0
  327. package/src/charting/glyphs/WavyBoxGlyph.js +17 -0
  328. package/src/charting/glyphs/WheelGlyph.js +28 -0
  329. package/src/charting/glyphs/drawGlyph.js +28 -0
  330. package/src/charting/glyphs/glyphSvg.js +55 -0
  331. package/src/charting/glyphs/index.js +109 -0
  332. package/src/charting/modelTree/AnalysisPanel.js +159 -0
  333. package/src/charting/modelTree/DiagramTabs.js +217 -0
  334. package/src/charting/modelTree/ModelTree.js +164 -0
  335. package/src/charting/modelTree/ModelTreePanel.js +914 -0
  336. package/src/charting/modelTree/TreeBuilder.js +238 -0
  337. package/src/charting/modelTree/TreeModeRegistry.js +51 -0
  338. package/src/charting/modelTree/TreeViewMode.js +110 -0
  339. package/src/charting/modelTree/buildFilterTrees.js +138 -0
  340. package/src/charting/modelTree/modes/FlatTreeMode.js +46 -0
  341. package/src/charting/modelTree/modes/LayerGroupedTreeMode.js +62 -0
  342. package/src/charting/modelTree/modes/TypeGroupedTreeMode.js +60 -0
  343. package/src/charting/modelTree/treeLayers.js +11 -0
  344. package/src/charting/report/reportHtml.js +82 -0
  345. package/src/charting/report/reportViewer.js +118 -0
  346. package/src/charting/shapes/CircleShape.js +19 -0
  347. package/src/charting/shapes/PathShape.js +17 -0
  348. package/src/charting/shapes/RectShape.js +20 -0
  349. package/src/charting/shapes/Shape.js +20 -0
  350. package/src/charting/shapes/ShapeFactory.js +23 -0
  351. package/src/charting/storage/LocalJsonStore.js +43 -0
  352. package/src/charting/templates/ActorTemplate.js +36 -0
  353. package/src/charting/templates/BoxTemplate.js +27 -0
  354. package/src/charting/templates/CircleTemplate.js +18 -0
  355. package/src/charting/templates/ClassTemplate.js +20 -0
  356. package/src/charting/templates/CloudTemplate.js +43 -0
  357. package/src/charting/templates/ComponentTemplate.js +19 -0
  358. package/src/charting/templates/CylinderTemplate.js +30 -0
  359. package/src/charting/templates/DataStoreTemplate.js +16 -0
  360. package/src/charting/templates/DiamondTemplate.js +10 -0
  361. package/src/charting/templates/DocumentTemplate.js +32 -0
  362. package/src/charting/templates/EllipseTemplate.js +15 -0
  363. package/src/charting/templates/FinalStateTemplate.js +12 -0
  364. package/src/charting/templates/GlyphTemplate.js +47 -0
  365. package/src/charting/templates/HexagonTemplate.js +17 -0
  366. package/src/charting/templates/LifelineTemplate.js +20 -0
  367. package/src/charting/templates/ManualInputTemplate.js +12 -0
  368. package/src/charting/templates/NoteTemplate.js +23 -0
  369. package/src/charting/templates/OctagonTemplate.js +7 -0
  370. package/src/charting/templates/PackageTemplate.js +25 -0
  371. package/src/charting/templates/ParallelogramTemplate.js +11 -0
  372. package/src/charting/templates/PentagonTemplate.js +5 -0
  373. package/src/charting/templates/PolygonTemplate.js +18 -0
  374. package/src/charting/templates/PredefinedProcessTemplate.js +13 -0
  375. package/src/charting/templates/RectangleTemplate.js +28 -0
  376. package/src/charting/templates/RegularPolygonTemplate.js +21 -0
  377. package/src/charting/templates/RoundedRectangleTemplate.js +5 -0
  378. package/src/charting/templates/StadiumTemplate.js +8 -0
  379. package/src/charting/templates/StarTemplate.js +17 -0
  380. package/src/charting/templates/SwimlaneTemplate.js +18 -0
  381. package/src/charting/templates/Template.js +208 -0
  382. package/src/charting/templates/TrapezoidTemplate.js +11 -0
  383. package/src/charting/templates/TriangleTemplate.js +12 -0
  384. package/src/charting/templates/index.js +31 -0
  385. package/src/charting/templates/outline.js +59 -0
  386. package/src/charting/templates/svg.js +19 -0
  387. package/src/charting/textToShapes.js +61 -0
  388. package/src/charting/toolbar/ToolbarButton.js +38 -0
  389. package/src/charting/toolbar/ToolbarCheckbox.js +31 -0
  390. package/src/charting/toolbar/ToolbarItem.js +19 -0
  391. package/src/charting/toolbar/ToolbarMenu.js +36 -0
  392. package/src/charting/toolbar/ToolbarSelect.js +38 -0
  393. package/src/charting/toolbar/ToolbarSeparator.js +7 -0
  394. package/src/charting/toolbar/ToolbarText.js +22 -0
  395. package/src/charting/toolbar/index.js +8 -0
  396. package/src/charting/toolbar/pickFile.js +14 -0
  397. package/src/charting/viewDecorations.js +85 -0
  398. package/src/charting/zOrder.js +57 -0
  399. package/src/csvTable.js +61 -0
  400. package/src/datamodel.js +122 -0
  401. package/src/datawindow/BoundedWindow.js +36 -0
  402. package/src/datawindow/FlatDataWindow.js +34 -0
  403. package/src/datawindow/GraphDataWindow.js +40 -0
  404. package/src/datawindow/GroupedSampleDataWindow.js +16 -0
  405. package/src/datawindow/SeriesDataWindow.js +42 -0
  406. package/src/datawindow/index.js +31 -0
  407. package/src/diagramCatalog.js +30 -0
  408. package/src/ebnfDiagram.js +57 -0
  409. package/src/ebnfParser.js +129 -0
  410. package/src/exportImage.js +233 -0
  411. package/src/index.js +2636 -0
  412. package/src/itIcons.js +84 -0
  413. package/src/kernelExpr.js +243 -0
  414. package/src/propertiesDialog.js +463 -0
  415. package/src/railroadDiagram.js +571 -0
  416. package/src/treeModeCatalog.js +16 -0
  417. package/src/workspace/ContextBus.js +79 -0
  418. package/src/workspace/EditorShell.js +67 -0
  419. package/src/workspace/Part.js +163 -0
  420. package/src/workspace/PartFactory.js +49 -0
  421. package/src/workspace/PartRegistry.js +86 -0
  422. package/src/workspace/Workspace.js +321 -0
  423. package/src/workspace/archimateServices.js +33 -0
  424. package/src/workspace/dom.js +120 -0
  425. package/src/workspace/index.js +75 -0
  426. package/src/workspace/layout/GridNode.js +280 -0
  427. package/src/workspace/layout/LayoutNode.js +89 -0
  428. package/src/workspace/layout/PartNode.js +77 -0
  429. package/src/workspace/layout/SplitNode.js +114 -0
  430. package/src/workspace/layout/TabsNode.js +191 -0
  431. package/src/workspace/layout/index.js +24 -0
  432. package/src/workspace/parts/AdapterPart.js +33 -0
  433. package/src/workspace/parts/ArchimateCanvasPart.js +345 -0
  434. package/src/workspace/parts/ArchimateEditorPart.js +79 -0
  435. package/src/workspace/parts/ChartPart.js +115 -0
  436. package/src/workspace/parts/ContentPart.js +34 -0
  437. package/src/workspace/parts/DetailPart.js +46 -0
  438. package/src/workspace/parts/DiagramEditorPart.js +135 -0
  439. package/src/workspace/parts/EditorPart.js +388 -0
  440. package/src/workspace/parts/HtmlPart.js +25 -0
  441. package/src/workspace/parts/ListPart.js +57 -0
  442. package/src/workspace/parts/ModelFile.js +187 -0
  443. package/src/workspace/parts/ModelsPart.js +135 -0
  444. package/src/workspace/styles.js +258 -0
  445. package/src/workspace/themes.js +96 -0
  446. package/src/workspace/workArea.js +413 -0
  447. package/src/workspace/workAreaModel.js +197 -0
  448. package/src/workspace.js +16 -0
  449. package/src/zip/ZipArchive.js +160 -0
  450. package/src/zip/crc32.js +25 -0
  451. package/src/zip/inflate.js +159 -0
@@ -0,0 +1,223 @@
1
+ import { ReplaceTextCommand } from './ReplaceTextCommand.js';
2
+ import { Command } from '../CommandHistory.js';
3
+ import { transformName, NAME_TRANSFORMS } from './nameTransforms.js';
4
+
5
+ /** What can be looked in, in the order a dialog offers them: [field, label]. */
6
+ export const SEARCH_FIELDS = Object.freeze([['name', 'Names'], ['documentation', 'Documentation'], ['property', 'Property values']]);
7
+
8
+ /**
9
+ * ModelSearch — find and replace over a model's texts (Archi's Find/Replace):
10
+ * every name, documentation and property value, each a target
11
+ * `{ kind, id, viewId?, owner, field, fieldLabel, required?, read(), write(text) }`
12
+ * (`owner` names what it belongs to; `required` text can't be emptied).
13
+ *
14
+ * Here, what every view set has: the model's own name, documentation and
15
+ * properties, and each view's title, documentation and properties. A
16
+ * notation's model returns a subclass from `model.search()` that adds what its
17
+ * views hold (`viewItemTargets(view)`: shapes, notes) and its own concepts
18
+ * (`conceptTargets()`: elements, relationships). DOM-free.
19
+ *
20
+ * Options, for find and replace alike: `{ matchCase, wholeWord, regex, fields }`,
21
+ * `fields` among SEARCH_FIELDS' keys (default all).
22
+ */
23
+ export class ModelSearch {
24
+ /** @param {ViewSetModel} model */
25
+ constructor(model) {
26
+ this.model = model;
27
+ }
28
+
29
+ /** Every text in the model, in order: the model's, then each view's and what it holds, then the concepts'. */
30
+ targets() {
31
+ return [
32
+ ...this.modelTargets(),
33
+ ...this.model.views().flatMap(view => [...this.viewTargets(view), ...this.viewItemTargets(view)]),
34
+ ...this.conceptTargets(),
35
+ ];
36
+ }
37
+
38
+ /** The model's own name (when it has one), documentation and properties. */
39
+ modelTargets() {
40
+ const model = this.model;
41
+ const owner = { kind: 'model', id: model.id ?? 'model', owner: model.name || 'Model' };
42
+ return [
43
+ ...(typeof model.name === 'string' ? [this.text(owner, 'name', model, 'name')] : []),
44
+ this.text(owner, 'documentation', model, 'documentation'),
45
+ ...this.propertyTargets(owner, model.properties),
46
+ ];
47
+ }
48
+
49
+ /** A view's title (retitled through the model, so tabs follow; never emptied), documentation and properties. */
50
+ viewTargets(view) {
51
+ const owner = { kind: 'view', id: view.id, viewId: view.id, owner: view.title || view.name || view.id };
52
+ return [
53
+ {
54
+ ...owner, field: 'name', fieldLabel: 'Name', required: true,
55
+ read: () => view.title ?? '',
56
+ write: (text) => { this.model._retitle(view.id, text); },
57
+ },
58
+ this.text(owner, 'documentation', view, 'documentation'),
59
+ ...this.propertyTargets(owner, view.properties),
60
+ ];
61
+ }
62
+
63
+ /** What a view holds that has its own text: none here. */
64
+ viewItemTargets(view) {
65
+ return [];
66
+ }
67
+
68
+ /** A notation's own concepts' texts: none here. */
69
+ conceptTargets() {
70
+ return [];
71
+ }
72
+
73
+ /**
74
+ * The texts that match, each `{ ...target, target, text, count }` (`text`
75
+ * as it is now, `count` how many times it matches).
76
+ * @throws {SyntaxError} for an invalid regular expression
77
+ */
78
+ find(text, options = {}) {
79
+ const pattern = ModelSearch.pattern(text, options);
80
+ if (!pattern) return [];
81
+ const fields = new Set(options.fields ?? SEARCH_FIELDS.map(([f]) => f));
82
+ return this.targets()
83
+ .filter(t => fields.has(t.field))
84
+ .map(target => {
85
+ const current = String(target.read() ?? '');
86
+ const count = current.match(pattern)?.length ?? 0;
87
+ const { read, write, ...about } = target;
88
+ return { ...about, target, text: current, count };
89
+ })
90
+ .filter(m => m.count);
91
+ }
92
+
93
+ /**
94
+ * Replace every match (or those of `matches`, from find) as one
95
+ * ReplaceTextCommand, not yet executed; null when nothing would change.
96
+ * With `regex`, `$1` and the like in `replacement` refer to its groups.
97
+ */
98
+ replaceCommand(text, replacement, options = {}, matches = this.find(text, options)) {
99
+ const pattern = ModelSearch.pattern(text, options);
100
+ if (!pattern) return null;
101
+ const changes = matches
102
+ .map(({ target }) => {
103
+ const before = String(target.read() ?? '');
104
+ const after = options.regex ? before.replace(pattern, replacement) : before.replace(pattern, () => replacement);
105
+ return { target, before, after };
106
+ })
107
+ .filter(c => c.after !== c.before && !(c.target.required && !c.after.trim()));
108
+ return changes.length ? new ReplaceTextCommand(changes, `Replace "${text}" (${changes.length})`) : null;
109
+ }
110
+
111
+ /**
112
+ * Rewrite names (nameTransforms.js: Title Case, split camelCase, ...): every
113
+ * name, or those containing `text` (with find's options), as one
114
+ * ReplaceTextCommand, not yet executed; null when nothing changes. A view
115
+ * is never left without a name.
116
+ * @param {string} transform - One of NAME_TRANSFORMS' keys
117
+ */
118
+ transformCommand(transform, text = '', options = {}) {
119
+ const targets = text
120
+ ? this.find(text, { ...options, fields: ['name'] }).map(m => m.target)
121
+ : this.targets().filter(t => t.field === 'name');
122
+ const changes = targets
123
+ .map(target => { const before = String(target.read() ?? ''); return { target, before, after: transformName(transform, before) }; })
124
+ .filter(c => c.after !== c.before && !(c.target.required && !c.after.trim()));
125
+ const label = NAME_TRANSFORMS.find(([k]) => k === transform)?.[1].split(' (')[0] ?? transform;
126
+ return changes.length ? new ReplaceTextCommand(changes, `${label} (${changes.length})`) : null;
127
+ }
128
+
129
+ /**
130
+ * What holds properties (`[{name|key, value}]` lists): the model and its
131
+ * views here; a notation's search adds its concepts.
132
+ * @returns {Array<{owner: string, properties: Array}>}
133
+ */
134
+ propertyHolders() {
135
+ return [{ owner: 'model', object: this.model }, ...this.model.views().map(v => ({ owner: `view ${v.id}`, object: v }))];
136
+ }
137
+
138
+ /** Every property name in use, sorted. */
139
+ propertyNames() {
140
+ const names = new Set();
141
+ for (const { object } of this.propertyHolders()) for (const p of Array.isArray(object.properties) ? object.properties : []) if (p.name ?? p.key) names.add(p.name ?? p.key);
142
+ return [...names].sort((a, b) => a.localeCompare(b));
143
+ }
144
+
145
+ /**
146
+ * Rename a property everywhere it is (Rename property…): one command, not
147
+ * yet executed; null when nothing has it. Where something has both names,
148
+ * the old one's value goes to the new one only where the new one is empty.
149
+ */
150
+ renamePropertyCommand(from, to) {
151
+ const holders = this.propertyHolders().filter(({ object }) => Array.isArray(object.properties) && object.properties.some(p => (p.name ?? p.key) === from));
152
+ if (!from || !to || from === to || !holders.length) return null;
153
+ return new PropertyRenameCommand(holders.map(h => h.object), from, to);
154
+ }
155
+
156
+ /**
157
+ * An object's own text field as a target; an emptied text is unset.
158
+ * @protected
159
+ */
160
+ text(owner, field, object, key = field) {
161
+ return {
162
+ ...owner, field, fieldLabel: field === 'name' ? 'Name' : 'Documentation',
163
+ read: () => object[key] ?? '',
164
+ write: (text) => { object[key] = text === '' && field !== 'name' ? undefined : text; },
165
+ };
166
+ }
167
+
168
+ /**
169
+ * Each property whose value is text, as a target (`[{name|key, value, type?}]`;
170
+ * a number or true/false is left out).
171
+ * @protected
172
+ */
173
+ propertyTargets(owner, properties) {
174
+ if (!Array.isArray(properties)) return [];
175
+ return properties
176
+ .filter(p => p.value == null || typeof p.value === 'string')
177
+ .map(p => ({
178
+ ...owner, field: 'property', fieldLabel: `Property "${p.name ?? p.key}"`,
179
+ read: () => p.value ?? '',
180
+ write: (text) => { p.value = text; },
181
+ }));
182
+ }
183
+
184
+ /**
185
+ * The pattern for `text` (global): literal unless `regex`, whole words with
186
+ * `wholeWord`, any case unless `matchCase`. Null for empty text.
187
+ * @throws {SyntaxError} for an invalid regular expression
188
+ */
189
+ static pattern(text, { matchCase = false, wholeWord = false, regex = false } = {}) {
190
+ if (!text) return null;
191
+ const source = regex ? text : text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
192
+ return new RegExp(wholeWord ? `\\b(?:${source})\\b` : source, matchCase ? 'g' : 'gi');
193
+ }
194
+ }
195
+
196
+ /** Rename a property on some objects (their property lists), one undo step: as ModelSearch#renamePropertyCommand says. */
197
+ class PropertyRenameCommand extends Command {
198
+ constructor(objects, from, to) {
199
+ super(`Rename property "${from}" to "${to}"`);
200
+ Object.assign(this, { objects, from, to, _before: null });
201
+ }
202
+
203
+ execute() {
204
+ const nameOf = (p) => p.name ?? p.key;
205
+ this._before = this.objects.map(o => [o, o.properties]);
206
+ for (const object of this.objects) {
207
+ const list = object.properties.map(p => ({ ...p }));
208
+ const old = list.find(p => nameOf(p) === this.from);
209
+ const existing = list.find(p => nameOf(p) === this.to);
210
+ if (existing) {
211
+ if ((existing.value ?? '') === '') existing.value = old.value;
212
+ object.properties = list.filter(p => p !== old);
213
+ } else {
214
+ if ('name' in old) old.name = this.to; else old.key = this.to;
215
+ object.properties = list;
216
+ }
217
+ }
218
+ }
219
+
220
+ undo() {
221
+ for (const [object, properties] of this._before) object.properties = properties;
222
+ }
223
+ }
@@ -0,0 +1,25 @@
1
+ import { Command } from '../CommandHistory.js';
2
+
3
+ /**
4
+ * RemoveViewCommand — a view deleted from a model; its neighbour comes to
5
+ * the front when it was. Undo puts the same view back where it was, shown
6
+ * again if it was in front.
7
+ */
8
+ export class RemoveViewCommand extends Command {
9
+ viewId = null;
10
+
11
+ constructor(model, view, label = `Delete "${view.title || view.name || view.id}"`) {
12
+ super(label);
13
+ this.model = model;
14
+ this.view = view;
15
+ this._was = null;
16
+ }
17
+
18
+ execute() {
19
+ this._was = this.model._removeView(this.view.id);
20
+ }
21
+
22
+ undo() {
23
+ this.model._insertView(this.view, this._was);
24
+ }
25
+ }
@@ -0,0 +1,21 @@
1
+ import { Command } from '../CommandHistory.js';
2
+
3
+ /** RenameViewCommand — a view's title changed; undo gives it back its old one. */
4
+ export class RenameViewCommand extends Command {
5
+ constructor(model, view, title, label = `Rename "${view.title}"`) {
6
+ super(label);
7
+ this.model = model;
8
+ this.view = view;
9
+ this.title = title;
10
+ this.before = view.title;
11
+ this.viewId = view.id;
12
+ }
13
+
14
+ execute() {
15
+ this.model._retitle(this.view.id, this.title);
16
+ }
17
+
18
+ undo() {
19
+ this.model._retitle(this.view.id, this.before);
20
+ }
21
+ }
@@ -0,0 +1,25 @@
1
+ import { Command } from '../CommandHistory.js';
2
+
3
+ /**
4
+ * ReplaceTextCommand — texts replaced across a model (ModelSearch#replaceCommand)
5
+ * as one undo step: each change is `{ target, before, after }`, a target being
6
+ * one of ModelSearch's texts (its `write(text)` puts it in place).
7
+ */
8
+ export class ReplaceTextCommand extends Command {
9
+ /**
10
+ * @param {Array<{target: Object, before: string, after: string}>} changes
11
+ * @param {string} [label]
12
+ */
13
+ constructor(changes, label = 'Replace') {
14
+ super(label);
15
+ this.changes = changes.slice();
16
+ }
17
+
18
+ execute() {
19
+ for (const { target, after } of this.changes) target.write(after);
20
+ }
21
+
22
+ undo() {
23
+ for (let i = this.changes.length - 1; i >= 0; i--) this.changes[i].target.write(this.changes[i].before);
24
+ }
25
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * ViewSetChecker — checks over any ViewSetModel (a template editor's
3
+ * DiagramModel, an ArchimateModel): what is wrong or worth a look across its
4
+ * views. A notation adds its own checks in a subclass (ArchimateModelChecker).
5
+ * DOM-free and advisory.
6
+ *
7
+ * Each finding: `{ code, severity: 'warning'|'info', message, kind, ids }`;
8
+ * `kind` says what the ids name ('view' here; a subclass adds its own).
9
+ * Each check is a method listed by `checks()`, so a subclass can add, drop or
10
+ * reorder them.
11
+ */
12
+ export class ViewSetChecker {
13
+ /** @param {ViewSetModel} model */
14
+ constructor(model) {
15
+ this.model = model;
16
+ }
17
+
18
+ /** The checks to run, in the order their findings are listed. */
19
+ checks() {
20
+ return [this.emptyViews];
21
+ }
22
+
23
+ /** Every finding. @returns {Array<Object>} */
24
+ run() {
25
+ return this.checks().flatMap(check => check.call(this));
26
+ }
27
+
28
+ /** Views with nothing on them (a template is left out: an empty one is still a start). */
29
+ emptyViews() {
30
+ return this.model.views()
31
+ .filter(v => !v.template && v.isEmpty())
32
+ .map(v => ({ code: 'empty-view', severity: 'info', kind: 'view', ids: [v.id], message: `View "${v.title || v.name || v.id}" is empty` }));
33
+ }
34
+ }
@@ -0,0 +1,243 @@
1
+ import { ViewSetChecker } from './ViewSetChecker.js';
2
+ import { ModelReport } from './ModelReport.js';
3
+ import { ModelSearch } from './ModelSearch.js';
4
+ import { ModelHistory } from './ModelHistory.js';
5
+ import { AddViewCommand } from './AddViewCommand.js';
6
+ import { RemoveViewCommand } from './RemoveViewCommand.js';
7
+ import { RenameViewCommand } from './RenameViewCommand.js';
8
+
9
+ /**
10
+ * ViewSetModel — a model edited as several views (diagrams), with one current.
11
+ * Owns what every such model does with its views: create, duplicate, rename,
12
+ * delete, switch, and telling listeners after each change, so a UI only has to
13
+ * re-render on notification. It has one undo history (`history`, a
14
+ * ModelHistory, as Archi has one command stack per model) that every view of
15
+ * it shares: adding, renaming and deleting views are undoable steps on it too.
16
+ *
17
+ * Subclasses make their own kind of view through `_newView(id, title)`; a view
18
+ * has an `id`, a `title`, and `copy(id, title)` for duplication. DiagramModel
19
+ * (the template editor) and ArchimateModel extend it.
20
+ */
21
+ export class ViewSetModel {
22
+ /**
23
+ * @param {Object} [options]
24
+ * @param {string} [options.idPrefix] - Prefix for generated view ids
25
+ * @param {string} [options.viewNoun] - What a view is called in default titles ('Diagram', 'View')
26
+ */
27
+ constructor({ idPrefix = 'view', viewNoun = 'View' } = {}) {
28
+ if (new.target === ViewSetModel) throw new TypeError('ViewSetModel is abstract — subclass it');
29
+ /** @type {Map<string, Object>} in tab order */
30
+ this._views = new Map();
31
+ this.currentViewId = null;
32
+ this.idPrefix = idPrefix;
33
+ this.viewNoun = viewNoun;
34
+ this._nextId = 1;
35
+ this._listeners = [];
36
+ /** Bumped by every change to the set of views (new, duplicated, renamed, deleted). */
37
+ this._structure = 0;
38
+ this._saved = null;
39
+ this._editListeners = [];
40
+ this._watched = new WeakSet();
41
+ }
42
+
43
+ /** The model's one undo history, which every view of it shares (ModelHistory). */
44
+ get history() {
45
+ return (this._history ??= new ModelHistory(this, this.historyOptions ?? {}));
46
+ }
47
+
48
+ /** Make a view one of this model's: its edits go on the model's history. @protected */
49
+ _adopt(view) {
50
+ view.history = this.history;
51
+ return view;
52
+ }
53
+
54
+ // ===== Saved or not =====
55
+
56
+ /** Remember this state as the saved one (after opening or saving a file). */
57
+ markSaved() {
58
+ this._saved = { structure: this._structure, token: this.history.stateToken };
59
+ this._emitEdit();
60
+ }
61
+
62
+ /**
63
+ * Whether anything changed since markSaved: an edit on the model's history
64
+ * (any view's, or to the views themselves) not undone back again.
65
+ */
66
+ isDirty() {
67
+ const saved = this._saved ?? { structure: 0, token: 0 };
68
+ return this._structure !== saved.structure || this.history.stateToken !== saved.token;
69
+ }
70
+
71
+ /** Call `fn(model)` after every edit (any view's history, or the set of views). Returns an unsubscribe function. */
72
+ onEdit(fn) {
73
+ this._editListeners.push(fn);
74
+ this._watchHistories();
75
+ return () => { this._editListeners = this._editListeners.filter(l => l !== fn); };
76
+ }
77
+
78
+ /** Listen to the model's history (and any view's own, for one not adopted). @private */
79
+ _watchHistories() {
80
+ for (const history of [this.history, ...this.views().map(v => v.history)]) {
81
+ if (!history?.onChange || this._watched.has(history)) continue;
82
+ this._watched.add(history);
83
+ history.onChange(() => this._emitEdit());
84
+ }
85
+ }
86
+
87
+ /** @private */
88
+ _emitEdit() {
89
+ for (const fn of this._editListeners) fn(this);
90
+ }
91
+
92
+ /** A new, empty view of this model's kind. @protected */
93
+ _newView(id, title) {
94
+ throw new Error(`${this.constructor.name} must implement _newView()`);
95
+ }
96
+
97
+ /** Subscribe to changes; returns an unsubscribe function. */
98
+ onChange(fn) {
99
+ this._listeners.push(fn);
100
+ return () => { this._listeners = this._listeners.filter(l => l !== fn); };
101
+ }
102
+
103
+ /** All views, in order. */
104
+ views() {
105
+ return [...this._views.values()];
106
+ }
107
+
108
+ get viewCount() {
109
+ return this._views.size;
110
+ }
111
+
112
+ get currentView() {
113
+ return this._views.get(this.currentViewId) ?? null;
114
+ }
115
+
116
+ getView(id) {
117
+ return this._views.get(id) ?? null;
118
+ }
119
+
120
+ /** Title offered for the next new view. */
121
+ nextViewTitle() {
122
+ return `${this.viewNoun} ${this._views.size + 1}`;
123
+ }
124
+
125
+ /** Add an empty view and make it current. */
126
+ createView(title = this.nextViewTitle()) {
127
+ return this._add(this._newView(this._newId(), title));
128
+ }
129
+
130
+ /** Add an independent copy of a view and make it current. */
131
+ duplicateView(id) {
132
+ const original = this._views.get(id);
133
+ if (!original) return null;
134
+ return this._add(original.copy(this._newId(), `${original.title} (copy)`));
135
+ }
136
+
137
+ /** Give a view a new title (not an empty one). One undo step. */
138
+ renameView(id, title) {
139
+ const view = this._views.get(id);
140
+ if (!view || !title || title === view.title) return false;
141
+ this.history.execute(new RenameViewCommand(this, view, title));
142
+ return true;
143
+ }
144
+
145
+ /** A view's title set, as RenameViewCommand and replace do it (not undoable by itself). @protected */
146
+ _retitle(id, title) {
147
+ const view = this._views.get(id);
148
+ if (!view) return;
149
+ view.title = title;
150
+ this._notify();
151
+ }
152
+
153
+ /** The checks this model is held to (ViewSetChecker; a notation's model returns its own). */
154
+ checker() {
155
+ return new ViewSetChecker(this);
156
+ }
157
+
158
+ /** Find and replace over the model's texts (ModelSearch; a notation's model returns its own). */
159
+ search() {
160
+ return new ModelSearch(this);
161
+ }
162
+
163
+ /** The model's report (ModelReport; a notation's model returns its own), for reportHtml. */
164
+ report(options) {
165
+ return new ModelReport(this, options);
166
+ }
167
+
168
+ /** Whether a view may be deleted: the last one stays. */
169
+ canDeleteView(id) {
170
+ return this._views.has(id) && this._views.size > 1;
171
+ }
172
+
173
+ /** Remove a view; the last one cannot be removed. The neighbour becomes current. One undo step. */
174
+ deleteView(id) {
175
+ if (!this.canDeleteView(id)) return false;
176
+ this.history.execute(new RemoveViewCommand(this, this._views.get(id)));
177
+ return true;
178
+ }
179
+
180
+ switchTo(id) {
181
+ if (!this._views.has(id) || id === this.currentViewId) return false;
182
+ this.currentViewId = id;
183
+ this._notify();
184
+ return true;
185
+ }
186
+
187
+ /**
188
+ * Add a view (last), shown unless `current` is false: one undo step on the
189
+ * model's history (AddViewCommand).
190
+ * @protected
191
+ */
192
+ _add(view, { current = true } = {}) {
193
+ this.history.execute(new AddViewCommand(this, this._adopt(view), { current }));
194
+ return view;
195
+ }
196
+
197
+ /**
198
+ * Put a view in the model at `index` (default last), current if asked; as
199
+ * AddViewCommand and RemoveViewCommand's undo do it.
200
+ * @protected
201
+ */
202
+ _insertView(view, { index = this._views.size, current = true } = {}) {
203
+ const entries = [...this._views].filter(([id]) => id !== view.id);
204
+ entries.splice(Math.min(index, entries.length), 0, [view.id, view]);
205
+ this._views = new Map(entries);
206
+ if (current || !this.currentViewId) this.currentViewId = view.id;
207
+ this._notify();
208
+ }
209
+
210
+ /**
211
+ * Take a view out of the model; the one in front becomes `next` (if given
212
+ * and still there) or, when it was this one, its neighbour.
213
+ * @returns {{index: number, current: boolean}} where it was, and whether it was in front
214
+ * @protected
215
+ */
216
+ _removeView(id, { next = null } = {}) {
217
+ const ids = [...this._views.keys()];
218
+ const index = ids.indexOf(id);
219
+ const current = this.currentViewId === id;
220
+ this._views.delete(id);
221
+ if (next && this._views.has(next)) this.currentViewId = next;
222
+ else if (current) this.currentViewId = ids[index + 1] ?? ids[index - 1] ?? null;
223
+ this._notify();
224
+ return { index, current };
225
+ }
226
+
227
+ _newId() {
228
+ let id;
229
+ do { id = `${this.idPrefix}-${this._nextId++}`; } while (this._views.has(id));
230
+ return id;
231
+ }
232
+
233
+ _notify() {
234
+ for (const fn of this._listeners) fn(this);
235
+ this._watchHistories();
236
+ }
237
+
238
+ /** A change to the set of views: the model is no longer as saved. @protected */
239
+ _changedStructure() {
240
+ this._structure++;
241
+ this._emitEdit();
242
+ }
243
+ }
@@ -0,0 +1,6 @@
1
+ export { DiagramModel } from './DiagramModel.js';
2
+ export { DiagramView } from './DiagramView.js';
3
+ export { ViewSetModel } from './ViewSetModel.js';
4
+ export { ModelSearch, SEARCH_FIELDS } from './ModelSearch.js';
5
+ export { DiagramModelSearch } from './DiagramModelSearch.js';
6
+ export { ReplaceTextCommand } from './ReplaceTextCommand.js';
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Ways to rewrite a name (the nameTransform jArchi script): Title Case,
3
+ * Sentence case, splitting camelCase into words and back, squeezing spaces,
4
+ * upper and lower case. Pure; ModelSearch#transformCommand applies one to
5
+ * a model's names.
6
+ */
7
+
8
+ const words = (s) => String(s ?? '').trim().split(/\s+/).filter(Boolean);
9
+ /** Words not capitalised inside a title. */
10
+ const SMALL = new Set(['a', 'an', 'and', 'as', 'at', 'but', 'by', 'for', 'in', 'of', 'on', 'or', 'the', 'to', 'with']);
11
+ const capital = (w) => w.charAt(0).toUpperCase() + w.slice(1);
12
+
13
+ /** The transforms, in menu order: [key, label, (name) => name]. */
14
+ export const NAME_TRANSFORMS = Object.freeze([
15
+ ['title', 'Title Case', (s) => words(s).map((w, i) => (i && SMALL.has(w.toLowerCase()) ? w.toLowerCase() : capital(w.toLowerCase()))).join(' ')],
16
+ ['sentence', 'Sentence case', (s) => { const t = words(s).join(' ').toLowerCase(); return capital(t); }],
17
+ ['split-camel', 'Split camelCase (OrderService → Order Service)', (s) => String(s ?? '').replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2').replace(/[_-]+/g, ' ').replace(/\s+/g, ' ').trim()],
18
+ ['camel', 'camelCase (Order Service → orderService)', (s) => words(String(s ?? '').replace(/[_-]+/g, ' ')).map((w, i) => (i ? capital(w.toLowerCase()) : w.toLowerCase())).join('')],
19
+ ['squeeze', 'Remove extra spaces', (s) => words(s).join(' ')],
20
+ ['upper', 'UPPER CASE', (s) => String(s ?? '').trim().toUpperCase()],
21
+ ['lower', 'lower case', (s) => String(s ?? '').trim().toLowerCase()],
22
+ ]);
23
+
24
+ /** A name transformed (`key` one of NAME_TRANSFORMS'). */
25
+ export function transformName(key, name) {
26
+ const fn = NAME_TRANSFORMS.find(([k]) => k === key)?.[2];
27
+ if (!fn) throw new RangeError(`No such name transform: ${key}`);
28
+ return fn(name);
29
+ }