This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch CAMEL-23631-route-diagram-highlight-error-path in repository https://gitbox.apache.org/repos/asf/camel.git
commit 11c035a91ebc6f33a162774c7b5aaa204ee0c599 Author: Claus Ibsen <[email protected]> AuthorDate: Wed May 27 22:34:01 2026 +0200 CAMEL-23631: Highlight last node box in red for FAIL mode Co-Authored-By: Claude Opus 4.6 <[email protected]> --- .../camel/diagram/RouteDiagramAsciiRenderer.java | 23 ++++++++++++++++++++++ .../apache/camel/diagram/RouteDiagramRenderer.java | 23 ++++++++++++++++++---- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramAsciiRenderer.java b/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramAsciiRenderer.java index a09e23bb7e4c..654c166a7114 100644 --- a/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramAsciiRenderer.java +++ b/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramAsciiRenderer.java @@ -180,6 +180,16 @@ public class RouteDiagramAsciiRenderer { } drawText(grid, labelRow, toCol(PADDING), label); + // find the last highlighted node (for FAIL mode box highlighting) + LayoutNode lastHighlightedNode = null; + if (highlightedNodeIds != null && highlightStyle == RouteDiagramHelper.HighlightStyle.FAIL) { + for (LayoutNode ln : lr.nodes) { + if (isHighlighted(ln, highlightedNodeIds)) { + lastHighlightedNode = ln; + } + } + } + for (LayoutNode ln : lr.nodes) { if (ln.treeNode != null && RouteDiagramLayoutEngine.hasScope(ln.treeNode)) { drawScopeBox(grid, ln); @@ -201,6 +211,19 @@ public class RouteDiagramAsciiRenderer { for (LayoutNode ln : lr.nodes) { drawNode(grid, ln); + if (ln == lastHighlightedNode) { + recordNodeHighlight(grid, ln); + } + } + } + + private void recordNodeHighlight(char[][] grid, LayoutNode node) { + int col = toCol(node.x); + int row = toRow(node.y); + int height = 2 + rewrapText(node, boxWidth - 4).size(); + // highlight the entire box (top border, sides, bottom border) + for (int r = row; r < row + height && r < grid.length; r++) { + counterPositions.add(new CounterPos(r, col, boxWidth, CounterType.HIGHLIGHT_FAIL)); } } diff --git a/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramRenderer.java b/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramRenderer.java index 789d04a5b314..d874e8f92bc7 100644 --- a/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramRenderer.java +++ b/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramRenderer.java @@ -323,8 +323,18 @@ public class RouteDiagramRenderer { } } + // find the last highlighted node (for FAIL mode box highlighting) + LayoutNode lastHighlightedNode = null; + if (highlightedNodeIds != null && highlightStyle == RouteDiagramHelper.HighlightStyle.FAIL) { + for (LayoutNode ln : lr.nodes) { + if (isHighlighted(ln, highlightedNodeIds)) { + lastHighlightedNode = ln; + } + } + } + for (LayoutNode ln : lr.nodes) { - drawNode(g, ln, colors); + drawNode(g, ln, colors, ln == lastHighlightedNode); } } @@ -417,14 +427,19 @@ public class RouteDiagramRenderer { drawArrowFromMerge(g, to, colors, false, null); } - private void drawNode(Graphics2D g, LayoutNode node, DiagramColors colors) { + private void drawNode(Graphics2D g, LayoutNode node, DiagramColors colors, boolean highlightFail) { Color color = getNodeColor(node.type, colors); g.setColor(color); g.fillRoundRect(node.x, node.y, nodeWidth, node.height, ARC, ARC); - g.setColor(color.brighter()); - g.setStroke(new BasicStroke(BORDER_STROKE_WIDTH)); + if (highlightFail) { + g.setColor(HIGHLIGHT_FAIL_COLOR); + g.setStroke(new BasicStroke(HIGHLIGHT_STROKE_WIDTH)); + } else { + g.setColor(color.brighter()); + g.setStroke(new BasicStroke(BORDER_STROKE_WIDTH)); + } g.drawRoundRect(node.x, node.y, nodeWidth, node.height, ARC, ARC); g.setColor(colors.getText());
