This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch camel-23420-tui-text-diagram
in repository https://gitbox.apache.org/repos/asf/camel.git

commit bc2d7d04d0ae1975b2d421cf49d929abe6ef551d
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed May 13 13:17:35 2026 +0200

    CAMEL-23420: Add text diagram mode (Shift+D) to TUI monitor
    
    Co-Authored-By: Claude Opus 4.7 <[email protected]>
---
 .../dsl/jbang/core/commands/tui/CamelMonitor.java  | 85 +++++++++++-----------
 1 file changed, 41 insertions(+), 44 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
index 7fcb1d958e2f..e43b721c65a1 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
@@ -169,6 +169,7 @@ public class CamelMonitor extends CamelCommand {
 
     // Diagram state
     private boolean showDiagram;
+    private boolean diagramTextMode;
     private List<String> diagramLines = Collections.emptyList();
     private int diagramScroll;
     private String diagramRouteId;
@@ -330,11 +331,22 @@ public class CamelMonitor extends CamelCommand {
                 routeSort = ROUTE_SORT_COLUMNS[routeSortIndex];
                 return true;
             }
-            if (tab == TAB_ROUTES && ke.isCharIgnoreCase('d')) {
+            if (tab == TAB_ROUTES && ke.isChar('d')) {
                 if (showDiagram) {
                     showDiagram = false;
                     diagramImageData = null;
                 } else {
+                    diagramTextMode = false;
+                    loadDiagramForSelectedRoute();
+                }
+                return true;
+            }
+            if (tab == TAB_ROUTES && ke.isChar('D')) {
+                if (showDiagram) {
+                    showDiagram = false;
+                    diagramImageData = null;
+                } else {
+                    diagramTextMode = true;
                     loadDiagramForSelectedRoute();
                 }
                 return true;
@@ -1000,60 +1012,43 @@ public class CamelMonitor extends CamelCommand {
         diagramRouteId = selectedRoute.routeId;
         diagramScroll = 0;
 
-        TerminalImageCapabilities caps = TerminalImageCapabilities.detect();
-        if (caps.supportsNativeImages()) {
-            RouteDiagramLayoutEngine engine = new RouteDiagramLayoutEngine();
-            List<RouteDiagramLayoutEngine.LayoutRoute> layoutRoutes = new 
ArrayList<>();
-            int totalHeight = 0;
-            for (RouteDiagramLayoutEngine.RouteInfo r : diagramRoutes) {
-                RouteDiagramLayoutEngine.LayoutRoute lr = 
engine.layoutRoute(r, totalHeight);
-                layoutRoutes.add(lr);
-                totalHeight = lr.maxY;
-            }
-            RouteDiagramRenderer renderer = new RouteDiagramRenderer();
-            RouteDiagramRenderer.DiagramColors colors = 
RouteDiagramRenderer.DiagramColors.parse("transparent");
-            java.awt.image.BufferedImage image = 
renderer.renderDiagram(layoutRoutes, totalHeight, colors);
-            diagramImageData = ImageData.fromBufferedImage(image);
-            diagramProtocol = caps.bestProtocol();
-            diagramLines = Collections.emptyList();
-        } else {
+        if (diagramTextMode) {
             diagramImageData = null;
             diagramProtocol = null;
 
-            StringBuilder sb = new StringBuilder();
-            org.apache.camel.dsl.jbang.core.common.Printer capturingPrinter
-                    = new org.apache.camel.dsl.jbang.core.common.Printer() {
-                        @Override
-                        public void println() {
-                            sb.append('\n');
-                        }
-
-                        @Override
-                        public void println(String line) {
-                            sb.append(line).append('\n');
-                        }
-
-                        @Override
-                        public void print(String output) {
-                            sb.append(output);
-                        }
-
-                        @Override
-                        public void printf(String format, Object... args) {
-                            sb.append(String.format(format, args));
-                        }
-                    };
-
             String ascii = renderAscii(diagramRoutes, 
RouteDiagramLayoutEngine.DEFAULT_BOX_WIDTH, "CODE", true);
-            sb.append(ascii);
 
             List<String> result = new ArrayList<>();
-            for (String line : sb.toString().split("\n", -1)) {
+            for (String line : ascii.split("\n", -1)) {
                 if (!line.isEmpty()) {
                     result.add(line);
                 }
             }
             diagramLines = result;
+        } else {
+            TerminalImageCapabilities caps = 
TerminalImageCapabilities.detect();
+            if (caps.supportsNativeImages()) {
+                RouteDiagramLayoutEngine engine = new 
RouteDiagramLayoutEngine();
+                List<RouteDiagramLayoutEngine.LayoutRoute> layoutRoutes = new 
ArrayList<>();
+                int totalHeight = 0;
+                for (RouteDiagramLayoutEngine.RouteInfo r : diagramRoutes) {
+                    RouteDiagramLayoutEngine.LayoutRoute lr = 
engine.layoutRoute(r, totalHeight);
+                    layoutRoutes.add(lr);
+                    totalHeight = lr.maxY;
+                }
+                RouteDiagramRenderer renderer = new RouteDiagramRenderer();
+                RouteDiagramRenderer.DiagramColors colors = 
RouteDiagramRenderer.DiagramColors.parse("transparent");
+                java.awt.image.BufferedImage image = 
renderer.renderDiagram(layoutRoutes, totalHeight, colors);
+                diagramImageData = ImageData.fromBufferedImage(image);
+                diagramProtocol = caps.bestProtocol();
+                diagramLines = Collections.emptyList();
+            } else {
+                diagramImageData = null;
+                diagramProtocol = null;
+                diagramLines = List.of(
+                        "(Terminal does not support image rendering)",
+                        "(Press Shift+D for text diagram)");
+            }
         }
 
         showDiagram = true;
@@ -1699,6 +1694,8 @@ public class CamelMonitor extends CamelCommand {
                         Span.raw(" sort  "),
                         Span.styled("d", 
Style.create().fg(Color.YELLOW).bold()),
                         Span.raw(" diagram  "),
+                        Span.styled("D", 
Style.create().fg(Color.YELLOW).bold()),
+                        Span.raw(" text diagram  "),
                         Span.styled("1-6", 
Style.create().fg(Color.YELLOW).bold()),
                         Span.raw(" tabs  "),
                         Span.styled("Refresh: " + refreshLabel, 
Style.create().dim()));

Reply via email to