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

davsclaus pushed a commit to branch jline
in repository https://gitbox.apache.org/repos/asf/camel.git

commit e77465b459f2d980acd22979bf0fddd671f7e2a1
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Dec 10 06:50:48 2025 +0100

    camel-jbang - camel get history use jline to make it mode better
---
 .../core/commands/action/CamelHistoryAction.java   | 71 +++++++++++-----------
 .../core/commands/action/InteractiveTerminal.java  | 17 +++++-
 .../core/commands/action/MessageTableHelper.java   |  6 +-
 3 files changed, 56 insertions(+), 38 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java
index 11c923f64f6a..998c75386788 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java
@@ -49,6 +49,7 @@ import org.apache.camel.util.json.JsonArray;
 import org.apache.camel.util.json.JsonObject;
 import org.apache.camel.util.json.Jsoner;
 import org.fusesource.jansi.Ansi;
+import org.jline.keymap.KeyMap;
 import org.jline.utils.AttributedString;
 import org.jline.utils.AttributedStyle;
 import org.jline.utils.InfoCmp;
@@ -212,42 +213,44 @@ public class CamelHistoryAction extends 
ActionWatchCommand {
         tableHelper.setShowExchangeProperties(showExchangeProperties);
         tableHelper.setShowExchangeVariables(showExchangeVariables);
 
-        InteractiveTerminal t = new InteractiveTerminal();
-        t.start();
-        t.addKeyBinding("quit", "q");
-        t.addKeyBinding("up", InfoCmp.Capability.key_up);
-        t.addKeyBinding("down", InfoCmp.Capability.key_down);
-        t.addKeyBinding("refresh", InfoCmp.Capability.key_f5);
-
-        t.clearDisplay();
-        t.updateDisplay(interactiveContent(rows, index));
-        t.flush();
-
-        do {
-            String operation = t.readNextKeyBinding();
-            if (operation != null) {
-                if ("quit".equals(operation)) {
-                    quit.set(true);
-                } else if ("up".equals(operation)) {
-                    if (index.get() > 0) {
-                        index.addAndGet(-1);
-                    }
-                } else if ("down".equals(operation)) {
-                    if (index.get() < rows.size() - 1) {
-                        index.addAndGet(1);
-                    }
-                } else if ("refresh".equals(operation)) {
-                    var reloaded = loadRows();
-                    if (reloaded.size() == 1) {
-                        rows = reloaded.get(0);
+        try (InteractiveTerminal t = new InteractiveTerminal()) {
+            t.sigint(() -> quit.set(true));
+            t.addKeyBinding("quit", KeyMap.ctrl('c'), "q");
+            t.addKeyBinding("up", InfoCmp.Capability.key_up);
+            t.addKeyBinding("down", InfoCmp.Capability.key_down);
+            t.addKeyBinding("refresh", InfoCmp.Capability.key_f5);
+            t.start();
+
+            t.clearDisplay();
+            t.updateDisplay(interactiveContent(rows, index));
+            t.flush();
+
+            do {
+                String operation = t.readNextKeyBinding();
+                if (operation != null) {
+                    if ("quit".equals(operation)) {
+                        quit.set(true);
+                    } else if ("up".equals(operation)) {
+                        if (index.get() > 0) {
+                            index.addAndGet(-1);
+                        }
+                    } else if ("down".equals(operation)) {
+                        if (index.get() < rows.size() - 1) {
+                            index.addAndGet(1);
+                        }
+                    } else if ("refresh".equals(operation)) {
+                        var reloaded = loadRows();
+                        if (reloaded.size() == 1) {
+                            rows = reloaded.get(0);
+                        }
+                        index.set(0);
                     }
-                    index.set(0);
+                    t.clearDisplay();
+                    t.updateDisplay(interactiveContent(rows, index));
+                    t.flush();
                 }
-                t.clearDisplay();
-                t.updateDisplay(interactiveContent(rows, index));
-                t.flush();
-            }
-        } while (!quit.get());
+            } while (!quit.get());
+        }
 
         return 0;
     }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/InteractiveTerminal.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/InteractiveTerminal.java
index f9bcb3269801..a0910d071e2c 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/InteractiveTerminal.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/InteractiveTerminal.java
@@ -43,10 +43,13 @@ public class InteractiveTerminal implements Closeable {
     private Display display;
     private Size size;
     private BindingReader bindingReader;
+    private Runnable sigint;
 
-    public void start() throws Exception {
+    public InteractiveTerminal() throws Exception {
         terminal = TerminalBuilder.builder().build();
+    }
 
+    public void start() {
         Attributes attributes = terminal.getAttributes();
         int vsusp = attributes.getControlChar(Attributes.ControlChar.VSUSP);
         if (vsusp > 0) {
@@ -72,9 +75,19 @@ public class InteractiveTerminal implements Closeable {
         display.resize(size.getRows(), size.getColumns());
 
         bindingReader = new BindingReader(terminal.reader());
+
+        if (sigint != null) {
+            terminal.handle(Terminal.Signal.INT, signal -> {
+                sigint.run();
+            });
+        }
+    }
+
+    public void sigint(Runnable task) {
+        this.sigint = task;
     }
 
-    public void addKeyBinding(String operation, String key) {
+    public void addKeyBinding(String operation, String... key) {
         keys.bind(operation, key);
     }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/MessageTableHelper.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/MessageTableHelper.java
index 129643f3117e..a36f81e7b917 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/MessageTableHelper.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/MessageTableHelper.java
@@ -415,7 +415,8 @@ public class MessageTableHelper {
                 s = "WrappedInputStream";
             } else if (type.startsWith("org.apache.camel.converter.stream.")) {
                 s = type.substring(34);
-            } else if 
(type.equals("org.apache.camel.processor.aggregate.AbstractListAggregationStrategy.GroupedExchangeList"))
 {
+            } else if (type
+                    
.equals("org.apache.camel.processor.aggregate.AbstractListAggregationStrategy.GroupedExchangeList"))
 {
                 s = "GroupedExchangeList";
             } else if (type.length() > 34) {
                 // type must not be too long
@@ -448,7 +449,8 @@ public class MessageTableHelper {
                 s = "WrappedInputStream";
             } else if (type.startsWith("org.apache.camel.converter.stream.")) {
                 s = type.substring(34);
-            } else if 
(type.equals("org.apache.camel.processor.aggregate.AbstractListAggregationStrategy.GroupedExchangeList"))
 {
+            } else if (type
+                    
.equals("org.apache.camel.processor.aggregate.AbstractListAggregationStrategy.GroupedExchangeList"))
 {
                 s = "GroupedExchangeList";
             } else {
                 s = type;

Reply via email to