@peter.prib/renderengine 0.0.0-stage → 0.1.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 (436) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -2
  3. package/REFERENCE.md +2159 -0
  4. package/dist/renderengine-workspace.umd.js +45944 -0
  5. package/dist/renderengine.umd.js +41262 -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 +544 -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 +52 -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/AreaChart.js +71 -0
  132. package/src/charting/charts/BarChart.js +80 -0
  133. package/src/charting/charts/BarChart3D.js +56 -0
  134. package/src/charting/charts/BarChart3DOrbit.js +53 -0
  135. package/src/charting/charts/BarChartBase.js +70 -0
  136. package/src/charting/charts/BarGauge.js +21 -0
  137. package/src/charting/charts/BoxPlotChart.js +41 -0
  138. package/src/charting/charts/BubbleChart.js +99 -0
  139. package/src/charting/charts/BubbleChart3D.js +78 -0
  140. package/src/charting/charts/BulletGauge.js +91 -0
  141. package/src/charting/charts/CalendarHeatmapChart.js +204 -0
  142. package/src/charting/charts/CandlestickChart.js +54 -0
  143. package/src/charting/charts/ChordDiagram.js +130 -0
  144. package/src/charting/charts/DensityChart.js +73 -0
  145. package/src/charting/charts/DialGauge.js +37 -0
  146. package/src/charting/charts/DonutChart.js +15 -0
  147. package/src/charting/charts/FunnelChart.js +47 -0
  148. package/src/charting/charts/GanttChart.js +201 -0
  149. package/src/charting/charts/GaugeChart.js +47 -0
  150. package/src/charting/charts/GeoMapChart.js +146 -0
  151. package/src/charting/charts/GroupedBarChart.js +88 -0
  152. package/src/charting/charts/GroupedDistributionChart.js +70 -0
  153. package/src/charting/charts/HeatmapChart.js +80 -0
  154. package/src/charting/charts/HierarchyChart.js +39 -0
  155. package/src/charting/charts/HistogramChart.js +45 -0
  156. package/src/charting/charts/LagPlotChart.js +41 -0
  157. package/src/charting/charts/LineChart.js +124 -0
  158. package/src/charting/charts/OutlineChart.js +95 -0
  159. package/src/charting/charts/ParallelCoordinatesChart.js +130 -0
  160. package/src/charting/charts/PieChart.js +56 -0
  161. package/src/charting/charts/PipeChart.js +88 -0
  162. package/src/charting/charts/PopulationPyramidChart.js +106 -0
  163. package/src/charting/charts/QQPlotChart.js +64 -0
  164. package/src/charting/charts/RadarChart.js +76 -0
  165. package/src/charting/charts/RadialBarChart.js +96 -0
  166. package/src/charting/charts/SankeyDiagram.js +174 -0
  167. package/src/charting/charts/ScatterChart.js +104 -0
  168. package/src/charting/charts/StackedAreaChart.js +15 -0
  169. package/src/charting/charts/StackedBarChart.js +33 -0
  170. package/src/charting/charts/StackedBarChart3DOrbit.js +58 -0
  171. package/src/charting/charts/StreamGraphChart.js +131 -0
  172. package/src/charting/charts/SunburstChart.js +57 -0
  173. package/src/charting/charts/TreemapChart.js +54 -0
  174. package/src/charting/charts/ViolinChart.js +37 -0
  175. package/src/charting/charts/WaterfallChart.js +66 -0
  176. package/src/charting/charts/WordCloudChart.js +104 -0
  177. package/src/charting/diagramModel/AddViewCommand.js +33 -0
  178. package/src/charting/diagramModel/DiagramModel.js +39 -0
  179. package/src/charting/diagramModel/DiagramModelSearch.js +22 -0
  180. package/src/charting/diagramModel/DiagramView.js +50 -0
  181. package/src/charting/diagramModel/ModelHistory.js +43 -0
  182. package/src/charting/diagramModel/ModelReport.js +153 -0
  183. package/src/charting/diagramModel/ModelSearch.js +223 -0
  184. package/src/charting/diagramModel/RemoveViewCommand.js +25 -0
  185. package/src/charting/diagramModel/RenameViewCommand.js +21 -0
  186. package/src/charting/diagramModel/ReplaceTextCommand.js +25 -0
  187. package/src/charting/diagramModel/ViewSetChecker.js +34 -0
  188. package/src/charting/diagramModel/ViewSetModel.js +243 -0
  189. package/src/charting/diagramModel/index.js +6 -0
  190. package/src/charting/diagramModel/nameTransforms.js +29 -0
  191. package/src/charting/diagrams/ArchimateCommands.js +141 -0
  192. package/src/charting/diagrams/ArchimateDiagram.js +263 -0
  193. package/src/charting/diagrams/ArchimateModel.js +1155 -0
  194. package/src/charting/diagrams/ArchimateModelChecker.js +125 -0
  195. package/src/charting/diagrams/ArchimateModelReport.js +128 -0
  196. package/src/charting/diagrams/ArchimateModelSearch.js +41 -0
  197. package/src/charting/diagrams/ArchimateValidator.js +357 -0
  198. package/src/charting/diagrams/CanvasView.js +112 -0
  199. package/src/charting/diagrams/ContextMenu.js +37 -0
  200. package/src/charting/diagrams/DataModelDiagram.js +86 -0
  201. package/src/charting/diagrams/DataModelRelationshipStrategy.js +38 -0
  202. package/src/charting/diagrams/DerivedRelationships.js +102 -0
  203. package/src/charting/diagrams/EbnfDiagram.js +39 -0
  204. package/src/charting/diagrams/EdgeGeometry.js +553 -0
  205. package/src/charting/diagrams/EditViewItemCommand.js +128 -0
  206. package/src/charting/diagrams/ElementInstance.js +157 -0
  207. package/src/charting/diagrams/GraphDiagram.js +1340 -0
  208. package/src/charting/diagrams/GraphDiagram3D.js +152 -0
  209. package/src/charting/diagrams/GraphMetrics.js +81 -0
  210. package/src/charting/diagrams/GridOverlay.js +137 -0
  211. package/src/charting/diagrams/ImportRowsCommand.js +62 -0
  212. package/src/charting/diagrams/LabelHelper.js +108 -0
  213. package/src/charting/diagrams/MergeElementsCommand.js +101 -0
  214. package/src/charting/diagrams/NestInstanceCommand.js +34 -0
  215. package/src/charting/diagrams/NodeGeometry.js +158 -0
  216. package/src/charting/diagrams/PlaceItemsCommand.js +77 -0
  217. package/src/charting/diagrams/RadialLayout.js +101 -0
  218. package/src/charting/diagrams/RelationshipInstance.js +93 -0
  219. package/src/charting/diagrams/RemoveGroupFromViewCommand.js +28 -0
  220. package/src/charting/diagrams/RemoveLineCommand.js +27 -0
  221. package/src/charting/diagrams/ShowElementCommand.js +43 -0
  222. package/src/charting/diagrams/SvgCoordinate.js +17 -0
  223. package/src/charting/diagrams/SvgZoom.js +127 -0
  224. package/src/charting/diagrams/Tooltip.js +62 -0
  225. package/src/charting/diagrams/ViewConnectionInstance.js +102 -0
  226. package/src/charting/diagrams/ViewObjectInstance.js +56 -0
  227. package/src/charting/diagrams/commands/AddEdgeCommand.js +34 -0
  228. package/src/charting/diagrams/commands/AddNodeCommand.js +28 -0
  229. package/src/charting/diagrams/commands/AddWaypointCommand.js +27 -0
  230. package/src/charting/diagrams/commands/CreateFolderCommand.js +27 -0
  231. package/src/charting/diagrams/commands/DeleteEdgeCommand.js +30 -0
  232. package/src/charting/diagrams/commands/DeleteFolderCommand.js +47 -0
  233. package/src/charting/diagrams/commands/DeleteNodeCommand.js +35 -0
  234. package/src/charting/diagrams/commands/DeleteWaypointCommand.js +24 -0
  235. package/src/charting/diagrams/commands/GraphCommand.js +65 -0
  236. package/src/charting/diagrams/commands/InvertEdgeCommand.js +24 -0
  237. package/src/charting/diagrams/commands/MoveNodeCommand.js +44 -0
  238. package/src/charting/diagrams/commands/MoveWaypointCommand.js +27 -0
  239. package/src/charting/diagrams/commands/RenameEdgeCommand.js +23 -0
  240. package/src/charting/diagrams/commands/RenameFolderCommand.js +31 -0
  241. package/src/charting/diagrams/commands/RenameNodeCommand.js +27 -0
  242. package/src/charting/diagrams/commands/ResizeNodeCommand.js +46 -0
  243. package/src/charting/diagrams/commands/UpdateEdgeSideCommand.js +40 -0
  244. package/src/charting/diagrams/commands/index.js +17 -0
  245. package/src/charting/diagrams/duplicates.js +49 -0
  246. package/src/charting/diagrams/nesting.js +30 -0
  247. package/src/charting/diagrams/roadmap.js +77 -0
  248. package/src/charting/edgeMarkers/ArrowMarker.js +15 -0
  249. package/src/charting/edgeMarkers/CircleMarker.js +13 -0
  250. package/src/charting/edgeMarkers/CrowsFootMarker.js +16 -0
  251. package/src/charting/edgeMarkers/DiamondMarker.js +15 -0
  252. package/src/charting/edgeMarkers/EdgeMarker.js +34 -0
  253. package/src/charting/edgeMarkers/HalfArrowMarker.js +8 -0
  254. package/src/charting/edgeMarkers/HollowDiamondMarker.js +18 -0
  255. package/src/charting/edgeMarkers/HollowTriangleMarker.js +18 -0
  256. package/src/charting/edgeMarkers/OpenArrowMarker.js +17 -0
  257. package/src/charting/edgeMarkers/index.js +27 -0
  258. package/src/charting/edgeStyle/EdgeStyleCascade.js +22 -0
  259. package/src/charting/edgeStyle/EdgeStyleDialog.js +51 -0
  260. package/src/charting/edgeStyle/EdgeStyleSchema.js +43 -0
  261. package/src/charting/edgeStyle/SetStyleCommand.js +12 -0
  262. package/src/charting/edgeStyle/index.js +4 -0
  263. package/src/charting/emphasis/EmphasisRule.js +42 -0
  264. package/src/charting/emphasis/HighlightRule.js +24 -0
  265. package/src/charting/glyphs/ArrowGlyph.js +21 -0
  266. package/src/charting/glyphs/BatteryGlyph.js +18 -0
  267. package/src/charting/glyphs/ChevronGlyph.js +18 -0
  268. package/src/charting/glyphs/CircleGlyph.js +15 -0
  269. package/src/charting/glyphs/CloudGlyph.js +19 -0
  270. package/src/charting/glyphs/ComponentGlyph.js +18 -0
  271. package/src/charting/glyphs/ConstraintGlyph.js +24 -0
  272. package/src/charting/glyphs/ContractBoxGlyph.js +10 -0
  273. package/src/charting/glyphs/CubeGlyph.js +19 -0
  274. package/src/charting/glyphs/CylinderGlyph.js +19 -0
  275. package/src/charting/glyphs/DashedDoubleArrowGlyph.js +11 -0
  276. package/src/charting/glyphs/DeviceGlyph.js +17 -0
  277. package/src/charting/glyphs/DiamondGlyph.js +17 -0
  278. package/src/charting/glyphs/DocumentGlyph.js +17 -0
  279. package/src/charting/glyphs/DoubleArrowGlyph.js +23 -0
  280. package/src/charting/glyphs/DoubleCircleGlyph.js +24 -0
  281. package/src/charting/glyphs/EllipseGlyph.js +18 -0
  282. package/src/charting/glyphs/FactoryGlyph.js +20 -0
  283. package/src/charting/glyphs/FlagGlyph.js +16 -0
  284. package/src/charting/glyphs/GapCircleGlyph.js +17 -0
  285. package/src/charting/glyphs/GearGlyph.js +37 -0
  286. package/src/charting/glyphs/Glyph.js +98 -0
  287. package/src/charting/glyphs/GroupingBoxGlyph.js +13 -0
  288. package/src/charting/glyphs/HalfCircleGlyph.js +22 -0
  289. package/src/charting/glyphs/HexagonGlyph.js +28 -0
  290. package/src/charting/glyphs/IconGlyph.js +22 -0
  291. package/src/charting/glyphs/ImageGlyph.js +16 -0
  292. package/src/charting/glyphs/JunctionGlyph.js +17 -0
  293. package/src/charting/glyphs/LollipopGlyph.js +22 -0
  294. package/src/charting/glyphs/MagnifierGlyph.js +17 -0
  295. package/src/charting/glyphs/NoteGlyph.js +33 -0
  296. package/src/charting/glyphs/ObjectBoxGlyph.js +21 -0
  297. package/src/charting/glyphs/OrJunctionGlyph.js +17 -0
  298. package/src/charting/glyphs/ParallelogramGlyph.js +20 -0
  299. package/src/charting/glyphs/PersonGlyph.js +23 -0
  300. package/src/charting/glyphs/PillGlyph.js +23 -0
  301. package/src/charting/glyphs/PinGlyph.js +18 -0
  302. package/src/charting/glyphs/PrincipleGlyph.js +23 -0
  303. package/src/charting/glyphs/ProductBoxGlyph.js +16 -0
  304. package/src/charting/glyphs/RectGlyph.js +15 -0
  305. package/src/charting/glyphs/RoundedBoxGlyph.js +13 -0
  306. package/src/charting/glyphs/StackGlyph.js +14 -0
  307. package/src/charting/glyphs/StepsGlyph.js +20 -0
  308. package/src/charting/glyphs/StickFigureGlyph.js +32 -0
  309. package/src/charting/glyphs/SystemSoftwareBoxGlyph.js +16 -0
  310. package/src/charting/glyphs/TabbedBoxGlyph.js +37 -0
  311. package/src/charting/glyphs/TargetGlyph.js +23 -0
  312. package/src/charting/glyphs/WavyBoxGlyph.js +17 -0
  313. package/src/charting/glyphs/WheelGlyph.js +28 -0
  314. package/src/charting/glyphs/drawGlyph.js +28 -0
  315. package/src/charting/glyphs/glyphSvg.js +55 -0
  316. package/src/charting/glyphs/index.js +109 -0
  317. package/src/charting/modelTree/AnalysisPanel.js +159 -0
  318. package/src/charting/modelTree/DiagramTabs.js +217 -0
  319. package/src/charting/modelTree/ModelTree.js +164 -0
  320. package/src/charting/modelTree/ModelTreePanel.js +914 -0
  321. package/src/charting/modelTree/TreeBuilder.js +238 -0
  322. package/src/charting/modelTree/TreeModeRegistry.js +51 -0
  323. package/src/charting/modelTree/TreeViewMode.js +110 -0
  324. package/src/charting/modelTree/buildFilterTrees.js +138 -0
  325. package/src/charting/modelTree/modes/FlatTreeMode.js +46 -0
  326. package/src/charting/modelTree/modes/LayerGroupedTreeMode.js +62 -0
  327. package/src/charting/modelTree/modes/TypeGroupedTreeMode.js +60 -0
  328. package/src/charting/modelTree/treeLayers.js +11 -0
  329. package/src/charting/report/reportHtml.js +82 -0
  330. package/src/charting/report/reportViewer.js +118 -0
  331. package/src/charting/shapes/CircleShape.js +19 -0
  332. package/src/charting/shapes/PathShape.js +17 -0
  333. package/src/charting/shapes/RectShape.js +20 -0
  334. package/src/charting/shapes/Shape.js +20 -0
  335. package/src/charting/shapes/ShapeFactory.js +23 -0
  336. package/src/charting/storage/LocalJsonStore.js +43 -0
  337. package/src/charting/templates/ActorTemplate.js +36 -0
  338. package/src/charting/templates/BoxTemplate.js +27 -0
  339. package/src/charting/templates/CircleTemplate.js +18 -0
  340. package/src/charting/templates/ClassTemplate.js +20 -0
  341. package/src/charting/templates/CloudTemplate.js +43 -0
  342. package/src/charting/templates/ComponentTemplate.js +19 -0
  343. package/src/charting/templates/CylinderTemplate.js +30 -0
  344. package/src/charting/templates/DataStoreTemplate.js +16 -0
  345. package/src/charting/templates/DiamondTemplate.js +10 -0
  346. package/src/charting/templates/DocumentTemplate.js +32 -0
  347. package/src/charting/templates/EllipseTemplate.js +15 -0
  348. package/src/charting/templates/FinalStateTemplate.js +12 -0
  349. package/src/charting/templates/GlyphTemplate.js +47 -0
  350. package/src/charting/templates/HexagonTemplate.js +17 -0
  351. package/src/charting/templates/LifelineTemplate.js +20 -0
  352. package/src/charting/templates/ManualInputTemplate.js +12 -0
  353. package/src/charting/templates/NoteTemplate.js +23 -0
  354. package/src/charting/templates/OctagonTemplate.js +7 -0
  355. package/src/charting/templates/PackageTemplate.js +25 -0
  356. package/src/charting/templates/ParallelogramTemplate.js +11 -0
  357. package/src/charting/templates/PentagonTemplate.js +5 -0
  358. package/src/charting/templates/PolygonTemplate.js +18 -0
  359. package/src/charting/templates/PredefinedProcessTemplate.js +13 -0
  360. package/src/charting/templates/RectangleTemplate.js +28 -0
  361. package/src/charting/templates/RegularPolygonTemplate.js +21 -0
  362. package/src/charting/templates/RoundedRectangleTemplate.js +5 -0
  363. package/src/charting/templates/StadiumTemplate.js +8 -0
  364. package/src/charting/templates/StarTemplate.js +17 -0
  365. package/src/charting/templates/SwimlaneTemplate.js +18 -0
  366. package/src/charting/templates/Template.js +208 -0
  367. package/src/charting/templates/TrapezoidTemplate.js +11 -0
  368. package/src/charting/templates/TriangleTemplate.js +12 -0
  369. package/src/charting/templates/index.js +31 -0
  370. package/src/charting/templates/outline.js +59 -0
  371. package/src/charting/templates/svg.js +19 -0
  372. package/src/charting/textToShapes.js +61 -0
  373. package/src/charting/toolbar/ToolbarButton.js +38 -0
  374. package/src/charting/toolbar/ToolbarCheckbox.js +31 -0
  375. package/src/charting/toolbar/ToolbarItem.js +19 -0
  376. package/src/charting/toolbar/ToolbarMenu.js +36 -0
  377. package/src/charting/toolbar/ToolbarSelect.js +38 -0
  378. package/src/charting/toolbar/ToolbarSeparator.js +7 -0
  379. package/src/charting/toolbar/ToolbarText.js +22 -0
  380. package/src/charting/toolbar/index.js +8 -0
  381. package/src/charting/toolbar/pickFile.js +14 -0
  382. package/src/charting/viewDecorations.js +85 -0
  383. package/src/charting/zOrder.js +57 -0
  384. package/src/csvTable.js +61 -0
  385. package/src/datamodel.js +122 -0
  386. package/src/datawindow/BoundedWindow.js +36 -0
  387. package/src/datawindow/FlatDataWindow.js +34 -0
  388. package/src/datawindow/GraphDataWindow.js +40 -0
  389. package/src/datawindow/GroupedSampleDataWindow.js +16 -0
  390. package/src/datawindow/SeriesDataWindow.js +42 -0
  391. package/src/datawindow/index.js +31 -0
  392. package/src/diagramCatalog.js +30 -0
  393. package/src/ebnfDiagram.js +57 -0
  394. package/src/ebnfParser.js +129 -0
  395. package/src/exportImage.js +233 -0
  396. package/src/index.js +2564 -0
  397. package/src/itIcons.js +84 -0
  398. package/src/kernelExpr.js +243 -0
  399. package/src/propertiesDialog.js +463 -0
  400. package/src/railroadDiagram.js +571 -0
  401. package/src/treeModeCatalog.js +16 -0
  402. package/src/workspace/ContextBus.js +79 -0
  403. package/src/workspace/EditorShell.js +67 -0
  404. package/src/workspace/Part.js +163 -0
  405. package/src/workspace/PartFactory.js +49 -0
  406. package/src/workspace/PartRegistry.js +86 -0
  407. package/src/workspace/Workspace.js +321 -0
  408. package/src/workspace/archimateServices.js +33 -0
  409. package/src/workspace/dom.js +120 -0
  410. package/src/workspace/index.js +75 -0
  411. package/src/workspace/layout/GridNode.js +280 -0
  412. package/src/workspace/layout/LayoutNode.js +89 -0
  413. package/src/workspace/layout/PartNode.js +77 -0
  414. package/src/workspace/layout/SplitNode.js +114 -0
  415. package/src/workspace/layout/TabsNode.js +191 -0
  416. package/src/workspace/layout/index.js +24 -0
  417. package/src/workspace/parts/AdapterPart.js +33 -0
  418. package/src/workspace/parts/ArchimateCanvasPart.js +345 -0
  419. package/src/workspace/parts/ArchimateEditorPart.js +79 -0
  420. package/src/workspace/parts/ChartPart.js +115 -0
  421. package/src/workspace/parts/ContentPart.js +34 -0
  422. package/src/workspace/parts/DetailPart.js +46 -0
  423. package/src/workspace/parts/DiagramEditorPart.js +135 -0
  424. package/src/workspace/parts/EditorPart.js +388 -0
  425. package/src/workspace/parts/HtmlPart.js +25 -0
  426. package/src/workspace/parts/ListPart.js +57 -0
  427. package/src/workspace/parts/ModelFile.js +187 -0
  428. package/src/workspace/parts/ModelsPart.js +135 -0
  429. package/src/workspace/styles.js +258 -0
  430. package/src/workspace/themes.js +96 -0
  431. package/src/workspace/workArea.js +413 -0
  432. package/src/workspace/workAreaModel.js +197 -0
  433. package/src/workspace.js +16 -0
  434. package/src/zip/ZipArchive.js +160 -0
  435. package/src/zip/crc32.js +25 -0
  436. package/src/zip/inflate.js +159 -0
