This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch feature/CAMEL-24237-catalog-docs in repository https://gitbox.apache.org/repos/asf/camel.git
commit f57487b5661e4b46ea1ac5b900b71cbed164006b Author: Claus Ibsen <[email protected]> AuthorDate: Wed Jul 22 11:43:16 2026 +0200 CAMEL-24237: Add scrollbar to DocViewerPopup The doc viewer now shows a scrollbar on the right edge for both markdown content and pre-built line content, using the tamboui Scrollbar widget with proper content length tracking. Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../jbang/core/commands/tui/DocViewerPopup.java | 36 +++++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DocViewerPopup.java b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DocViewerPopup.java index c0db7d7a22dc..a89adf987159 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DocViewerPopup.java +++ b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DocViewerPopup.java @@ -23,6 +23,8 @@ import java.util.List; import java.util.function.Supplier; import java.util.stream.Collectors; +import dev.tamboui.layout.Constraint; +import dev.tamboui.layout.Layout; import dev.tamboui.layout.Rect; import dev.tamboui.markdown.MarkdownView; import dev.tamboui.style.Overflow; @@ -44,6 +46,8 @@ import dev.tamboui.widgets.list.ListState; import dev.tamboui.widgets.list.ListWidget; import dev.tamboui.widgets.list.ScrollMode; import dev.tamboui.widgets.paragraph.Paragraph; +import dev.tamboui.widgets.scrollbar.Scrollbar; +import dev.tamboui.widgets.scrollbar.ScrollbarState; import org.apache.camel.dsl.jbang.core.common.PathUtils; import static org.apache.camel.dsl.jbang.core.commands.tui.TuiHelper.hint; @@ -59,6 +63,7 @@ class DocViewerPopup { private int docScroll; private Runnable onCloseCallback; + private final ScrollbarState scrollbarState = new ScrollbarState(); private final ListState pickerState = new ListState(); private List<IntegrationInfo> pickerIntegrations; private Rect pickerRect; @@ -416,7 +421,10 @@ class DocViewerPopup { if (docLines != null) { frame.renderWidget(block, popup); Rect inner = block.inner(popup); - int visibleLines = inner.height(); + List<Rect> hChunks = Layout.horizontal() + .constraints(Constraint.fill(), Constraint.length(1)) + .split(inner); + int visibleLines = hChunks.get(0).height(); int totalLines = docLines.size(); int clampedScroll = Math.min(docScroll, Math.max(0, totalLines - visibleLines)); int end = Math.min(clampedScroll + visibleLines, totalLines); @@ -427,15 +435,35 @@ class DocViewerPopup { frame.renderWidget( Paragraph.builder().text(Text.from(visible.toArray(Line[]::new))) .overflow(Overflow.CLIP).build(), - inner); + hChunks.get(0)); + if (totalLines > visibleLines) { + scrollbarState + .contentLength(totalLines) + .viewportContentLength(visibleLines) + .position(clampedScroll); + frame.renderStatefulWidget(Scrollbar.builder().build(), hChunks.get(1), scrollbarState); + } } else { + frame.renderWidget(block, popup); + Rect inner = block.inner(popup); + List<Rect> hChunks = Layout.horizontal() + .constraints(Constraint.fill(), Constraint.length(1)) + .split(inner); MarkdownView view = MarkdownView.builder() .source(docContent) .scroll(docScroll) - .block(block) .styles(Theme.markdownStyles()) .build(); - frame.renderWidget(view, popup); + frame.renderWidget(view, hChunks.get(0)); + int totalHeight = view.computeHeight(hChunks.get(0).width()); + int viewportHeight = hChunks.get(0).height(); + if (totalHeight > viewportHeight) { + scrollbarState + .contentLength(totalHeight) + .viewportContentLength(viewportHeight) + .position(docScroll); + frame.renderStatefulWidget(Scrollbar.builder().build(), hChunks.get(1), scrollbarState); + } } }
