@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.
- package/LICENSE +21 -0
- package/README.md +203 -2
- package/REFERENCE.md +2198 -0
- package/dist/renderengine-workspace.umd.js +46905 -0
- package/dist/renderengine.umd.js +42223 -0
- package/examples/archimate.html +66 -0
- package/examples/diagram-editor.html +51 -0
- package/package.json +65 -4
- package/src/BaseRenderer.js +57 -0
- package/src/CanvasRenderer.js +194 -0
- package/src/Mat4.js +111 -0
- package/src/OrbitCamera.js +57 -0
- package/src/RendererFactory.js +50 -0
- package/src/SVGRenderer.js +439 -0
- package/src/archimate.js +723 -0
- package/src/archimateArchiFormat.js +1693 -0
- package/src/archimateArchiTypes.js +72 -0
- package/src/archimateArchive.js +140 -0
- package/src/archimateCSV.js +127 -0
- package/src/archimateDrawio.js +182 -0
- package/src/archimateExchangeFormat.js +546 -0
- package/src/archimateRelationshipTable.js +93 -0
- package/src/archimateSpecializations.js +161 -0
- package/src/chartCatalog.js +589 -0
- package/src/charting/ArchimateDiagramEditor.js +1624 -0
- package/src/charting/ArchimateSpecializationSelector.js +134 -0
- package/src/charting/Axis.js +68 -0
- package/src/charting/CameraSeeder.js +30 -0
- package/src/charting/CatalogDialog.js +92 -0
- package/src/charting/Chart.js +37 -0
- package/src/charting/Chart3D.js +99 -0
- package/src/charting/ChartBox.js +80 -0
- package/src/charting/ChartData.js +27 -0
- package/src/charting/ChartRegistry.js +76 -0
- package/src/charting/CheckboxTreeSelector.js +304 -0
- package/src/charting/ColorField.js +107 -0
- package/src/charting/ColorPalette.js +88 -0
- package/src/charting/CommandHistory.js +176 -0
- package/src/charting/DataFilter.js +52 -0
- package/src/charting/Diagram.js +36 -0
- package/src/charting/Diagram3D.js +29 -0
- package/src/charting/DiagramClipboard.js +31 -0
- package/src/charting/DiagramEditor.js +3330 -0
- package/src/charting/DiagramEditorCommand.js +110 -0
- package/src/charting/DiagramEditorCommands.js +237 -0
- package/src/charting/DiagramEditorEdgeCommands.js +142 -0
- package/src/charting/DiagramEditorState.js +98 -0
- package/src/charting/DiagramRegistry.js +86 -0
- package/src/charting/DiagramTypeRegistry.js +326 -0
- package/src/charting/DiagramViewPropertiesDialog.js +46 -0
- package/src/charting/Edge.js +113 -0
- package/src/charting/ErrorBars.js +37 -0
- package/src/charting/FilterSystem.js +285 -0
- package/src/charting/FindReplaceDialog.js +139 -0
- package/src/charting/FormDialog.js +385 -0
- package/src/charting/Gauge.js +58 -0
- package/src/charting/Hierarchy.js +175 -0
- package/src/charting/HintPanel.js +86 -0
- package/src/charting/ImageSelector.js +148 -0
- package/src/charting/InteractionManager.js +725 -0
- package/src/charting/Legend.js +58 -0
- package/src/charting/MenuBar.js +62 -0
- package/src/charting/ModelFileFormat.js +115 -0
- package/src/charting/OrbitControls.js +77 -0
- package/src/charting/Palette.js +119 -0
- package/src/charting/PopupMenu.js +117 -0
- package/src/charting/PropertiesPanel.js +155 -0
- package/src/charting/PropertyListEditor.js +96 -0
- package/src/charting/PropertyLog.js +92 -0
- package/src/charting/SettingsCascade.js +93 -0
- package/src/charting/SettingsDialog.js +53 -0
- package/src/charting/SettingsManager.js +179 -0
- package/src/charting/SettingsViewPropertiesDialog.js +58 -0
- package/src/charting/ShapePaths.js +27 -0
- package/src/charting/Statistics.js +134 -0
- package/src/charting/TemplateCatalog.js +59 -0
- package/src/charting/TemplateLibrary.js +103 -0
- package/src/charting/TextStyle.js +168 -0
- package/src/charting/ViewFit.js +55 -0
- package/src/charting/ViewMenu.js +70 -0
- package/src/charting/ViewPropertiesDialog.js +77 -0
- package/src/charting/ViewTabStrip.js +81 -0
- package/src/charting/archimate/ArchiFileFormat.js +32 -0
- package/src/charting/archimate/ArchimateCanvasEditor.js +815 -0
- package/src/charting/archimate/ArchimateCsvFileFormat.js +35 -0
- package/src/charting/archimate/ArchimateEdge.js +137 -0
- package/src/charting/archimate/ArchimateElementTemplate.js +195 -0
- package/src/charting/archimate/ArchimatePalette.js +102 -0
- package/src/charting/archimate/CsvImportDialog.js +105 -0
- package/src/charting/archimate/CustomViewpoints.js +74 -0
- package/src/charting/archimate/DerivedEdge.js +29 -0
- package/src/charting/archimate/DrawioFileFormat.js +24 -0
- package/src/charting/archimate/ElementFilterRule.js +21 -0
- package/src/charting/archimate/ExchangeFileFormat.js +28 -0
- package/src/charting/archimate/ViewGroupTemplate.js +137 -0
- package/src/charting/archimate/ViewLineEdge.js +84 -0
- package/src/charting/archimate/ViewpointRule.js +45 -0
- package/src/charting/archimate/archimateFileFormats.js +12 -0
- package/src/charting/archimate/archimateNames.js +5 -0
- package/src/charting/archimate/csvMapping.js +122 -0
- package/src/charting/archimate/elementMenuItems.js +32 -0
- package/src/charting/archimate/elementProperties.js +146 -0
- package/src/charting/archimate/elementTypeChoices.js +7 -0
- package/src/charting/archimate/elementTypeGroups.js +19 -0
- package/src/charting/archimate/index.js +17 -0
- package/src/charting/archimate/specializationCatalogDialog.js +64 -0
- package/src/charting/archimate/typeGlyph.js +29 -0
- package/src/charting/arrangement/Arrangement.js +112 -0
- package/src/charting/arrangement/ArrangementCommand.js +29 -0
- package/src/charting/arrangement/BackgroundCommand.js +41 -0
- package/src/charting/arrangement/BackgroundGroup.js +18 -0
- package/src/charting/arrangement/GroupCommand.js +46 -0
- package/src/charting/arrangement/ItemGroup.js +62 -0
- package/src/charting/arrangement/LockCommand.js +32 -0
- package/src/charting/arrangement/UngroupCommand.js +27 -0
- package/src/charting/arrangement/alignment.js +88 -0
- package/src/charting/arrangement/arrangeMenuItems.js +25 -0
- package/src/charting/arrangement/index.js +11 -0
- package/src/charting/arrangement/layouts.js +233 -0
- package/src/charting/canvas/ArchiHint.js +78 -0
- package/src/charting/canvas/CanvasBoxKind.js +39 -0
- package/src/charting/canvas/CanvasPalette.js +49 -0
- package/src/charting/canvas/CanvasTemplateLibrary.js +61 -0
- package/src/charting/canvas/CanvasTemplateMenu.js +151 -0
- package/src/charting/canvas/EditHintCommand.js +28 -0
- package/src/charting/canvas/canvasBoxKinds.js +27 -0
- package/src/charting/canvas/canvasBoxMenuItems.js +40 -0
- package/src/charting/canvas/defaultCanvasTemplates.js +186 -0
- package/src/charting/canvas/diagramBoxKinds.js +12 -0
- package/src/charting/canvas/hintMenuItems.js +49 -0
- package/src/charting/charts/ArcGauge.js +55 -0
- package/src/charting/charts/AreaChart.js +71 -0
- package/src/charting/charts/BarChart.js +80 -0
- package/src/charting/charts/BarChart3D.js +56 -0
- package/src/charting/charts/BarChart3DOrbit.js +53 -0
- package/src/charting/charts/BarChartBase.js +70 -0
- package/src/charting/charts/BarGauge.js +42 -0
- package/src/charting/charts/BoxPlotChart.js +41 -0
- package/src/charting/charts/BubbleChart.js +99 -0
- package/src/charting/charts/BubbleChart3D.js +78 -0
- package/src/charting/charts/BulletGauge.js +87 -0
- package/src/charting/charts/CalendarHeatmapChart.js +204 -0
- package/src/charting/charts/CandlestickChart.js +54 -0
- package/src/charting/charts/ChordDiagram.js +130 -0
- package/src/charting/charts/DensityChart.js +73 -0
- package/src/charting/charts/DialGauge.js +65 -0
- package/src/charting/charts/DonutChart.js +15 -0
- package/src/charting/charts/FunnelChart.js +47 -0
- package/src/charting/charts/GanttChart.js +201 -0
- package/src/charting/charts/GaugeChart.js +175 -0
- package/src/charting/charts/GeoMapChart.js +146 -0
- package/src/charting/charts/GroupedBarChart.js +88 -0
- package/src/charting/charts/GroupedDistributionChart.js +70 -0
- package/src/charting/charts/HeatmapChart.js +80 -0
- package/src/charting/charts/HierarchyChart.js +39 -0
- package/src/charting/charts/HistogramChart.js +45 -0
- package/src/charting/charts/KpiTile.js +72 -0
- package/src/charting/charts/LagPlotChart.js +41 -0
- package/src/charting/charts/LineChart.js +124 -0
- package/src/charting/charts/MultiRingGauge.js +54 -0
- package/src/charting/charts/OutlineChart.js +95 -0
- package/src/charting/charts/ParallelCoordinatesChart.js +130 -0
- package/src/charting/charts/PieChart.js +56 -0
- package/src/charting/charts/PipeChart.js +88 -0
- package/src/charting/charts/PopulationPyramidChart.js +106 -0
- package/src/charting/charts/QQPlotChart.js +64 -0
- package/src/charting/charts/RadarChart.js +76 -0
- package/src/charting/charts/RadialBarChart.js +96 -0
- package/src/charting/charts/RingGauge.js +23 -0
- package/src/charting/charts/SankeyDiagram.js +174 -0
- package/src/charting/charts/ScatterChart.js +104 -0
- package/src/charting/charts/StackedAreaChart.js +15 -0
- package/src/charting/charts/StackedBarChart.js +33 -0
- package/src/charting/charts/StackedBarChart3DOrbit.js +58 -0
- package/src/charting/charts/StreamGraphChart.js +131 -0
- package/src/charting/charts/SunburstChart.js +57 -0
- package/src/charting/charts/ThermometerGauge.js +43 -0
- package/src/charting/charts/TreemapChart.js +54 -0
- package/src/charting/charts/ViolinChart.js +37 -0
- package/src/charting/charts/WaterfallChart.js +66 -0
- package/src/charting/charts/WordCloudChart.js +104 -0
- package/src/charting/diagramModel/AddViewCommand.js +33 -0
- package/src/charting/diagramModel/DiagramModel.js +39 -0
- package/src/charting/diagramModel/DiagramModelSearch.js +22 -0
- package/src/charting/diagramModel/DiagramView.js +50 -0
- package/src/charting/diagramModel/ModelHistory.js +43 -0
- package/src/charting/diagramModel/ModelReport.js +153 -0
- package/src/charting/diagramModel/ModelSearch.js +223 -0
- package/src/charting/diagramModel/RemoveViewCommand.js +25 -0
- package/src/charting/diagramModel/RenameViewCommand.js +21 -0
- package/src/charting/diagramModel/ReplaceTextCommand.js +25 -0
- package/src/charting/diagramModel/ViewSetChecker.js +34 -0
- package/src/charting/diagramModel/ViewSetModel.js +243 -0
- package/src/charting/diagramModel/index.js +6 -0
- package/src/charting/diagramModel/nameTransforms.js +29 -0
- package/src/charting/diagrams/ArchimateCommands.js +141 -0
- package/src/charting/diagrams/ArchimateDiagram.js +263 -0
- package/src/charting/diagrams/ArchimateModel.js +1155 -0
- package/src/charting/diagrams/ArchimateModelChecker.js +125 -0
- package/src/charting/diagrams/ArchimateModelReport.js +128 -0
- package/src/charting/diagrams/ArchimateModelSearch.js +41 -0
- package/src/charting/diagrams/ArchimateValidator.js +357 -0
- package/src/charting/diagrams/CanvasView.js +112 -0
- package/src/charting/diagrams/ContextMenu.js +37 -0
- package/src/charting/diagrams/DataModelDiagram.js +86 -0
- package/src/charting/diagrams/DataModelRelationshipStrategy.js +38 -0
- package/src/charting/diagrams/DerivedRelationships.js +102 -0
- package/src/charting/diagrams/EbnfDiagram.js +39 -0
- package/src/charting/diagrams/EdgeGeometry.js +553 -0
- package/src/charting/diagrams/EditViewItemCommand.js +128 -0
- package/src/charting/diagrams/ElementInstance.js +157 -0
- package/src/charting/diagrams/GraphDiagram.js +1340 -0
- package/src/charting/diagrams/GraphDiagram3D.js +152 -0
- package/src/charting/diagrams/GraphMetrics.js +81 -0
- package/src/charting/diagrams/GridOverlay.js +137 -0
- package/src/charting/diagrams/ImportRowsCommand.js +62 -0
- package/src/charting/diagrams/LabelHelper.js +108 -0
- package/src/charting/diagrams/MergeElementsCommand.js +101 -0
- package/src/charting/diagrams/NestInstanceCommand.js +34 -0
- package/src/charting/diagrams/NodeGeometry.js +158 -0
- package/src/charting/diagrams/PlaceItemsCommand.js +77 -0
- package/src/charting/diagrams/RadialLayout.js +101 -0
- package/src/charting/diagrams/RelationshipInstance.js +93 -0
- package/src/charting/diagrams/RemoveGroupFromViewCommand.js +28 -0
- package/src/charting/diagrams/RemoveLineCommand.js +27 -0
- package/src/charting/diagrams/ShowElementCommand.js +43 -0
- package/src/charting/diagrams/SvgCoordinate.js +17 -0
- package/src/charting/diagrams/SvgZoom.js +127 -0
- package/src/charting/diagrams/Tooltip.js +62 -0
- package/src/charting/diagrams/ViewConnectionInstance.js +102 -0
- package/src/charting/diagrams/ViewObjectInstance.js +56 -0
- package/src/charting/diagrams/commands/AddEdgeCommand.js +34 -0
- package/src/charting/diagrams/commands/AddNodeCommand.js +28 -0
- package/src/charting/diagrams/commands/AddWaypointCommand.js +27 -0
- package/src/charting/diagrams/commands/CreateFolderCommand.js +27 -0
- package/src/charting/diagrams/commands/DeleteEdgeCommand.js +30 -0
- package/src/charting/diagrams/commands/DeleteFolderCommand.js +47 -0
- package/src/charting/diagrams/commands/DeleteNodeCommand.js +35 -0
- package/src/charting/diagrams/commands/DeleteWaypointCommand.js +24 -0
- package/src/charting/diagrams/commands/GraphCommand.js +65 -0
- package/src/charting/diagrams/commands/InvertEdgeCommand.js +24 -0
- package/src/charting/diagrams/commands/MoveNodeCommand.js +44 -0
- package/src/charting/diagrams/commands/MoveWaypointCommand.js +27 -0
- package/src/charting/diagrams/commands/RenameEdgeCommand.js +23 -0
- package/src/charting/diagrams/commands/RenameFolderCommand.js +31 -0
- package/src/charting/diagrams/commands/RenameNodeCommand.js +27 -0
- package/src/charting/diagrams/commands/ResizeNodeCommand.js +46 -0
- package/src/charting/diagrams/commands/UpdateEdgeSideCommand.js +40 -0
- package/src/charting/diagrams/commands/index.js +17 -0
- package/src/charting/diagrams/duplicates.js +49 -0
- package/src/charting/diagrams/nesting.js +30 -0
- package/src/charting/diagrams/roadmap.js +77 -0
- package/src/charting/edgeMarkers/ArrowMarker.js +15 -0
- package/src/charting/edgeMarkers/CircleMarker.js +13 -0
- package/src/charting/edgeMarkers/CrowsFootMarker.js +16 -0
- package/src/charting/edgeMarkers/DiamondMarker.js +15 -0
- package/src/charting/edgeMarkers/EdgeMarker.js +34 -0
- package/src/charting/edgeMarkers/HalfArrowMarker.js +8 -0
- package/src/charting/edgeMarkers/HollowDiamondMarker.js +18 -0
- package/src/charting/edgeMarkers/HollowTriangleMarker.js +18 -0
- package/src/charting/edgeMarkers/OpenArrowMarker.js +17 -0
- package/src/charting/edgeMarkers/index.js +27 -0
- package/src/charting/edgeStyle/EdgeStyleCascade.js +22 -0
- package/src/charting/edgeStyle/EdgeStyleDialog.js +51 -0
- package/src/charting/edgeStyle/EdgeStyleSchema.js +43 -0
- package/src/charting/edgeStyle/SetStyleCommand.js +12 -0
- package/src/charting/edgeStyle/index.js +4 -0
- package/src/charting/emphasis/EmphasisRule.js +42 -0
- package/src/charting/emphasis/HighlightRule.js +24 -0
- package/src/charting/gauges/ArcTrack.js +51 -0
- package/src/charting/gauges/GaugeAnimation.js +51 -0
- package/src/charting/gauges/GaugeBands.js +48 -0
- package/src/charting/gauges/GaugeScale.js +87 -0
- package/src/charting/gauges/GaugeTrack.js +44 -0
- package/src/charting/gauges/GaugeValue.js +61 -0
- package/src/charting/gauges/HorizontalTrack.js +14 -0
- package/src/charting/gauges/LinearTrack.js +29 -0
- package/src/charting/gauges/Sparkline.js +42 -0
- package/src/charting/gauges/VerticalTrack.js +17 -0
- package/src/charting/glyphs/ArrowGlyph.js +21 -0
- package/src/charting/glyphs/BatteryGlyph.js +18 -0
- package/src/charting/glyphs/ChevronGlyph.js +18 -0
- package/src/charting/glyphs/CircleGlyph.js +15 -0
- package/src/charting/glyphs/CloudGlyph.js +19 -0
- package/src/charting/glyphs/ComponentGlyph.js +18 -0
- package/src/charting/glyphs/ConstraintGlyph.js +24 -0
- package/src/charting/glyphs/ContractBoxGlyph.js +10 -0
- package/src/charting/glyphs/CubeGlyph.js +19 -0
- package/src/charting/glyphs/CylinderGlyph.js +19 -0
- package/src/charting/glyphs/DashedDoubleArrowGlyph.js +11 -0
- package/src/charting/glyphs/DeviceGlyph.js +17 -0
- package/src/charting/glyphs/DiamondGlyph.js +17 -0
- package/src/charting/glyphs/DocumentGlyph.js +17 -0
- package/src/charting/glyphs/DoubleArrowGlyph.js +23 -0
- package/src/charting/glyphs/DoubleCircleGlyph.js +24 -0
- package/src/charting/glyphs/EllipseGlyph.js +18 -0
- package/src/charting/glyphs/FactoryGlyph.js +20 -0
- package/src/charting/glyphs/FlagGlyph.js +16 -0
- package/src/charting/glyphs/GapCircleGlyph.js +17 -0
- package/src/charting/glyphs/GearGlyph.js +37 -0
- package/src/charting/glyphs/Glyph.js +98 -0
- package/src/charting/glyphs/GroupingBoxGlyph.js +13 -0
- package/src/charting/glyphs/HalfCircleGlyph.js +22 -0
- package/src/charting/glyphs/HexagonGlyph.js +28 -0
- package/src/charting/glyphs/IconGlyph.js +22 -0
- package/src/charting/glyphs/ImageGlyph.js +16 -0
- package/src/charting/glyphs/JunctionGlyph.js +17 -0
- package/src/charting/glyphs/LollipopGlyph.js +22 -0
- package/src/charting/glyphs/MagnifierGlyph.js +17 -0
- package/src/charting/glyphs/NoteGlyph.js +33 -0
- package/src/charting/glyphs/ObjectBoxGlyph.js +21 -0
- package/src/charting/glyphs/OrJunctionGlyph.js +17 -0
- package/src/charting/glyphs/ParallelogramGlyph.js +20 -0
- package/src/charting/glyphs/PersonGlyph.js +23 -0
- package/src/charting/glyphs/PillGlyph.js +23 -0
- package/src/charting/glyphs/PinGlyph.js +18 -0
- package/src/charting/glyphs/PrincipleGlyph.js +23 -0
- package/src/charting/glyphs/ProductBoxGlyph.js +16 -0
- package/src/charting/glyphs/RectGlyph.js +15 -0
- package/src/charting/glyphs/RoundedBoxGlyph.js +13 -0
- package/src/charting/glyphs/StackGlyph.js +14 -0
- package/src/charting/glyphs/StepsGlyph.js +20 -0
- package/src/charting/glyphs/StickFigureGlyph.js +32 -0
- package/src/charting/glyphs/SystemSoftwareBoxGlyph.js +16 -0
- package/src/charting/glyphs/TabbedBoxGlyph.js +37 -0
- package/src/charting/glyphs/TargetGlyph.js +23 -0
- package/src/charting/glyphs/WavyBoxGlyph.js +17 -0
- package/src/charting/glyphs/WheelGlyph.js +28 -0
- package/src/charting/glyphs/drawGlyph.js +28 -0
- package/src/charting/glyphs/glyphSvg.js +55 -0
- package/src/charting/glyphs/index.js +109 -0
- package/src/charting/modelTree/AnalysisPanel.js +159 -0
- package/src/charting/modelTree/DiagramTabs.js +217 -0
- package/src/charting/modelTree/ModelTree.js +164 -0
- package/src/charting/modelTree/ModelTreePanel.js +914 -0
- package/src/charting/modelTree/TreeBuilder.js +238 -0
- package/src/charting/modelTree/TreeModeRegistry.js +51 -0
- package/src/charting/modelTree/TreeViewMode.js +110 -0
- package/src/charting/modelTree/buildFilterTrees.js +138 -0
- package/src/charting/modelTree/modes/FlatTreeMode.js +46 -0
- package/src/charting/modelTree/modes/LayerGroupedTreeMode.js +62 -0
- package/src/charting/modelTree/modes/TypeGroupedTreeMode.js +60 -0
- package/src/charting/modelTree/treeLayers.js +11 -0
- package/src/charting/report/reportHtml.js +82 -0
- package/src/charting/report/reportViewer.js +118 -0
- package/src/charting/shapes/CircleShape.js +19 -0
- package/src/charting/shapes/PathShape.js +17 -0
- package/src/charting/shapes/RectShape.js +20 -0
- package/src/charting/shapes/Shape.js +20 -0
- package/src/charting/shapes/ShapeFactory.js +23 -0
- package/src/charting/storage/LocalJsonStore.js +43 -0
- package/src/charting/templates/ActorTemplate.js +36 -0
- package/src/charting/templates/BoxTemplate.js +27 -0
- package/src/charting/templates/CircleTemplate.js +18 -0
- package/src/charting/templates/ClassTemplate.js +20 -0
- package/src/charting/templates/CloudTemplate.js +43 -0
- package/src/charting/templates/ComponentTemplate.js +19 -0
- package/src/charting/templates/CylinderTemplate.js +30 -0
- package/src/charting/templates/DataStoreTemplate.js +16 -0
- package/src/charting/templates/DiamondTemplate.js +10 -0
- package/src/charting/templates/DocumentTemplate.js +32 -0
- package/src/charting/templates/EllipseTemplate.js +15 -0
- package/src/charting/templates/FinalStateTemplate.js +12 -0
- package/src/charting/templates/GlyphTemplate.js +47 -0
- package/src/charting/templates/HexagonTemplate.js +17 -0
- package/src/charting/templates/LifelineTemplate.js +20 -0
- package/src/charting/templates/ManualInputTemplate.js +12 -0
- package/src/charting/templates/NoteTemplate.js +23 -0
- package/src/charting/templates/OctagonTemplate.js +7 -0
- package/src/charting/templates/PackageTemplate.js +25 -0
- package/src/charting/templates/ParallelogramTemplate.js +11 -0
- package/src/charting/templates/PentagonTemplate.js +5 -0
- package/src/charting/templates/PolygonTemplate.js +18 -0
- package/src/charting/templates/PredefinedProcessTemplate.js +13 -0
- package/src/charting/templates/RectangleTemplate.js +28 -0
- package/src/charting/templates/RegularPolygonTemplate.js +21 -0
- package/src/charting/templates/RoundedRectangleTemplate.js +5 -0
- package/src/charting/templates/StadiumTemplate.js +8 -0
- package/src/charting/templates/StarTemplate.js +17 -0
- package/src/charting/templates/SwimlaneTemplate.js +18 -0
- package/src/charting/templates/Template.js +208 -0
- package/src/charting/templates/TrapezoidTemplate.js +11 -0
- package/src/charting/templates/TriangleTemplate.js +12 -0
- package/src/charting/templates/index.js +31 -0
- package/src/charting/templates/outline.js +59 -0
- package/src/charting/templates/svg.js +19 -0
- package/src/charting/textToShapes.js +61 -0
- package/src/charting/toolbar/ToolbarButton.js +38 -0
- package/src/charting/toolbar/ToolbarCheckbox.js +31 -0
- package/src/charting/toolbar/ToolbarItem.js +19 -0
- package/src/charting/toolbar/ToolbarMenu.js +36 -0
- package/src/charting/toolbar/ToolbarSelect.js +38 -0
- package/src/charting/toolbar/ToolbarSeparator.js +7 -0
- package/src/charting/toolbar/ToolbarText.js +22 -0
- package/src/charting/toolbar/index.js +8 -0
- package/src/charting/toolbar/pickFile.js +14 -0
- package/src/charting/viewDecorations.js +85 -0
- package/src/charting/zOrder.js +57 -0
- package/src/csvTable.js +61 -0
- package/src/datamodel.js +122 -0
- package/src/datawindow/BoundedWindow.js +36 -0
- package/src/datawindow/FlatDataWindow.js +34 -0
- package/src/datawindow/GraphDataWindow.js +40 -0
- package/src/datawindow/GroupedSampleDataWindow.js +16 -0
- package/src/datawindow/SeriesDataWindow.js +42 -0
- package/src/datawindow/index.js +31 -0
- package/src/diagramCatalog.js +30 -0
- package/src/ebnfDiagram.js +57 -0
- package/src/ebnfParser.js +129 -0
- package/src/exportImage.js +233 -0
- package/src/index.js +2636 -0
- package/src/itIcons.js +84 -0
- package/src/kernelExpr.js +243 -0
- package/src/propertiesDialog.js +463 -0
- package/src/railroadDiagram.js +571 -0
- package/src/treeModeCatalog.js +16 -0
- package/src/workspace/ContextBus.js +79 -0
- package/src/workspace/EditorShell.js +67 -0
- package/src/workspace/Part.js +163 -0
- package/src/workspace/PartFactory.js +49 -0
- package/src/workspace/PartRegistry.js +86 -0
- package/src/workspace/Workspace.js +321 -0
- package/src/workspace/archimateServices.js +33 -0
- package/src/workspace/dom.js +120 -0
- package/src/workspace/index.js +75 -0
- package/src/workspace/layout/GridNode.js +280 -0
- package/src/workspace/layout/LayoutNode.js +89 -0
- package/src/workspace/layout/PartNode.js +77 -0
- package/src/workspace/layout/SplitNode.js +114 -0
- package/src/workspace/layout/TabsNode.js +191 -0
- package/src/workspace/layout/index.js +24 -0
- package/src/workspace/parts/AdapterPart.js +33 -0
- package/src/workspace/parts/ArchimateCanvasPart.js +345 -0
- package/src/workspace/parts/ArchimateEditorPart.js +79 -0
- package/src/workspace/parts/ChartPart.js +115 -0
- package/src/workspace/parts/ContentPart.js +34 -0
- package/src/workspace/parts/DetailPart.js +46 -0
- package/src/workspace/parts/DiagramEditorPart.js +135 -0
- package/src/workspace/parts/EditorPart.js +388 -0
- package/src/workspace/parts/HtmlPart.js +25 -0
- package/src/workspace/parts/ListPart.js +57 -0
- package/src/workspace/parts/ModelFile.js +187 -0
- package/src/workspace/parts/ModelsPart.js +135 -0
- package/src/workspace/styles.js +258 -0
- package/src/workspace/themes.js +96 -0
- package/src/workspace/workArea.js +413 -0
- package/src/workspace/workAreaModel.js +197 -0
- package/src/workspace.js +16 -0
- package/src/zip/ZipArchive.js +160 -0
- package/src/zip/crc32.js +25 -0
- package/src/zip/inflate.js +159 -0
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
/*
|
|
2
|
+
This is a simplified implementation based on the excellent railroad-diagrams library by Tab Atkins.
|
|
3
|
+
Original project: https://github.com/tabatkins/railroad-diagrams
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export function Diagram(...items) {
|
|
7
|
+
return new DiagramNode('Diagram', { items: wrapAndFlatten(items) });
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function Sequence(...items) {
|
|
11
|
+
return new DiagramNode('Sequence', { items: wrapAndFlatten(items) });
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function Choice(normal, ...items) {
|
|
15
|
+
return new DiagramNode('Choice', { normal, items: wrapAndFlatten(items) });
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function Optional(item, skip) {
|
|
19
|
+
return new DiagramNode('Optional', { item: wrap(item), skip });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function OneOrMore(item, repeat) {
|
|
23
|
+
return new DiagramNode('OneOrMore', { item: wrap(item), repeat: wrap(repeat) });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function ZeroOrMore(item, repeat, skip) {
|
|
27
|
+
return new DiagramNode('ZeroOrMore', { item: wrap(item), repeat: wrap(repeat), skip });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function Terminal(text, href, title) {
|
|
31
|
+
return new DiagramNode('Terminal', { text, href, title });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function NonTerminal(text, href, title) {
|
|
35
|
+
return new DiagramNode('NonTerminal', { text, href, title });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function Comment(text, href, title) {
|
|
39
|
+
return new DiagramNode('Comment', { text, href, title });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function Skip() {
|
|
43
|
+
return new DiagramNode('Skip');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function Difference(item1, item2) {
|
|
47
|
+
return new DiagramNode('Difference', { item1: wrap(item1), item2: wrap(item2) });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class DiagramNode {
|
|
52
|
+
constructor(type, data = {}) {
|
|
53
|
+
this.type = type;
|
|
54
|
+
Object.assign(this, data);
|
|
55
|
+
this.needsSpace = false;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
format() {
|
|
59
|
+
// This is a placeholder for a method that would typically handle layout calculations.
|
|
60
|
+
// In our case, the rendering logic is in the RenderEngine's renderers.
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
walk(cb) {
|
|
65
|
+
cb(this);
|
|
66
|
+
for (const key of ['item', 'item1', 'item2', 'repeat']) {
|
|
67
|
+
if (this[key] && this[key].walk) {
|
|
68
|
+
this[key].walk(cb);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (this.items) {
|
|
72
|
+
this.items.forEach(item => item.walk && item.walk(cb));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
addTo(parent) {
|
|
77
|
+
if (parent) {
|
|
78
|
+
parent.items = parent.items || [];
|
|
79
|
+
parent.items.push(this);
|
|
80
|
+
}
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function wrap(item) {
|
|
86
|
+
return typeof item === 'string' ? new Terminal(item) : item;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function wrapAndFlatten(items) {
|
|
90
|
+
return items.flat(Infinity).map(wrap);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
/*
|
|
95
|
+
The following are simple stubs for the formatting part of the original library.
|
|
96
|
+
The actual rendering is handled by SVGRenderer and CanvasRenderer.
|
|
97
|
+
*/
|
|
98
|
+
|
|
99
|
+
// Every node — regardless of which factory function built it (Terminal,
|
|
100
|
+
// Sequence, Choice, ...) — is constructed via `new DiagramNode(type, data)`
|
|
101
|
+
// directly (see the factory functions above), never `new Terminal(...)`
|
|
102
|
+
// etc. So every instance's real prototype is DiagramNode.prototype, full
|
|
103
|
+
// stop; per-type `Terminal.prototype`/`Choice.prototype`/... objects are
|
|
104
|
+
// never actually consulted by JS's own prototype-chain lookup. Dispatch by
|
|
105
|
+
// `.type` explicitly instead, via this table, rather than (as this file
|
|
106
|
+
// used to) aliasing every factory's `.prototype` to the SAME
|
|
107
|
+
// DiagramNode.prototype object and assigning `.format` on it once per
|
|
108
|
+
// type — each such assignment silently overwrote the previous one, so only
|
|
109
|
+
// the last one (Skip's, a complete no-op) ever actually ran, for every
|
|
110
|
+
// node type. `Difference` has no entry — never implemented in this
|
|
111
|
+
// simplified port; hitting it throws a clear error below rather than
|
|
112
|
+
// silently doing nothing.
|
|
113
|
+
const FORMATTERS = {};
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
/*
|
|
117
|
+
This section would normally contain complex SVG path generation logic.
|
|
118
|
+
Since our RenderEngine handles drawing, we can omit the complex parts.
|
|
119
|
+
The classes and their structure are what's important for the EBNFEngine and RenderEngine to work together.
|
|
120
|
+
*/
|
|
121
|
+
|
|
122
|
+
// A plain object factory, not a `this`-dependent constructor — every call
|
|
123
|
+
// site invokes this as `FakeSVG(...)` (no `new`), and this file is an ES
|
|
124
|
+
// module (strict mode), where a non-`new` call has `this === undefined`;
|
|
125
|
+
// the old `if (text) this.text = text; return this;` body either threw
|
|
126
|
+
// (assigning onto undefined) or returned undefined outright, so the very
|
|
127
|
+
// next `.addTo(...)` in the same expression always failed. Sets attrs
|
|
128
|
+
// BOTH flat on the object (`item.x`, `item.width`, ... — what
|
|
129
|
+
// SVGRenderer.renderDiagram reads) and nested under `.attrs` (`item.attrs.x`,
|
|
130
|
+
// ... — what this file's own DiagramNode.prototype.drawOn Canvas path
|
|
131
|
+
// reads) so both renderer backends work off one shape.
|
|
132
|
+
function FakeSVG(tagName, attrs = {}, text) {
|
|
133
|
+
// Built on DiagramNode.prototype purely for its generic .addTo() (every
|
|
134
|
+
// call site immediately does `FakeSVG(...).addTo(parentNode)`) — these
|
|
135
|
+
// are leaf rendering primitives (rect/text/path/svg/style), never
|
|
136
|
+
// DiagramNode-tree nodes themselves, so inheriting .format()'s
|
|
137
|
+
// FORMATTERS dispatch is inert (nothing calls .format() on one).
|
|
138
|
+
const el = Object.assign(Object.create(DiagramNode.prototype), { type: tagName, tagName, attrs });
|
|
139
|
+
Object.assign(el, attrs);
|
|
140
|
+
if (text) el.text = text;
|
|
141
|
+
return el;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function determineGaps(outer, inner) {
|
|
145
|
+
var diff = outer - inner;
|
|
146
|
+
switch (diff % 2) {
|
|
147
|
+
case 0:
|
|
148
|
+
return [diff / 2, diff / 2];
|
|
149
|
+
case 1:
|
|
150
|
+
return [Math.floor(diff / 2), Math.ceil(diff / 2)];
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function Path(x, y) {
|
|
155
|
+
this.x = x;
|
|
156
|
+
this.y = y;
|
|
157
|
+
this.attrs = {
|
|
158
|
+
d: "M" + x + " " + y
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
Path.prototype.m = function (x, y) {
|
|
162
|
+
this.attrs.d += "m" + x + " " + y;
|
|
163
|
+
return this;
|
|
164
|
+
};
|
|
165
|
+
Path.prototype.h = function (val) {
|
|
166
|
+
this.attrs.d += "h" + val;
|
|
167
|
+
return this;
|
|
168
|
+
};
|
|
169
|
+
Path.prototype.right = Path.prototype.h;
|
|
170
|
+
Path.prototype.left = function (val) {
|
|
171
|
+
return this.h(-val);
|
|
172
|
+
};
|
|
173
|
+
Path.prototype.v = function (val) {
|
|
174
|
+
this.attrs.d += "v" + val;
|
|
175
|
+
return this;
|
|
176
|
+
};
|
|
177
|
+
Path.prototype.down = Path.prototype.v;
|
|
178
|
+
Path.prototype.up = function (val) {
|
|
179
|
+
return this.v(-val);
|
|
180
|
+
};
|
|
181
|
+
// `code` is a 2-letter compass direction pair: code[0] is the direction the
|
|
182
|
+
// path is heading INTO the corner, code[1] is the direction it's heading
|
|
183
|
+
// OUT of the corner (e.g. 'se' = arriving heading south, departing heading
|
|
184
|
+
// east) — always a quarter (90 degree) turn of radius AR.
|
|
185
|
+
//
|
|
186
|
+
// Derived from first principles (not the original upstream library's own
|
|
187
|
+
// convention, and not the previous version of this function, which computed
|
|
188
|
+
// a provably wrong result — see below): for two perpendicular unit
|
|
189
|
+
// direction vectors D_in/D_out, the endpoint offset of the connecting arc is
|
|
190
|
+
// exactly AR*(D_in + D_out) — verified against 3 independently-worked
|
|
191
|
+
// examples (south-to-east, east-to-north, north-to-east) using the
|
|
192
|
+
// standard "rotate the outward radius 90 degrees" identity for circular
|
|
193
|
+
// motion. The turn is a visual right turn (clockwise, SVG sweep-flag 1) if
|
|
194
|
+
// D_out is next after D_in in the N->E->S->W->N sequence, otherwise a left
|
|
195
|
+
// turn (counterclockwise, sweep-flag 0).
|
|
196
|
+
//
|
|
197
|
+
// The previous version of this function set the LARGE-ARC-FLAG to 1 for
|
|
198
|
+
// exactly the 4 codes actually used elsewhere in this file (ne/se/sw/nw) —
|
|
199
|
+
// backwards; a large-arc-flag forces SVG to draw the *major* (270 degree)
|
|
200
|
+
// arc of the circle instead of the intended *minor* (90 degree) one,
|
|
201
|
+
// producing a huge, visually wrong loop that still technically starts/ends
|
|
202
|
+
// at the right two points, which is exactly what a "large arc" bug looks
|
|
203
|
+
// like from the outside. Every quarter-turn in this file is a minor arc, so
|
|
204
|
+
// the large-arc-flag is always 0 here — there is no case that needs 1.
|
|
205
|
+
var COMPASS = { n: [0, -1], s: [0, 1], e: [1, 0], w: [-1, 0] };
|
|
206
|
+
var CLOCKWISE_NEXT = { n: 'e', e: 's', s: 'w', w: 'n' };
|
|
207
|
+
Path.prototype.arc = function (code) {
|
|
208
|
+
var AR = 10;
|
|
209
|
+
var din = COMPASS[code[0]];
|
|
210
|
+
var dout = COMPASS[code[1]];
|
|
211
|
+
var dx = AR * (din[0] + dout[0]);
|
|
212
|
+
var dy = AR * (din[1] + dout[1]);
|
|
213
|
+
var sweepFlag = CLOCKWISE_NEXT[code[0]] === code[1] ? 1 : 0;
|
|
214
|
+
this.attrs.d += "a" + AR + " " + AR + " 0 0 " + sweepFlag + " " + dx + " " + dy;
|
|
215
|
+
return this;
|
|
216
|
+
};
|
|
217
|
+
Path.prototype.format = function () {
|
|
218
|
+
return FakeSVG("path", this.attrs);
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
function escapeString(s) {
|
|
222
|
+
if (!s) return "";
|
|
223
|
+
return s.replace(/&/g, '&')
|
|
224
|
+
.replace(/</g, '<')
|
|
225
|
+
.replace(/>/g, '>')
|
|
226
|
+
.replace(/"/g, '"')
|
|
227
|
+
.replace(/'/g, ''');
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function drawPath(item, diagram) {
|
|
231
|
+
var path = new Path(item.x, item.y);
|
|
232
|
+
var current = item;
|
|
233
|
+
while (current.type != 'Start') {
|
|
234
|
+
if (current.type === 'path') {
|
|
235
|
+
path.attrs.d = current.attrs.d + path.attrs.d;
|
|
236
|
+
}
|
|
237
|
+
[path, current] = drawPath(current.from, path);
|
|
238
|
+
}
|
|
239
|
+
return [path, current];
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function addDefaultStyles() {
|
|
243
|
+
var style = document.createElement('style');
|
|
244
|
+
style.innerText = `
|
|
245
|
+
.railroad-diagram {
|
|
246
|
+
background-color: hsl(30, 20%, 95%);
|
|
247
|
+
}
|
|
248
|
+
.railroad-diagram path {
|
|
249
|
+
stroke-width: 3;
|
|
250
|
+
stroke: black;
|
|
251
|
+
fill: rgba(0,0,0,0);
|
|
252
|
+
}
|
|
253
|
+
.railroad-diagram text {
|
|
254
|
+
font: bold 14px monospace;
|
|
255
|
+
text-anchor: middle;
|
|
256
|
+
}
|
|
257
|
+
/* ... other styles ... */
|
|
258
|
+
`;
|
|
259
|
+
return FakeSVG('style', {}, style.innerText);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
var options = {
|
|
263
|
+
VS: 8,
|
|
264
|
+
AR: 10,
|
|
265
|
+
DIAGRAM_CLASS: 'railroad-diagram',
|
|
266
|
+
STROKE_ODD_PIXEL_LENGTH: true,
|
|
267
|
+
INTERNAL_ALIGNMENT: 'center',
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
function DiagramNode_format(x, y, width) {
|
|
271
|
+
// Every format function stores its own x/y — nothing else in this file
|
|
272
|
+
// did (a separate pre-existing gap from the two bugs already fixed
|
|
273
|
+
// above), so any caller reading `item.x`/`item.y` after calling
|
|
274
|
+
// `item.format(...)` (e.g. FORMATTERS.Diagram/.Choice below, which
|
|
275
|
+
// position siblings relative to a previous item's x) got `undefined`/
|
|
276
|
+
// NaN instead of a real coordinate.
|
|
277
|
+
this.x = x; this.y = y;
|
|
278
|
+
var startX = x; // this.width below must be the DISTANCE traveled, not
|
|
279
|
+
// the absolute ending x — see the comment there.
|
|
280
|
+
// Hook up the two sides if this is a complex diagram.
|
|
281
|
+
for (var i = 0; i < this.items.length; i++) {
|
|
282
|
+
var item = this.items[i];
|
|
283
|
+
if (i > 0) {
|
|
284
|
+
// 20px gap between adjacent items — same stub width used
|
|
285
|
+
// everywhere else in this file (e.g. Choice's own x+10 option
|
|
286
|
+
// indent), doubled since there are two abutting stubs here.
|
|
287
|
+
x += 20;
|
|
288
|
+
}
|
|
289
|
+
item.format(x, y, width);
|
|
290
|
+
x += item.width;
|
|
291
|
+
}
|
|
292
|
+
// This used to be `this.width = x;` — the loop's ABSOLUTE ending
|
|
293
|
+
// x-coordinate, not the relative width traveled. Barely noticeable for
|
|
294
|
+
// a Sequence sitting near the diagram's own x=0 origin (a small, easy-
|
|
295
|
+
// to-miss constant offset), but for a Sequence nested inside Optional/
|
|
296
|
+
// Choice/ZeroOrMore — which format their children starting from
|
|
297
|
+
// whatever (large, cumulative) x they themselves were positioned at —
|
|
298
|
+
// this inflated the reported width by that entire starting offset,
|
|
299
|
+
// corrupting every sibling positioned after it in the enclosing
|
|
300
|
+
// Sequence (each subsequent item.x compounds the error further).
|
|
301
|
+
this.width = x - startX;
|
|
302
|
+
this.height = this.items.reduce((max, item) => Math.max(max, item.height), 0);
|
|
303
|
+
this.up = this.items[0].up;
|
|
304
|
+
this.down = this.items[0].down;
|
|
305
|
+
// A flat backbone line spanning the whole sequence at y connects every
|
|
306
|
+
// item (and the gaps between them) into one continuous line. This was
|
|
307
|
+
// missing entirely before — the only sibling of this code,
|
|
308
|
+
// FORMATTERS.Diagram, builds an equivalent Path but never adds it to
|
|
309
|
+
// the node either, so it silently draws nothing — which is why items
|
|
310
|
+
// floated with no connecting line, and why Choice/Optional's own
|
|
311
|
+
// connector arcs (which assume they're meeting a line arriving at
|
|
312
|
+
// their own x) looked like they started from nowhere.
|
|
313
|
+
new Path(startX, y).h(this.width).format().addTo(this);
|
|
314
|
+
return this;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
FORMATTERS.Diagram = function (x, y, _width) {
|
|
318
|
+
this.x = x; this.y = y;
|
|
319
|
+
var path = new Path(x, y);
|
|
320
|
+
path.h(10);
|
|
321
|
+
var last = this.items.length - 1;
|
|
322
|
+
for (var i = 0; i < this.items.length; i++) {
|
|
323
|
+
var item = this.items[i];
|
|
324
|
+
if (item.needsSpace) {
|
|
325
|
+
path.h(10);
|
|
326
|
+
}
|
|
327
|
+
// width/height aren't known yet at this point — each item's own
|
|
328
|
+
// .format() below is what sets them — so this can't use `this.width`
|
|
329
|
+
// as a constraint the way Choice does; matches this file's existing
|
|
330
|
+
// single-pass layout approach elsewhere (e.g. Sequence/
|
|
331
|
+
// DiagramNode_format), not a new limitation introduced here.
|
|
332
|
+
item.format(path.x, path.y, 0);
|
|
333
|
+
path.x = item.x + item.width;
|
|
334
|
+
if (item.needsSpace) {
|
|
335
|
+
path.h(10);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
path.h(10);
|
|
339
|
+
// Only computable once every item has actually been formatted (above) —
|
|
340
|
+
// this used to run BEFORE the loop, reading each item's .width while it
|
|
341
|
+
// was still unset (undefined), producing NaN.
|
|
342
|
+
this.width = this.items.reduce((w, i) => w + i.width + (i.needsSpace ? 20 : 0), 0) + 20;
|
|
343
|
+
this.height = this.items.reduce((h, i) => Math.max(h, i.height), 0);
|
|
344
|
+
new Path(this.items[0].x, y).right(this.width - 20).format().addTo(this);
|
|
345
|
+
return this;
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
FORMATTERS.Sequence = DiagramNode_format;
|
|
349
|
+
|
|
350
|
+
FORMATTERS.Choice = function (x, y, width) {
|
|
351
|
+
this.x = x; this.y = y;
|
|
352
|
+
// Capture the real option count BEFORE the loop below starts appending
|
|
353
|
+
// connector-arc path primitives onto this.items — those legitimately
|
|
354
|
+
// belong in .items too (so walk() finds/renders them), but a `for`
|
|
355
|
+
// loop keyed off the SAME array's live .length, while that array is
|
|
356
|
+
// growing every iteration past i>0, never terminates (each iteration
|
|
357
|
+
// appends 2 more entries, so `i < this.items.length` stays true
|
|
358
|
+
// forever) — same bug already fixed in FORMATTERS.Diagram above.
|
|
359
|
+
var optionCount = this.items.length;
|
|
360
|
+
var first = this.items[0];
|
|
361
|
+
var last = this.items[optionCount - 1];
|
|
362
|
+
|
|
363
|
+
// Pass 1: format every option (sets each item's own width/height/x/y).
|
|
364
|
+
// 20px between option baselines, not 10 — a plain Terminal/NonTerminal
|
|
365
|
+
// box extends 10px above its own baseline (see FORMATTERS.Terminal's
|
|
366
|
+
// `up = 10`), so a 10px gap left its top edge exactly touching (0px
|
|
367
|
+
// clearance from) the line/branch above it instead of sitting on a
|
|
368
|
+
// clearly separate track below it.
|
|
369
|
+
var currentY = y;
|
|
370
|
+
for (var i = 0; i < optionCount; i++) {
|
|
371
|
+
var item = this.items[i];
|
|
372
|
+
item.format(x + 10, currentY, 0);
|
|
373
|
+
currentY += item.height + 20;
|
|
374
|
+
}
|
|
375
|
+
// Only computable once every option has actually been formatted.
|
|
376
|
+
this.width = this.items.slice(0, optionCount).reduce((w, i) => Math.max(w, i.width), 0) + 20;
|
|
377
|
+
this.height = this.items.slice(0, optionCount).reduce((h, i) => h + i.height, 0) + (optionCount - 1) * 20;
|
|
378
|
+
this.up = first.up;
|
|
379
|
+
this.down = last.down;
|
|
380
|
+
|
|
381
|
+
// Pass 2: draw each non-first option's connector arcs — needs
|
|
382
|
+
// this.width (just computed above) to route the "rejoin" arc back to
|
|
383
|
+
// the right edge, so this can't be folded into pass 1.
|
|
384
|
+
//
|
|
385
|
+
// Each connector is a straight run down from the shared entry point
|
|
386
|
+
// (x, y) followed by a single 'se' (south-then-east) quarter-turn that
|
|
387
|
+
// lands exactly at the option's own position (x+10, opt.y) — and the
|
|
388
|
+
// mirror image on the exit side. The previous version of this file
|
|
389
|
+
// started the vertical run from `y + first.up` and ALSO added the
|
|
390
|
+
// arc's own dy on top, double-counting first.up (an unrelated
|
|
391
|
+
// quantity — how far the FIRST option's own box extends upward, not
|
|
392
|
+
// an offset the branch geometry needs) and overshooting the target y
|
|
393
|
+
// by 10px every time — while also computing a rejoin point (this.width
|
|
394
|
+
// - opt.width - 10) that goes negative for the widest option. Both are
|
|
395
|
+
// why the arcs "failed to correctly connect to boxes." Re-derived from
|
|
396
|
+
// scratch: the arc's own dx/dy (10,10) already accounts for the full
|
|
397
|
+
// x-step from x to x+10, so the straight run only needs to cover
|
|
398
|
+
// whatever vertical distance is left over (opt.y - y - 10), and the
|
|
399
|
+
// rejoin run needs this.width - opt.width - 20 (verified non-negative
|
|
400
|
+
// for every option, including the widest one, since this.width
|
|
401
|
+
// reserves exactly 20px beyond the widest option's own width — 10 for
|
|
402
|
+
// this stub, 10 for the matching one on the entry side).
|
|
403
|
+
for (var j = 1; j < optionCount; j++) {
|
|
404
|
+
var opt = this.items[j];
|
|
405
|
+
new Path(x, y).v(opt.y - y - 10).arc('se').format().addTo(this);
|
|
406
|
+
new Path(opt.x + opt.width, opt.y).h(this.width - opt.width - 20).arc('en').v(-(opt.y - y - 10)).format().addTo(this);
|
|
407
|
+
}
|
|
408
|
+
return this;
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
FORMATTERS.OneOrMore = function (x, y, width) {
|
|
413
|
+
this.x = x; this.y = y;
|
|
414
|
+
this.item.format(x + 10, y, width - 20);
|
|
415
|
+
this.width = this.item.width + 20;
|
|
416
|
+
this.height = this.item.height;
|
|
417
|
+
this.up = this.item.up;
|
|
418
|
+
this.down = this.item.down;
|
|
419
|
+
new Path(x, y).h(10).format().addTo(this);
|
|
420
|
+
new Path(x + 10 + this.item.width, y).h(10).format().addTo(this);
|
|
421
|
+
new Path(x + 10, y + this.item.up).arc('se').up(this.item.up - 10).arc('wn').h(this.item.width).arc('ne').down(this.item.up - 10).arc('ws').format().addTo(this);
|
|
422
|
+
return this;
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
FORMATTERS.ZeroOrMore = function (x, y, width) {
|
|
426
|
+
// A rounded "repeat" loop below the item — same 4-corner race-track
|
|
427
|
+
// shape a real railroad diagram uses, built from Path.prototype.arc()
|
|
428
|
+
// now that its geometry is correct (see the comment above arc()'s own
|
|
429
|
+
// definition). An earlier version of this used sharp h/v-only corners
|
|
430
|
+
// instead, specifically because arc() was unverified/believed
|
|
431
|
+
// degenerate at the time — now that it's derived and checked, there's
|
|
432
|
+
// no more reason to avoid it here.
|
|
433
|
+
this.x = x; this.y = y;
|
|
434
|
+
this.item.format(x + 10, y, 0);
|
|
435
|
+
this.width = this.item.width + 20;
|
|
436
|
+
// Must clear 2*AR (20) for the loop's 2 vertical corners to fit;
|
|
437
|
+
// item.down is always >=10 so this comfortably clears that minimum
|
|
438
|
+
// while also giving the loop's bottom bar visible separation from the
|
|
439
|
+
// item's own box (rather than nearly touching its bottom border).
|
|
440
|
+
var loopDrop = this.item.down + 20;
|
|
441
|
+
this.height = this.item.height + loopDrop;
|
|
442
|
+
this.up = this.item.up;
|
|
443
|
+
this.down = this.item.down + loopDrop;
|
|
444
|
+
new Path(x, y).h(this.width).format().addTo(this);
|
|
445
|
+
var straightDrop = loopDrop - 20; // the part of loopDrop not already covered by the 2 corner arcs' own dy
|
|
446
|
+
new Path(x + 10 + this.item.width, y)
|
|
447
|
+
.arc('es')
|
|
448
|
+
.v(straightDrop)
|
|
449
|
+
.arc('sw')
|
|
450
|
+
.h(-(this.item.width + 10))
|
|
451
|
+
.arc('wn')
|
|
452
|
+
.v(-straightDrop)
|
|
453
|
+
.arc('ne')
|
|
454
|
+
.format().addTo(this);
|
|
455
|
+
return this;
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
FORMATTERS.Optional = function (x, y, width) {
|
|
459
|
+
// "Optional" is exactly "choice between nothing and the item" — reuse
|
|
460
|
+
// FORMATTERS.Choice's already-correct two-pass connector-arc geometry
|
|
461
|
+
// (verified visually) instead of the bespoke straight-line-plus-
|
|
462
|
+
// separate-loop math this used to have, which drew the "bypass" line
|
|
463
|
+
// at the SAME y as the item itself (no vertical room was ever reserved
|
|
464
|
+
// for it), so it visually overlapped/doubled the item's own content
|
|
465
|
+
// line instead of arcing around it.
|
|
466
|
+
this.items = [Skip(), this.item];
|
|
467
|
+
// walk() checks BOTH `.item` and `.items` (see its own definition
|
|
468
|
+
// above) — leaving `.item` in place after also setting `.items` to an
|
|
469
|
+
// array that happens to contain that exact same node reference made
|
|
470
|
+
// walk() visit (and render) it twice.
|
|
471
|
+
delete this.item;
|
|
472
|
+
return FORMATTERS.Choice.call(this, x, y, width);
|
|
473
|
+
};
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
FORMATTERS.Terminal = function (x, y, _width) {
|
|
477
|
+
this.x = x; this.y = y;
|
|
478
|
+
this.width = this.text.length * 8 + 20;
|
|
479
|
+
this.height = 21;
|
|
480
|
+
this.up = 10;
|
|
481
|
+
this.down = 11;
|
|
482
|
+
FakeSVG('rect', { x, y: y - 10, width: this.width, height: this.height, rx: 10, ry: 10 }).addTo(this);
|
|
483
|
+
FakeSVG('text', { x: x + this.width / 2, y: y + 4 }, this.text).addTo(this);
|
|
484
|
+
return this;
|
|
485
|
+
};
|
|
486
|
+
|
|
487
|
+
FORMATTERS.NonTerminal = function (x, y, _width) {
|
|
488
|
+
this.x = x; this.y = y;
|
|
489
|
+
this.width = this.text.length * 8 + 20;
|
|
490
|
+
this.height = 21;
|
|
491
|
+
this.up = 10;
|
|
492
|
+
this.down = 11;
|
|
493
|
+
FakeSVG('rect', { x, y: y - 10, width: this.width, height: this.height }).addTo(this);
|
|
494
|
+
FakeSVG('text', { x: x + this.width / 2, y: y + 4 }, this.text).addTo(this);
|
|
495
|
+
return this;
|
|
496
|
+
};
|
|
497
|
+
|
|
498
|
+
FORMATTERS.Comment = function (x, y, _width) {
|
|
499
|
+
this.x = x; this.y = y;
|
|
500
|
+
this.width = this.text.length * 7 + 20;
|
|
501
|
+
this.height = 21;
|
|
502
|
+
this.up = 11;
|
|
503
|
+
this.down = 10;
|
|
504
|
+
FakeSVG('text', { x: x + this.width / 2, y: y + 5, class: 'comment' }, this.text).addTo(this);
|
|
505
|
+
return this;
|
|
506
|
+
};
|
|
507
|
+
|
|
508
|
+
FORMATTERS.Skip = function (x, y, _width) {
|
|
509
|
+
this.x = x; this.y = y;
|
|
510
|
+
this.width = 0;
|
|
511
|
+
this.height = 0;
|
|
512
|
+
this.up = 0;
|
|
513
|
+
this.down = 0;
|
|
514
|
+
return this;
|
|
515
|
+
};
|
|
516
|
+
|
|
517
|
+
DiagramNode.prototype.format = function (x, y, width) {
|
|
518
|
+
const formatter = FORMATTERS[this.type];
|
|
519
|
+
if (!formatter) throw new Error(`railroadDiagram: no format() implementation for node type "${this.type}"`);
|
|
520
|
+
return formatter.call(this, x, y, width);
|
|
521
|
+
};
|
|
522
|
+
|
|
523
|
+
DiagramNode.prototype.toSVG = function () {
|
|
524
|
+
var diagram = new FakeSVG('svg', { class: 'railroad-diagram' });
|
|
525
|
+
this.format(0, 0).addTo(diagram);
|
|
526
|
+
return diagram;
|
|
527
|
+
};
|
|
528
|
+
|
|
529
|
+
DiagramNode.prototype.drawOn = function (ctx) {
|
|
530
|
+
this.format(20, 20); // Add some padding
|
|
531
|
+
|
|
532
|
+
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
|
|
533
|
+
ctx.canvas.width = this.width + 40;
|
|
534
|
+
ctx.canvas.height = this.height + 40;
|
|
535
|
+
ctx.translate(20, 20);
|
|
536
|
+
|
|
537
|
+
this.walk(item => {
|
|
538
|
+
if (item.type === 'rect' || item.tagName === 'rect') {
|
|
539
|
+
ctx.fillStyle = 'hsl(30, 20%, 95%)';
|
|
540
|
+
ctx.strokeStyle = 'black';
|
|
541
|
+
ctx.lineWidth = 2;
|
|
542
|
+
if (item.attrs.rx) { // Rounded rect for Terminals
|
|
543
|
+
ctx.beginPath();
|
|
544
|
+
ctx.moveTo(item.attrs.x + item.attrs.rx, item.attrs.y);
|
|
545
|
+
ctx.arcTo(item.attrs.x + item.attrs.width, item.attrs.y, item.attrs.x + item.attrs.width, item.attrs.y + item.attrs.height, item.attrs.rx);
|
|
546
|
+
ctx.arcTo(item.attrs.x + item.attrs.width, item.attrs.y + item.attrs.height, item.attrs.x, item.attrs.y + item.attrs.height, item.attrs.rx);
|
|
547
|
+
ctx.arcTo(item.attrs.x, item.attrs.y + item.attrs.height, item.attrs.x, item.attrs.y, item.attrs.rx);
|
|
548
|
+
ctx.arcTo(item.attrs.x, item.attrs.y, item.attrs.x + item.attrs.width, item.attrs.y, item.attrs.rx);
|
|
549
|
+
ctx.closePath();
|
|
550
|
+
ctx.fill();
|
|
551
|
+
ctx.stroke();
|
|
552
|
+
} else { // Sharp rect for NonTerminals
|
|
553
|
+
ctx.fillRect(item.attrs.x, item.attrs.y, item.attrs.width, item.attrs.height);
|
|
554
|
+
ctx.strokeRect(item.attrs.x, item.attrs.y, item.attrs.width, item.attrs.height);
|
|
555
|
+
}
|
|
556
|
+
} else if (item.type === 'text' || item.tagName === 'text') {
|
|
557
|
+
ctx.fillStyle = 'black';
|
|
558
|
+
ctx.font = 'bold 14px monospace';
|
|
559
|
+
ctx.textAlign = 'center';
|
|
560
|
+
ctx.textBaseline = 'middle';
|
|
561
|
+
ctx.fillText(item.text, item.attrs.x, item.attrs.y);
|
|
562
|
+
} else if (item.type === 'path' || item.tagName === 'path') {
|
|
563
|
+
ctx.strokeStyle = 'black';
|
|
564
|
+
ctx.lineWidth = 3;
|
|
565
|
+
ctx.lineCap = 'round';
|
|
566
|
+
const p = new Path2D(item.attrs.d);
|
|
567
|
+
ctx.stroke(p);
|
|
568
|
+
}
|
|
569
|
+
});
|
|
570
|
+
ctx.translate(-20, -20);
|
|
571
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { TreeModeRegistry } from './charting/modelTree/TreeModeRegistry.js';
|
|
2
|
+
import { LayerGroupedTreeMode } from './charting/modelTree/modes/LayerGroupedTreeMode.js';
|
|
3
|
+
import { TypeGroupedTreeMode } from './charting/modelTree/modes/TypeGroupedTreeMode.js';
|
|
4
|
+
import { FlatTreeMode } from './charting/modelTree/modes/FlatTreeMode.js';
|
|
5
|
+
|
|
6
|
+
export const TREE_MODE_CATALOG = [
|
|
7
|
+
{ key: 'byLayer', TreeModeClass: LayerGroupedTreeMode },
|
|
8
|
+
{ key: 'byType', TreeModeClass: TypeGroupedTreeMode },
|
|
9
|
+
{ key: 'flat', TreeModeClass: FlatTreeMode },
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
export const treeModeRegistry = new TreeModeRegistry(TREE_MODE_CATALOG);
|
|
13
|
+
|
|
14
|
+
export function getTreeModeCatalogEntry(key) {
|
|
15
|
+
return treeModeRegistry.get(key);
|
|
16
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContextBus — the channel layer that lets independently authored parts drive
|
|
3
|
+
* each other without holding references to each other (the mashup property).
|
|
4
|
+
*
|
|
5
|
+
* The load-bearing detail is **retained-value replay**: `publish()` remembers
|
|
6
|
+
* the last value per channel, and `subscribe()` fires immediately with it. Parts
|
|
7
|
+
* mount lazily — an inactive tab's part does not exist yet — so without replay,
|
|
8
|
+
* activating a tab would give you a chart that stays blank until the user
|
|
9
|
+
* re-clicks whatever drove it. With replay, a part mounting at any point in the
|
|
10
|
+
* session immediately sees current context.
|
|
11
|
+
*
|
|
12
|
+
* Channel names are a convention, not enforced: `selection:<entity>`,
|
|
13
|
+
* `filter:<name>`, `data:<queryId>`.
|
|
14
|
+
*/
|
|
15
|
+
export class ContextBus {
|
|
16
|
+
constructor() {
|
|
17
|
+
/** @type {Map<string, Set<Function>>} */
|
|
18
|
+
this._subs = new Map();
|
|
19
|
+
/** @type {Map<string, any>} */
|
|
20
|
+
this._retained = new Map();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Publish a value and retain it for later subscribers. */
|
|
24
|
+
publish(channel, value) {
|
|
25
|
+
this._retained.set(channel, value);
|
|
26
|
+
const subs = this._subs.get(channel);
|
|
27
|
+
if (!subs) return;
|
|
28
|
+
// Copy before iterating: a handler may unsubscribe itself.
|
|
29
|
+
for (const fn of [...subs]) this._invoke(fn, value, channel);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Subscribe to a channel. Fires immediately if the channel already has a
|
|
34
|
+
* retained value. Returns an unsubscribe function — `Part` pushes this
|
|
35
|
+
* straight onto its disposer list.
|
|
36
|
+
*/
|
|
37
|
+
subscribe(channel, fn) {
|
|
38
|
+
if (!this._subs.has(channel)) this._subs.set(channel, new Set());
|
|
39
|
+
this._subs.get(channel).add(fn);
|
|
40
|
+
if (this._retained.has(channel)) this._invoke(fn, this._retained.get(channel), channel);
|
|
41
|
+
return () => this.unsubscribe(channel, fn);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
unsubscribe(channel, fn) {
|
|
45
|
+
const subs = this._subs.get(channel);
|
|
46
|
+
if (!subs) return;
|
|
47
|
+
subs.delete(fn);
|
|
48
|
+
if (subs.size === 0) this._subs.delete(channel);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Current retained value without subscribing. */
|
|
52
|
+
peek(channel) {
|
|
53
|
+
return this._retained.get(channel);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Drop a channel's retained value (subscribers stay attached). */
|
|
57
|
+
clear(channel) {
|
|
58
|
+
this._retained.delete(channel);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Every channel with a subscriber or a retained value — for a wiring UI. */
|
|
62
|
+
channels() {
|
|
63
|
+
return [...new Set([...this._subs.keys(), ...this._retained.keys()])].sort();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
dispose() {
|
|
67
|
+
this._subs.clear();
|
|
68
|
+
this._retained.clear();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** One bad subscriber must not stop the others from being notified. */
|
|
72
|
+
_invoke(fn, value, channel) {
|
|
73
|
+
try {
|
|
74
|
+
fn(value, channel);
|
|
75
|
+
} catch (err) {
|
|
76
|
+
console.error(`ContextBus: subscriber for "${channel}" threw`, err);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|