@@ -0,0 +1,109 @@
1
+ import { RectGlyph } from './RectGlyph.js';
2
+ import { NoteGlyph } from './NoteGlyph.js';
3
+ import { ImageGlyph } from './ImageGlyph.js';
4
+ import { IconGlyph } from './IconGlyph.js';
5
+ import { DiamondGlyph } from './DiamondGlyph.js';
6
+ import { PersonGlyph } from './PersonGlyph.js';
7
+ import { PillGlyph } from './PillGlyph.js';
8
+ import { ArrowGlyph } from './ArrowGlyph.js';
9
+ import { ChevronGlyph } from './ChevronGlyph.js';
10
+ import { FlagGlyph } from './FlagGlyph.js';
11
+ import { HalfCircleGlyph } from './HalfCircleGlyph.js';
12
+ import { DoubleCircleGlyph } from './DoubleCircleGlyph.js';
13
+ import { LollipopGlyph } from './LollipopGlyph.js';
14
+ import { CylinderGlyph } from './CylinderGlyph.js';
15
+ import { CubeGlyph } from './CubeGlyph.js';
16
+ import { TargetGlyph } from './TargetGlyph.js';
17
+ import { StickFigureGlyph } from './StickFigureGlyph.js';
18
+ import { JunctionGlyph } from './JunctionGlyph.js';
19
+ import { OrJunctionGlyph } from './OrJunctionGlyph.js';
20
+ import { HexagonGlyph } from './HexagonGlyph.js';
21
+ import { ObjectBoxGlyph } from './ObjectBoxGlyph.js';
22
+ import { ContractBoxGlyph } from './ContractBoxGlyph.js';
23
+ import { ProductBoxGlyph } from './ProductBoxGlyph.js';
24
+ import { WavyBoxGlyph } from './WavyBoxGlyph.js';
25
+ import { SystemSoftwareBoxGlyph } from './SystemSoftwareBoxGlyph.js';
26
+ import { GroupingBoxGlyph } from './GroupingBoxGlyph.js';
27
+ import { TabbedBoxGlyph } from './TabbedBoxGlyph.js';
28
+ import { RoundedBoxGlyph } from './RoundedBoxGlyph.js';
29
+ import { ComponentGlyph } from './ComponentGlyph.js';
30
+ import { FactoryGlyph } from './FactoryGlyph.js';
31
+ import { DeviceGlyph } from './DeviceGlyph.js';
32
+ import { StepsGlyph } from './StepsGlyph.js';
33
+ import { WheelGlyph } from './WheelGlyph.js';
34
+ import { MagnifierGlyph } from './MagnifierGlyph.js';
35
+ import { StackGlyph } from './StackGlyph.js';
36
+ import { GapCircleGlyph } from './GapCircleGlyph.js';
37
+ import { PrincipleGlyph } from './PrincipleGlyph.js';
38
+ import { ConstraintGlyph } from './ConstraintGlyph.js';
39
+ import { DoubleArrowGlyph } from './DoubleArrowGlyph.js';
40
+ import { DashedDoubleArrowGlyph } from './DashedDoubleArrowGlyph.js';
41
+ import { PinGlyph } from './PinGlyph.js';
42
+ import { CloudGlyph } from './CloudGlyph.js';
43
+ import { DocumentGlyph } from './DocumentGlyph.js';
44
+ import { ParallelogramGlyph } from './ParallelogramGlyph.js';
45
+ import { EllipseGlyph } from './EllipseGlyph.js';
46
+ import { GearGlyph } from './GearGlyph.js';
47
+ import { BatteryGlyph } from './BatteryGlyph.js';
48
+ import { CircleGlyph } from './CircleGlyph.js';
49
+
50
+ export { Glyph } from './Glyph.js';
51
+ export { drawGlyph } from './drawGlyph.js';
52
+ export { RectGlyph, NoteGlyph, ImageGlyph, IconGlyph, DiamondGlyph, PersonGlyph, PillGlyph, ArrowGlyph, ChevronGlyph, FlagGlyph, HalfCircleGlyph, DoubleCircleGlyph, LollipopGlyph, CylinderGlyph, CubeGlyph, TargetGlyph, StickFigureGlyph, JunctionGlyph, OrJunctionGlyph, HexagonGlyph, ObjectBoxGlyph, ContractBoxGlyph, ProductBoxGlyph, WavyBoxGlyph, SystemSoftwareBoxGlyph, GroupingBoxGlyph, TabbedBoxGlyph, RoundedBoxGlyph, ComponentGlyph, FactoryGlyph, DeviceGlyph, StepsGlyph, WheelGlyph, MagnifierGlyph, StackGlyph, GapCircleGlyph, PrincipleGlyph, ConstraintGlyph, DoubleArrowGlyph, DashedDoubleArrowGlyph, PinGlyph, CloudGlyph, DocumentGlyph, ParallelogramGlyph, EllipseGlyph, GearGlyph, BatteryGlyph, CircleGlyph };
53
+
54
+ /** One instance per notation shape, by key ('pill', 'cube', ...). */
55
+ export const GLYPHS = new Map([
56
+ [RectGlyph.key, new RectGlyph()],
57
+ [NoteGlyph.key, new NoteGlyph()],
58
+ [ImageGlyph.key, new ImageGlyph()],
59
+ [IconGlyph.key, new IconGlyph()],
60
+ [DiamondGlyph.key, new DiamondGlyph()],
61
+ [PersonGlyph.key, new PersonGlyph()],
62
+ [PillGlyph.key, new PillGlyph()],
63
+ [ArrowGlyph.key, new ArrowGlyph()],
64
+ [ChevronGlyph.key, new ChevronGlyph()],
65
+ [FlagGlyph.key, new FlagGlyph()],
66
+ [HalfCircleGlyph.key, new HalfCircleGlyph()],
67
+ [DoubleCircleGlyph.key, new DoubleCircleGlyph()],
68
+ [LollipopGlyph.key, new LollipopGlyph()],
69
+ [CylinderGlyph.key, new CylinderGlyph()],
70
+ [CubeGlyph.key, new CubeGlyph()],
71
+ [TargetGlyph.key, new TargetGlyph()],
72
+ [StickFigureGlyph.key, new StickFigureGlyph()],
73
+ [JunctionGlyph.key, new JunctionGlyph()],
74
+ [OrJunctionGlyph.key, new OrJunctionGlyph()],
75
+ [HexagonGlyph.key, new HexagonGlyph()],
76
+ [ObjectBoxGlyph.key, new ObjectBoxGlyph()],
77
+ [ContractBoxGlyph.key, new ContractBoxGlyph()],
78
+ [ProductBoxGlyph.key, new ProductBoxGlyph()],
79
+ [WavyBoxGlyph.key, new WavyBoxGlyph()],
80
+ [SystemSoftwareBoxGlyph.key, new SystemSoftwareBoxGlyph()],
81
+ [GroupingBoxGlyph.key, new GroupingBoxGlyph()],
82
+ [TabbedBoxGlyph.key, new TabbedBoxGlyph()],
83
+ [RoundedBoxGlyph.key, new RoundedBoxGlyph()],
84
+ [ComponentGlyph.key, new ComponentGlyph()],
85
+ [FactoryGlyph.key, new FactoryGlyph()],
86
+ [DeviceGlyph.key, new DeviceGlyph()],
87
+ [StepsGlyph.key, new StepsGlyph()],
88
+ [WheelGlyph.key, new WheelGlyph()],
89
+ [MagnifierGlyph.key, new MagnifierGlyph()],
90
+ [StackGlyph.key, new StackGlyph()],
91
+ [GapCircleGlyph.key, new GapCircleGlyph()],
92
+ [PrincipleGlyph.key, new PrincipleGlyph()],
93
+ [ConstraintGlyph.key, new ConstraintGlyph()],
94
+ [DoubleArrowGlyph.key, new DoubleArrowGlyph()],
95
+ [DashedDoubleArrowGlyph.key, new DashedDoubleArrowGlyph()],
96
+ [PinGlyph.key, new PinGlyph()],
97
+ [CloudGlyph.key, new CloudGlyph()],
98
+ [DocumentGlyph.key, new DocumentGlyph()],
99
+ [ParallelogramGlyph.key, new ParallelogramGlyph()],
100
+ [EllipseGlyph.key, new EllipseGlyph()],
101
+ [GearGlyph.key, new GearGlyph()],
102
+ [BatteryGlyph.key, new BatteryGlyph()],
103
+ [CircleGlyph.key, new CircleGlyph()],
104
+ ]);
105
+
106
+ /** The glyph for a shape key; unknown keys draw as a circle (the plain graph node). */
107
+ export function glyphFor(key) {
108
+ return GLYPHS.get(key) ?? GLYPHS.get('circle');
109
+ }
@@ -0,0 +1,159 @@
1
+ import { treeLayerOf } from './ModelTreePanel.js';
2
+ import { typeTitle } from '../archimate/archimateNames.js';
3
+ /**
4
+ * Builds analysis data for a selected element: "Used in Views", incoming/outgoing relationships.
5
+ */
6
+ export function buildAnalysisData(model, elementId) {
7
+ const element = model.getElement(elementId);
8
+ if (!element) return null;
9
+
10
+ const rels = model.relationshipsFor(elementId);
11
+
12
+ return {
13
+ element,
14
+ usedInViews: model.viewsContaining(elementId),
15
+ incoming: rels.incoming,
16
+ outgoing: rels.outgoing,
17
+ };
18
+ }
19
+
20
+ /**
21
+ * DOM shell for rendering analysis panel.
22
+ * Builds via doc.createElement/Object.assign, never innerHTML.
23
+ */
24
+ export function buildAnalysisPanel(doc, { model, elementId, onSelectItem = () => {} } = {}) {
25
+ const panel = doc.createElement('div');
26
+ panel.style.cssText = `
27
+ display: flex;
28
+ flex-direction: column;
29
+ height: 100%;
30
+ gap: 8px;
31
+ padding: 8px;
32
+ font-family: sans-serif;
33
+ font-size: 13px;
34
+ overflow: hidden;
35
+ `;
36
+
37
+ const data = buildAnalysisData(model, elementId);
38
+ if (!data) {
39
+ panel.textContent = '(No element selected)';
40
+ return panel;
41
+ }
42
+
43
+ // Element details
44
+ const detailsDiv = doc.createElement('div');
45
+ detailsDiv.style.cssText = 'padding: 8px; background: #f5f5f5; border-radius: 4px;';
46
+
47
+ const nameRow = Object.assign(doc.createElement('div'), { textContent: `Name: ${data.element.name || '(unnamed)'}` });
48
+ const typeRow = Object.assign(doc.createElement('div'), { textContent: `Type: ${data.element.type}` });
49
+ // Its layer as the diagram draws it (a stored one, else its type's), as the tree files it.
50
+ const layerRow = Object.assign(doc.createElement('div'), { textContent: `Layer: ${typeTitle(treeLayerOf(data.element))}` });
51
+
52
+ detailsDiv.appendChild(nameRow);
53
+ detailsDiv.appendChild(typeRow);
54
+ detailsDiv.appendChild(layerRow);
55
+ panel.appendChild(detailsDiv);
56
+
57
+ // Used in Views
58
+ const usedDiv = doc.createElement('div');
59
+ usedDiv.style.cssText = 'flex-shrink: 0;';
60
+
61
+ const usedLabel = Object.assign(doc.createElement('div'), {
62
+ textContent: `Used in Views (${data.usedInViews.length})`,
63
+ style: 'font-weight: bold; margin-bottom: 4px;',
64
+ });
65
+ usedDiv.appendChild(usedLabel);
66
+
67
+ if (data.usedInViews.length === 0) {
68
+ usedDiv.appendChild(Object.assign(doc.createElement('div'), {
69
+ textContent: '(no views)',
70
+ style: 'font-size: 12px; color: #666;',
71
+ }));
72
+ } else {
73
+ for (const view of data.usedInViews) {
74
+ const row = buildAnalysisRow(doc, view.name, () => onSelectItem({ kind: 'view', id: view.id }));
75
+ usedDiv.appendChild(row);
76
+ }
77
+ }
78
+ panel.appendChild(usedDiv);
79
+
80
+ // Incoming relationships
81
+ const incomingDiv = doc.createElement('div');
82
+ incomingDiv.style.cssText = 'flex-shrink: 0;';
83
+
84
+ const incomingLabel = Object.assign(doc.createElement('div'), {
85
+ textContent: `Incoming (${data.incoming.length})`,
86
+ style: 'font-weight: bold; margin-bottom: 4px; margin-top: 8px;',
87
+ });
88
+ incomingDiv.appendChild(incomingLabel);
89
+
90
+ if (data.incoming.length === 0) {
91
+ incomingDiv.appendChild(Object.assign(doc.createElement('div'), {
92
+ textContent: '(none)',
93
+ style: 'font-size: 12px; color: #666;',
94
+ }));
95
+ } else {
96
+ for (const rel of data.incoming) {
97
+ const source = model.getElement(rel.source);
98
+ const label = `${source?.name || rel.source} → ${rel.kind}`;
99
+ const row = buildAnalysisRow(doc, label, () => onSelectItem({ kind: 'relationship', id: rel.id }));
100
+ incomingDiv.appendChild(row);
101
+ }
102
+ }
103
+ panel.appendChild(incomingDiv);
104
+
105
+ // Outgoing relationships
106
+ const outgoingDiv = doc.createElement('div');
107
+ outgoingDiv.style.cssText = 'flex: 1; overflow-y: auto; min-height: 0;';
108
+
109
+ const outgoingLabel = Object.assign(doc.createElement('div'), {
110
+ textContent: `Outgoing (${data.outgoing.length})`,
111
+ style: 'font-weight: bold; margin-bottom: 4px; margin-top: 8px; flex-shrink: 0;',
112
+ });
113
+ outgoingDiv.appendChild(outgoingLabel);
114
+
115
+ if (data.outgoing.length === 0) {
116
+ outgoingDiv.appendChild(Object.assign(doc.createElement('div'), {
117
+ textContent: '(none)',
118
+ style: 'font-size: 12px; color: #666;',
119
+ }));
120
+ } else {
121
+ for (const rel of data.outgoing) {
122
+ const target = model.getElement(rel.target);
123
+ const label = `${rel.kind} → ${target?.name || rel.target}`;
124
+ const row = buildAnalysisRow(doc, label, () => onSelectItem({ kind: 'relationship', id: rel.id }));
125
+ outgoingDiv.appendChild(row);
126
+ }
127
+ }
128
+ panel.appendChild(outgoingDiv);
129
+
130
+ return panel;
131
+ }
132
+
133
+ /**
134
+ * Build a single clickable analysis row.
135
+ * @private
136
+ */
137
+ function buildAnalysisRow(doc, label, onClick) {
138
+ const row = doc.createElement('div');
139
+ row.style.cssText = `
140
+ padding: 4px 6px;
141
+ margin: 2px 0;
142
+ border-radius: 3px;
143
+ cursor: pointer;
144
+ user-select: none;
145
+ font-size: 12px;
146
+ transition: background-color 0.1s;
147
+ `;
148
+ row.textContent = label;
149
+
150
+ row.addEventListener('click', onClick);
151
+ row.addEventListener('mouseenter', () => {
152
+ row.style.background = '#e0e0e0';
153
+ });
154
+ row.addEventListener('mouseleave', () => {
155
+ row.style.background = '';
156
+ });
157
+
158
+ return row;
159
+ }
@@ -0,0 +1,217 @@
1
+ import { ViewTabStrip } from '../ViewTabStrip.js';
2
+
3
+ /**
4
+ * Multi-engine diagram tab manager.
5
+ * Creates and manages separate RenderEngine instances for each view,
6
+ * maintaining independent state per tab (positions, selections, edits).
7
+ * The tab bar itself is a ViewTabStrip (closable tabs), shared with the
8
+ * template editor.
9
+ *
10
+ * Usage:
11
+ * const diagrams = new DiagramTabs(doc, { RenderEngine });
12
+ * parentEl.appendChild(diagrams.build()); // tabs + diagram area
13
+ * const engine = diagrams.getOrCreateEngine(view);
14
+ * diagrams.show(view, onTabClick); // open (or focus) a tab
15
+ * diagrams.switchTo(view);
16
+ * diagrams.getActiveEngine();
17
+ * diagrams.containerFor(view.id); // that view's diagram element
18
+ *
19
+ * Its elements carry classes (`diagram-area`, `diagram-tab-bar`,
20
+ * `diagram-view` with `data-view-id`), never ids, so several can share a page.
21
+ */
22
+ export class DiagramTabs {
23
+ constructor(doc, options = {}) {
24
+ this.doc = doc;
25
+ this.RenderEngine = options.RenderEngine;
26
+ this.settingsManager = options.settingsManager;
27
+ /** Right-click menu for a tab: (viewId) => PopupMenu items. */
28
+ this.menuItems = options.menuItems ?? (() => []);
29
+ this.engines = new Map(); // viewId -> { engine, svgContainer }
30
+ /** Open tabs in order: viewId -> { view, onTabClick } */
31
+ this.tabs = new Map();
32
+ this.activeViewId = null;
33
+ this.container = null;
34
+ this.tabBar = null;
35
+ this.diagramArea = null;
36
+ this.renderFn = null; // Consumer provides this: () => void
37
+
38
+ // Re-render the active view when its model or view settings change.
39
+ if (this.settingsManager) {
40
+ this.settingsManager.onSettingsChange(({ type, modelId, viewId }) => {
41
+ if ((type === 'model' && modelId === 'default') || (type === 'view' && viewId === this.activeViewId)) {
42
+ this._render();
43
+ }
44
+ });
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Set the render function — called whenever the active view or settings change.
50
+ * @param {Function} fn - render function to call: () => void
51
+ */
52
+ setRenderFunction(fn) {
53
+ this.renderFn = fn;
54
+ }
55
+
56
+ /** @private */
57
+ _render() {
58
+ if (!this.renderFn) return;
59
+ try {
60
+ this.renderFn();
61
+ } catch (err) {
62
+ console.error('DiagramTabs render error:', err);
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Build the tab container DOM (tabs + diagram area).
68
+ * @returns {HTMLElement} container div
69
+ */
70
+ build() {
71
+ this.container = this.doc.createElement('div');
72
+ this.container.style.cssText = 'display: flex; flex-direction: column; height: 100%; flex: 1 1 auto;';
73
+ this.tabBar = this.doc.createElement('div');
74
+ this.container.appendChild(this.tabBar);
75
+ this.diagramArea = this.doc.createElement('div');
76
+ this.diagramArea.className = 'diagram-area';
77
+ this.diagramArea.style.cssText = 'flex: 1 1 auto; height: 100%; position: relative; overflow: hidden;';
78
+ this.container.appendChild(this.diagramArea);
79
+ this._renderTabBar();
80
+ return this.container;
81
+ }
82
+
83
+ /** Redraw the tab bar from the open tabs. @private */
84
+ _renderTabBar() {
85
+ if (!this.tabBar) return;
86
+ const strip = new ViewTabStrip({
87
+ document: this.doc,
88
+ onSelect: (id) => this._selectTab(id),
89
+ onClose: (id) => this.closeTab(id),
90
+ menuItems: (id) => this.menuItems(id),
91
+ }).render([...this.tabs.values()].map(({ view }) => ({ id: view.id, title: view.name || view.id })), this.activeViewId);
92
+ strip.classList.add('diagram-tab-bar');
93
+ this.tabBar.replaceWith(strip);
94
+ this.tabBar = strip;
95
+ }
96
+
97
+ /** @private */
98
+ _selectTab(id) {
99
+ const tab = this.tabs.get(id);
100
+ if (!tab) return;
101
+ this.switchTo(tab.view);
102
+ tab.onTabClick?.(tab.view);
103
+ }
104
+
105
+ /**
106
+ * Get or create a RenderEngine for a view.
107
+ * Each view gets its own SVG container and engine instance.
108
+ * @param {ArchimateView} view
109
+ * @returns {RenderEngine} engine instance for that view
110
+ */
111
+ getOrCreateEngine(view) {
112
+ if (!this.RenderEngine) throw new Error('DiagramTabs: RenderEngine class not provided');
113
+ if (!view || !view.id) throw new Error('DiagramTabs: view must have an id');
114
+
115
+ if (this.engines.has(view.id)) {
116
+ return this.engines.get(view.id).engine;
117
+ }
118
+
119
+ // RenderEngine sizes itself from its container, so create it while visible, then hide.
120
+ const svgContainer = this.doc.createElement('div');
121
+ svgContainer.className = 'diagram-view';
122
+ svgContainer.dataset.viewId = view.id;
123
+ svgContainer.style.cssText = 'width: 100%; height: 100%; position: absolute; top: 0; left: 0;';
124
+ this.diagramArea.appendChild(svgContainer);
125
+ const engine = new this.RenderEngine(svgContainer, { rendererType: 'svg' });
126
+ svgContainer.style.display = 'none';
127
+
128
+ this.engines.set(view.id, { engine, svgContainer });
129
+ return engine;
130
+ }
131
+
132
+ /**
133
+ * Switch to a view's diagram (show its SVG, hide others) and re-render.
134
+ * @param {ArchimateView} view
135
+ * @returns {RenderEngine} the active engine for that view
136
+ */
137
+ switchTo(view) {
138
+ if (!view || !view.id) return null;
139
+ this.getOrCreateEngine(view);
140
+ this.engines.forEach((data, viewId) => {
141
+ data.svgContainer.style.display = viewId === view.id ? 'block' : 'none';
142
+ });
143
+ this.activeViewId = view.id;
144
+ this._renderTabBar();
145
+ this._render();
146
+ return this.getActiveEngine();
147
+ }
148
+
149
+ /** The element a view's diagram is drawn in, or null if it has none yet. */
150
+ containerFor(viewId) {
151
+ return this.engines.get(viewId)?.svgContainer ?? null;
152
+ }
153
+
154
+ /** @returns {RenderEngine|null} */
155
+ getActiveEngine() {
156
+ if (!this.activeViewId) return null;
157
+ return this.engines.get(this.activeViewId)?.engine ?? null;
158
+ }
159
+
160
+ /** @returns {string|null} */
161
+ getActiveViewId() {
162
+ return this.activeViewId;
163
+ }
164
+
165
+ /** Whether a view has an open tab. */
166
+ hasTab(viewId) {
167
+ return this.tabs.has(viewId);
168
+ }
169
+
170
+ /** Ids of the views open in tabs, in order. */
171
+ openViewIds() {
172
+ return [...this.tabs.keys()];
173
+ }
174
+
175
+ /**
176
+ * Close a tab (the view stays in the model). Closing the active tab
177
+ * switches to the first remaining one.
178
+ */
179
+ closeTab(viewId) {
180
+ this.tabs.delete(viewId);
181
+ this.engines.get(viewId)?.svgContainer.remove();
182
+ this.engines.delete(viewId);
183
+ if (this.activeViewId === viewId) {
184
+ this.activeViewId = null;
185
+ const next = this.tabs.values().next().value;
186
+ if (next) {
187
+ // Same as clicking it, so the host (e.g. the editor's current view) follows.
188
+ this._selectTab(next.view.id);
189
+ return;
190
+ }
191
+ if (this.diagramArea) this.diagramArea.replaceChildren();
192
+ this._render();
193
+ }
194
+ this._renderTabBar();
195
+ }
196
+
197
+ /**
198
+ * Add (or refresh) a view's tab.
199
+ * @param {ArchimateView} view
200
+ * @param {Function} [onTabClick] - called after the tab is clicked and its view shown
201
+ */
202
+ addViewTab(view, onTabClick) {
203
+ this.tabs.set(view.id, { view, onTabClick: onTabClick ?? this.tabs.get(view.id)?.onTabClick });
204
+ this._renderTabBar();
205
+ }
206
+
207
+ /**
208
+ * Show a view in tabs (create engine, tab, and switch to it).
209
+ * @param {ArchimateView} view
210
+ * @param {Function} [onShow] - called when the tab is later clicked
211
+ */
212
+ show(view, onShow) {
213
+ this.getOrCreateEngine(view);
214
+ this.addViewTab(view, onShow);
215
+ this.switchTo(view);
216
+ }
217
+ }
@@ -0,0 +1,164 @@
1
+ import { treeModeRegistry } from '../../treeModeCatalog.js';
2
+ import { buildTypeCategoryTree, buildPropertyTree } from './buildFilterTrees.js';
3
+
4
+ /**
5
+ * Pure-logic model tree orchestrator. Holds model, manages grouping mode,
6
+ * filter text, and selection. DOM shells (ModelTreePanel/AnalysisPanel)
7
+ * use this via getters/setters and onSelectionChange callbacks.
8
+ */
9
+ export class ModelTree {
10
+ constructor(model, { mode = 'byLayer', viewId = null } = {}) {
11
+ this.model = model;
12
+ this._filterText = '';
13
+ this._typeFilter = null; // Set<string> | null (null = no filter = all types shown)
14
+ this._specializationFilter = null;
15
+ this._propertyFilter = null;
16
+ this._selectedId = null;
17
+ this._selectedKind = null;
18
+ this._onSelectionChange = [];
19
+ /** Which tree folders are open, by node id (TreeBuilder openState), kept while the tree is redrawn. */
20
+ this.openFolders = new Map();
21
+ this._selectedViewId = viewId || (model.views().length > 0 ? model.views()[0].id : null);
22
+ this.setMode(mode);
23
+ }
24
+
25
+ getSelectedView() {
26
+ return this._selectedViewId ? this.model.getView?.(this._selectedViewId) : null;
27
+ }
28
+
29
+ setView(viewId) {
30
+ // null means "show all elements from the model"
31
+ if (viewId !== null) {
32
+ const view = this.model.getView?.(viewId);
33
+ if (!view) {
34
+ throw new Error(`Unknown view: "${viewId}"`);
35
+ }
36
+ }
37
+ this._selectedViewId = viewId;
38
+ this._rebuild();
39
+ }
40
+
41
+ getAvailableViews() {
42
+ return this.model.views();
43
+ }
44
+
45
+ setMode(key) {
46
+ const entry = treeModeRegistry.get(key);
47
+ if (!entry) {
48
+ throw new Error(`Unknown tree mode: "${key}"`);
49
+ }
50
+ this._mode = new entry.TreeModeClass();
51
+ this._rebuild();
52
+ }
53
+
54
+ setFilter(text) {
55
+ this._filterText = text;
56
+ this._rebuild();
57
+ }
58
+
59
+ setTypeFilter(typeIds) {
60
+ this._typeFilter = typeIds instanceof Set ? typeIds : (typeIds ? new Set(typeIds) : null);
61
+ this._rebuild();
62
+ }
63
+
64
+ setSpecializationFilter(specIds) {
65
+ this._specializationFilter = specIds instanceof Set ? specIds : (specIds ? new Set(specIds) : null);
66
+ this._rebuild();
67
+ }
68
+
69
+ setPropertyFilter(propIds) {
70
+ this._propertyFilter = propIds instanceof Set ? propIds : (propIds ? new Set(propIds) : null);
71
+ this._rebuild();
72
+ }
73
+
74
+ select(id, kind = 'element') {
75
+ this._selectedId = id;
76
+ this._selectedKind = kind;
77
+ this._notifySelectionChange();
78
+ }
79
+
80
+ getSelectedId() { return this._selectedId; }
81
+ getSelectedKind() { return this._selectedKind; }
82
+ getFilterText() { return this._filterText; }
83
+
84
+ /**
85
+ * Get the type/specialization hierarchy tree for this model.
86
+ * Ready to pass to CheckboxTreeSelector.
87
+ */
88
+ getAvailableTypeTree() {
89
+ return buildTypeCategoryTree(this.model);
90
+ }
91
+
92
+ /**
93
+ * Get the property name/value hierarchy tree for this model.
94
+ * Ready to pass to CheckboxTreeSelector.
95
+ */
96
+ getAvailablePropertyTree() {
97
+ return buildPropertyTree(this.model);
98
+ }
99
+
100
+ buildGroups() {
101
+ const view = this.getSelectedView();
102
+ const dataSource = view || this.model;
103
+ return this._mode.buildGroups(dataSource, {
104
+ filterText: this._filterText,
105
+ typeIds: this._typeFilter,
106
+ specializationIds: this._specializationFilter,
107
+ propertyIds: this._propertyFilter,
108
+ });
109
+ }
110
+
111
+ onSelectionChange(callback) {
112
+ this._onSelectionChange.push(callback);
113
+ return () => {
114
+ const idx = this._onSelectionChange.indexOf(callback);
115
+ if (idx !== -1) this._onSelectionChange.splice(idx, 1);
116
+ };
117
+ }
118
+
119
+ _rebuild() {
120
+ // Consumers call buildGroups() as needed; listeners hear that the filters changed.
121
+ for (const cb of this._onFilterChange ?? []) cb(this);
122
+ }
123
+
124
+ /** Whether any filter is on (text, type, specialization or property). */
125
+ get filtering() {
126
+ return !!(this._filterText || this._typeFilter?.size || this._specializationFilter?.size || this._propertyFilter?.size);
127
+ }
128
+
129
+ /**
130
+ * The model elements the tree's filters keep (over the whole model, not
131
+ * one view), or null when no filter is on.
132
+ * @returns {Set<string>|null}
133
+ */
134
+ matchingElementIds() {
135
+ if (!this.filtering) return null;
136
+ const groups = this._mode.buildGroups(this.model, {
137
+ filterText: this._filterText, typeIds: this._typeFilter,
138
+ specializationIds: this._specializationFilter, propertyIds: this._propertyFilter,
139
+ });
140
+ const ids = new Set();
141
+ const walk = (items) => { for (const item of items ?? []) { if (item.kind === 'element') ids.add(item.id); walk(item.items); walk(item.children); } };
142
+ for (const group of groups) walk(group.items);
143
+ return ids;
144
+ }
145
+
146
+ /** Call `fn(tree)` whenever a filter changes. Returns an unsubscribe function. */
147
+ onFilterChange(fn) {
148
+ (this._onFilterChange ??= []).push(fn);
149
+ return () => { this._onFilterChange = this._onFilterChange.filter(f => f !== fn); };
150
+ }
151
+
152
+ _notifySelectionChange() {
153
+ const data = {
154
+ id: this._selectedId,
155
+ kind: this._selectedKind,
156
+ element: this._selectedKind === 'element' ? this.model.getElement(this._selectedId) : null,
157
+ relationship: this._selectedKind === 'relationship' ? this.model.getRelationship(this._selectedId) : null,
158
+ view: this._selectedKind === 'view' ? this.model.getView?.(this._selectedId) : null,
159
+ };
160
+ for (const cb of this._onSelectionChange) {
161
+ cb(data);
162
+ }
163
+ }
164
+ }