You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hop.apache.org by ha...@apache.org on 2026/04/01 16:07:29 UTC

(hop) branch main updated: merge preview and debug, fixes #6434 (#6920)

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

hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/main by this push:
     new 3af61cca45 merge preview and debug, fixes #6434 (#6920)
3af61cca45 is described below

commit 3af61cca4565e34bffbe646ca0687c8920bfa9c3
Author: Hans Van Akelyen <ha...@gmail.com>
AuthorDate: Wed Apr 1 18:07:24 2026 +0200

    merge preview and debug, fixes #6434 (#6920)
---
 .../ROOT/pages/hop-gui/hop-gui-popup-dialog.adoc   |   3 +-
 .../ROOT/pages/pipeline/create-pipeline.adoc       |   3 +-
 .../ROOT/pages/pipeline/hop-pipeline-editor.adoc   |   3 +-
 .../pages/pipeline/run-preview-debug-pipeline.adoc |  42 +++-----
 .../hop/pipeline/debug/PipelineDebugMeta.java      |  18 +++-
 .../main/java/org/apache/hop/ui/hopgui/HopGui.java |  13 ---
 .../hopgui/file/pipeline/HopGuiPipelineGraph.java  |  57 +++-------
 .../hopgui/file/pipeline/HopPipelineFileType.java  |   1 -
 .../delegates/HopGuiPipelineRunDelegate.java       | 118 ++++++---------------
 .../pipeline/messages/messages_en_US.properties    |  11 +-
 .../ui/hopgui/messages/messages_de_DE.properties   |   2 -
 .../ui/hopgui/messages/messages_en_US.properties   |   3 +-
 .../ui/hopgui/messages/messages_es_ES.properties   |   2 -
 .../ui/hopgui/messages/messages_fr_FR.properties   |   2 -
 .../ui/hopgui/messages/messages_it_IT.properties   |   2 -
 .../ui/hopgui/messages/messages_nl_NL.properties   |   2 -
 .../ui/hopgui/messages/messages_pt_BR.properties   |   2 -
 .../ui/hopgui/messages/messages_zh_CN.properties   |   2 -
 18 files changed, 81 insertions(+), 205 deletions(-)

diff --git a/docs/hop-user-manual/modules/ROOT/pages/hop-gui/hop-gui-popup-dialog.adoc b/docs/hop-user-manual/modules/ROOT/pages/hop-gui/hop-gui-popup-dialog.adoc
index 5f151c4a9f..030f4d1a74 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/hop-gui/hop-gui-popup-dialog.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/hop-gui/hop-gui-popup-dialog.adoc
@@ -144,8 +144,7 @@ When clicking on a transform icon, the popup contains a number of actions to wor
 ** **Add web service**: use the output of this transform as a xref:hop-server/web-service.adoc[web service] with xref:hop-server/index.adoc[Hop Server].
 * Preview
 ** **View output**: view output of this transform in a running or finished pipeline.
-** **Preview output**: execute the pipeline and see the output of this transform
-** **Debug output**: execute the pipeline and debug the output of this transform. Execution will pause when the debugging conditions are met.
+** **Preview & debug output**: execute the pipeline, inspect rows from this transform, and optionally pause when a breakpoint condition is met (see xref:pipeline/run-preview-debug-pipeline.adoc[Run, Preview and Debug a Pipeline])
 ** **Sniff output**: take a look at 50 rows of output from the selected transform in a running pipeline
 ** **Add data probe**: streams the output rows of this transform to a pipeline defined in a xref:metadata-types/pipeline-probe.adoc[pipeline probe].
 * Logging
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/create-pipeline.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/create-pipeline.adoc
index 8bca2c9cc3..dedd4e9825 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/create-pipeline.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/create-pipeline.adoc
@@ -96,8 +96,7 @@ image::hop-gui/pipeline/transforms.png[Hop - transforms,75%,align="left"]
 |Copy transform to clipboard|Copies selected items to clipboard.
 |Create hop| Creates a new hop between two transforms.
 |Set the number of transforms|Starts several instances of a transform in parallel.
-|Preview output| Allows you to preview the results of the transform.
-|Debug output|
+|Preview & debug output| Run the pipeline to preview rows from this transform and optionally pause when a breakpoint condition matches.
 |Show the fields entering this transform|Shows metadata, like the field name and type for fields coming into the transform.
 |Show the fields exiting this transform|Shows metadata, like the field name and type for fields coming out of the transform.
 |Distribute rows|In case of more than one hop the data is distributed between the next transforms.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/hop-pipeline-editor.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/hop-pipeline-editor.adoc
index 63070b8474..c538e600ef 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/hop-pipeline-editor.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/hop-pipeline-editor.adoc
@@ -35,8 +35,7 @@ image::getting-started/getting-started-pipeline-toolbar.png[Hop - Pipeline Toolb
 |pause|image:getting-started/icons/pause.svg[Pause,25px,align="bottom"]|pause the execution of the pipeline
 |stop|image:getting-started/icons/stop.svg[Stop,25px,align="bottom"]|stop the execution of the pipeline
 |||
-|preview|image:getting-started/icons/view.svg[Preview,25px,align="bottom"]|preview the pipeline
-|debug|image:getting-started/icons/debug.svg[Debug,25px,align="bottom"]|debug the pipeline
+|preview & debug|image:getting-started/icons/view.svg[Preview,25px,align="bottom"]|preview the pipeline and optionally pause on a row condition (same dialog)
 |print|image:getting-started/icons/print.png[Print,25px,align="bottom"]|print the pipeline
 |||
 |undo|image:getting-started/icons/Antu_edit-undo.svg[Undo,25px,align="bottom"]|undo an operation
diff --git a/docs/hop-user-manual/modules/ROOT/pages/pipeline/run-preview-debug-pipeline.adoc b/docs/hop-user-manual/modules/ROOT/pages/pipeline/run-preview-debug-pipeline.adoc
index 98e13b44ec..b5e979618b 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/run-preview-debug-pipeline.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/run-preview-debug-pipeline.adoc
@@ -85,40 +85,24 @@ The logging tab displays the log of the pipeline according to the log level choo
 
 image::hop-gui/pipeline/logging-pipeline.png[Logging pipeline,75%,align="left"]
 
-== Preview a pipeline
+== Preview and debug a pipeline
 
-Preview the result off a pipeline to see how it performs can be done by completing one of the following tasks:
+To inspect pipeline data while controlling how execution pauses, use **Preview & debug** (toolbar, Run menu, or transform actions). This opens a single dialog for preview rows and optional breakpoint behavior.
 
-* Using the preview image:getting-started/icons/view.svg[Run,25px,align="bottom"] icon
-* Select Run and Preview from the top menu
-* Select Preview from the transform action Menu
+You can start it in any of these ways:
+
+* Using the preview image:getting-started/icons/view.svg[Preview,25px,align="bottom"] icon on the pipeline toolbar
+* Select **Run** and **Preview & debug** from the top menu
+* Select **Preview & debug output** from the transform action menu
 * Click on the tiny bottom right icon after running the pipeline
 
 image::hop-gui/pipeline/preview-menu-pipeline.png[Preview Menu pipeline,75%,align="left"]
 
-In the pipeline preview dialog the transform from which the result must be previewed can be selected.
-Furthermore the number of rows to preview can be determined as well as a pause condition.
-When finished press the Quick Launch button.
-If you want to change the Pipeline run configuration click Configure.
-The result is displayed in ascending order.
-The result is previewed as displayed below.
-
-image::hop-gui/pipeline/preview-pipeline.png[Preview pipeline,75%,align="left"]
-
-== Debug a pipeline
+In the dialog, choose the transform whose rows you want to inspect.
+Set how many rows to retrieve (**Retrieve first rows**), and optionally enable **Pause on breakpoint** and define a **condition** so the pipeline pauses when that condition matches a row.
+When finished press **Quick Launch**.
+To change the pipeline run configuration, click **Configure**.
 
-Debugging a pipeline to eliminate errors can be done by completing one of the following tasks:
+The collected rows are shown in the preview window when execution pauses or finishes.
 
-* Using the debug image:getting-started/icons/debug.svg[Run,25px,align="bottom"] icon
-* Select Run and Debug from the top menu
-* Select Debug output from the transform action Menu
-
-The same dialog is displayed as when using the preview functionality, only the enabled options are different.
-
-image::hop-gui/pipeline/debug-pipeline.png[Debug pipeline,75%,align="left"]
-
-In the pipeline debug dialog the transform from which the result must be debugged can be selected.
-Furthermore the number of rows can be determined as well as a pause condition.
-When finished press the Quick Launch button.
-If you want to change the Pipeline run configuration click Configure.
-The result is displayed in descending order.
+image::hop-gui/pipeline/preview-pipeline.png[Preview pipeline,75%,align="left"]
diff --git a/engine/src/main/java/org/apache/hop/pipeline/debug/PipelineDebugMeta.java b/engine/src/main/java/org/apache/hop/pipeline/debug/PipelineDebugMeta.java
index db71d525a5..ef4982edaa 100644
--- a/engine/src/main/java/org/apache/hop/pipeline/debug/PipelineDebugMeta.java
+++ b/engine/src/main/java/org/apache/hop/pipeline/debug/PipelineDebugMeta.java
@@ -22,6 +22,7 @@ import java.util.List;
 import java.util.Map;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.hop.core.Condition;
 import org.apache.hop.core.exception.HopException;
 import org.apache.hop.core.exception.HopTransformException;
 import org.apache.hop.core.row.IRowMeta;
@@ -91,6 +92,20 @@ public class PipelineDebugMeta {
                           //
                           transformDebugMeta.setRowBufferMeta(rowMeta);
                           transformDebugMeta.getRowBuffer().add(rowMeta.cloneRow(row));
+
+                          // "Retrieve first rows" and "pause on breakpoint" can both be enabled;
+                          // the
+                          // former used to hide this branch behind if/else so the condition never
+                          // ran until the preview buffer was full.
+                          if (transformDebugMeta.isPausingOnBreakPoint()) {
+                            Condition condition = transformDebugMeta.getCondition();
+                            if (condition != null
+                                && !condition.isEmpty()
+                                && condition.evaluate(rowMeta, row)) {
+                              pipeline.pauseExecution();
+                              transformDebugMeta.fireBreakPointListeners(PipelineDebugMeta.this);
+                            }
+                          }
                         } else {
                           // pause the pipeline...
                           //
@@ -104,7 +119,8 @@ public class PipelineDebugMeta {
                           transformDebugMeta.fireBreakPointListeners(PipelineDebugMeta.this);
                         }
                       } else if (transformDebugMeta.isPausingOnBreakPoint()
-                          && transformDebugMeta.getCondition() != null) {
+                          && transformDebugMeta.getCondition() != null
+                          && !transformDebugMeta.getCondition().isEmpty()) {
                         // A break-point is set
                         // Verify the condition and pause if required
                         // Before we do that, see if a row count is set.
diff --git a/ui/src/main/java/org/apache/hop/ui/hopgui/HopGui.java b/ui/src/main/java/org/apache/hop/ui/hopgui/HopGui.java
index 00223a942a..7d4faea14e 100644
--- a/ui/src/main/java/org/apache/hop/ui/hopgui/HopGui.java
+++ b/ui/src/main/java/org/apache/hop/ui/hopgui/HopGui.java
@@ -208,7 +208,6 @@ public class HopGui
   public static final String ID_MAIN_MENU_RUN_RESUME = "30035-menu-run-resume";
   public static final String ID_MAIN_MENU_RUN_STOP = "30040-menu-run-stop";
   public static final String ID_MAIN_MENU_RUN_PREVIEW = "30050-menu-run-preview";
-  public static final String ID_MAIN_MENU_RUN_DEBUG = "30060-menu-run-debug";
 
   public static final String ID_MAIN_MENU_TOOLS_PARENT_ID = "40000-menu-tools";
   public static final String ID_MAIN_MENU_TOOLS_DATABASE_CLEAR_CACHE =
@@ -1566,16 +1565,6 @@ public class HopGui
     getActiveFileTypeHandler().preview();
   }
 
-  @GuiMenuElement(
-      root = ID_MAIN_MENU,
-      id = ID_MAIN_MENU_RUN_DEBUG,
-      label = "i18n::HopGui.Menu.Run.Debug",
-      image = "ui/images/debug.svg",
-      parentId = ID_MAIN_MENU_RUN_PARENT_ID)
-  public void menuRunDebug() {
-    getActiveFileTypeHandler().debug();
-  }
-
   @GuiMenuElement(
       root = ID_MAIN_MENU,
       id = ID_MAIN_MENU_TOOLS_PARENT_ID,
@@ -1903,8 +1892,6 @@ public class HopGui
         fileType, handler, ID_MAIN_MENU_RUN_RESUME, IHopFileType.CAPABILITY_PAUSE, paused);
     mainMenuWidgets.enableMenuItem(
         fileType, handler, ID_MAIN_MENU_RUN_PREVIEW, IHopFileType.CAPABILITY_PREVIEW);
-    mainMenuWidgets.enableMenuItem(
-        fileType, handler, ID_MAIN_MENU_RUN_DEBUG, IHopFileType.CAPABILITY_DEBUG);
 
     mainMenuWidgets.enableMenuItem(
         fileType,
diff --git a/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/HopGuiPipelineGraph.java b/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/HopGuiPipelineGraph.java
index 99616f62c9..c1701ea8cf 100644
--- a/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/HopGuiPipelineGraph.java
+++ b/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/HopGuiPipelineGraph.java
@@ -236,7 +236,6 @@ public class HopGuiPipelineGraph extends HopGuiAbstractGraph
   public static final String TOOLBAR_ITEM_PAUSE = "HopGuiPipelineGraph-ToolBar-10020-Pause";
   public static final String TOOLBAR_ITEM_CHECK = "HopGuiPipelineGraph-ToolBar-10040-Check";
   public static final String TOOLBAR_ITEM_PREVIEW = "HopGuiPipelineGraph-ToolBar-10050-Preview";
-  public static final String TOOLBAR_ITEM_DEBUG = "HopGuiPipelineGraph-ToolBar-10060-Debug";
 
   public static final String TOOLBAR_ITEM_UNDO_ID = "HopGuiPipelineGraph-ToolBar-10100-Undo";
   public static final String TOOLBAR_ITEM_REDO_ID = "HopGuiPipelineGraph-ToolBar-10110-Redo";
@@ -774,6 +773,13 @@ public class HopGuiPipelineGraph extends HopGuiAbstractGraph
             // candidate hop, but we need to ignore this click to not start a drag operation.
             if (candidate != null) {
               addCandidateAsHop(event.x, event.y);
+              // Single-stream hop completes on mouseDown and clears startHopTransform; without
+              // this,
+              // the following mouseUp would look like a plain transform click and open the action
+              // dialog.
+              if (startHopTransform == null) {
+                avoidContextDialog = true;
+              }
             }
           } else if (event.button == 1 && alt && currentTransform.supportsErrorHandling()) {
             // ALT-Click: edit error handling
@@ -3867,8 +3873,7 @@ public class HopGuiPipelineGraph extends HopGuiAbstractGraph
           hopGui.getLog(),
           pipelineMeta,
           true,
-          false,
-          pipelineRunDelegate.getPipelinePreviewExecutionConfiguration().getLogLevel());
+          pipelineRunDelegate.getPipelinePreviewDebugExecutionConfiguration().getLogLevel());
     } catch (Exception e) {
       new ErrorDialog(hopShell(), CONST_ERROR, CONST_ERROR_PREVIEWING_PIPELINE, e);
     }
@@ -3883,7 +3888,6 @@ public class HopGuiPipelineGraph extends HopGuiAbstractGraph
       image = "ui/images/preview.svg",
       category = "i18n::HopGuiPipelineGraph.ContextualAction.Category.Preview.Text",
       categoryOrder = "3")
-  // Preview a single transform
   public void preview(HopGuiPipelineTransformContext context) {
     try {
       context.getPipelineMeta().unselectAll();
@@ -3892,56 +3896,19 @@ public class HopGuiPipelineGraph extends HopGuiAbstractGraph
           hopGui.getLog(),
           pipelineMeta,
           true,
-          false,
-          pipelineRunDelegate.getPipelinePreviewExecutionConfiguration().getLogLevel());
+          pipelineRunDelegate.getPipelinePreviewDebugExecutionConfiguration().getLogLevel());
     } catch (Exception e) {
       new ErrorDialog(hopShell(), CONST_ERROR, CONST_ERROR_PREVIEWING_PIPELINE, e);
     }
   }
 
-  @GuiToolbarElement(
-      root = GUI_PLUGIN_TOOLBAR_PARENT_ID,
-      id = TOOLBAR_ITEM_DEBUG,
-      // label = "Debug",
-      toolTip = "i18n::PipelineGraph.Toolbar.Debug.Tooltip",
-      image = "ui/images/debug.svg")
   @Override
   public void debug() {
-    try {
-      pipelineRunDelegate.executePipeline(
-          hopGui.getLog(),
-          pipelineMeta,
-          false,
-          true,
-          pipelineRunDelegate.getPipelineDebugExecutionConfiguration().getLogLevel());
-    } catch (Exception e) {
-      new ErrorDialog(hopShell(), CONST_ERROR, "Error debugging pipeline", e);
-    }
+    preview();
   }
 
-  @GuiContextAction(
-      id = "pipeline-graph-transform-10150-debug-output",
-      parentId = HopGuiPipelineTransformContext.CONTEXT_ID,
-      type = GuiActionType.Info,
-      name = "i18n::HopGuiPipelineGraph.PipelineAction.DebugOutput.Name",
-      tooltip = "i18n::HopGuiPipelineGraph.PipelineAction.DebugOutput.Tooltip",
-      image = "ui/images/debug.svg",
-      category = "i18n::HopGuiPipelineGraph.ContextualAction.Category.Preview.Text",
-      categoryOrder = "3")
-  // Debug a single transform
   public void debug(HopGuiPipelineTransformContext context) {
-    try {
-      context.getPipelineMeta().unselectAll();
-      context.getTransformMeta().setSelected(true);
-      pipelineRunDelegate.executePipeline(
-          hopGui.getLog(),
-          pipelineMeta,
-          false,
-          true,
-          pipelineRunDelegate.getPipelineDebugExecutionConfiguration().getLogLevel());
-    } catch (Exception e) {
-      new ErrorDialog(hopShell(), CONST_ERROR, CONST_ERROR_PREVIEWING_PIPELINE, e);
-    }
+    preview(context);
   }
 
   public void newProps() {
@@ -4217,7 +4184,7 @@ public class HopGuiPipelineGraph extends HopGuiAbstractGraph
                                 pauseResume();
                               } else {
                                 pipelineRunDelegate.executePipeline(
-                                    hopGui.getLog(), pipelineMeta, false, false, LogLevel.BASIC);
+                                    hopGui.getLog(), pipelineMeta, false, LogLevel.BASIC);
                                 ServerPushSessionFacade.stop();
                               }
                             } catch (Throwable e) {
diff --git a/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/HopPipelineFileType.java b/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/HopPipelineFileType.java
index 6e126ec70a..c05e7cb470 100644
--- a/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/HopPipelineFileType.java
+++ b/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/HopPipelineFileType.java
@@ -89,7 +89,6 @@ public class HopPipelineFileType<T extends PipelineMeta> extends HopFileTypeBase
     capabilities.setProperty(IHopFileType.CAPABILITY_EXPORT_TO_SVG, "true");
     capabilities.setProperty(IHopFileType.CAPABILITY_PAUSE, "true");
     capabilities.setProperty(IHopFileType.CAPABILITY_PREVIEW, "true");
-    capabilities.setProperty(IHopFileType.CAPABILITY_DEBUG, "true");
 
     capabilities.setProperty(IHopFileType.CAPABILITY_SELECT, "true");
     capabilities.setProperty(IHopFileType.CAPABILITY_COPY, "true");
diff --git a/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/delegates/HopGuiPipelineRunDelegate.java b/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/delegates/HopGuiPipelineRunDelegate.java
index e989d8e63f..02c87e88f1 100644
--- a/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/delegates/HopGuiPipelineRunDelegate.java
+++ b/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/delegates/HopGuiPipelineRunDelegate.java
@@ -49,8 +49,7 @@ public class HopGuiPipelineRunDelegate {
   private HopGui hopGui;
 
   private PipelineExecutionConfiguration pipelineExecutionConfiguration;
-  private PipelineExecutionConfiguration pipelinePreviewExecutionConfiguration;
-  private PipelineExecutionConfiguration pipelineDebugExecutionConfiguration;
+  private PipelineExecutionConfiguration pipelinePreviewDebugExecutionConfiguration;
 
   /**
    * This contains a map between the name of a pipeline and the PipelineMeta object. If the pipeline
@@ -58,11 +57,8 @@ public class HopGuiPipelineRunDelegate {
    */
   private List<PipelineMeta> pipelineMap;
 
-  /** Remember the debugging configuration per pipeline */
-  private Map<PipelineMeta, PipelineDebugMeta> pipelineDebugMetaMap;
-
-  /** Remember the preview configuration per pipeline */
-  private Map<PipelineMeta, PipelineDebugMeta> pipelinePreviewMetaMap;
+  /** Remember preview and debug configuration per pipeline */
+  private Map<PipelineMeta, PipelineDebugMeta> pipelinePreviewDebugMetaMap;
 
   /**
    * @param hopGui
@@ -72,19 +68,16 @@ public class HopGuiPipelineRunDelegate {
     this.pipelineGraph = pipelineGraph;
 
     pipelineExecutionConfiguration = new PipelineExecutionConfiguration();
-    pipelinePreviewExecutionConfiguration = new PipelineExecutionConfiguration();
-    pipelineDebugExecutionConfiguration = new PipelineExecutionConfiguration();
+    pipelinePreviewDebugExecutionConfiguration = new PipelineExecutionConfiguration();
 
     pipelineMap = new ArrayList<>();
-    pipelineDebugMetaMap = new HashMap<>();
-    pipelinePreviewMetaMap = new HashMap<>();
+    pipelinePreviewDebugMetaMap = new HashMap<>();
   }
 
   public PipelineExecutionConfiguration executePipeline(
       final ILogChannel log,
       final PipelineMeta pipelineMeta,
-      final boolean preview,
-      final boolean debug,
+      final boolean previewDebug,
       LogLevel logLevel)
       throws HopException {
 
@@ -97,10 +90,8 @@ public class HopGuiPipelineRunDelegate {
     PipelineDebugMeta pipelineDebugMeta = null;
     PipelineExecutionConfiguration executionConfiguration = null;
 
-    if (preview) {
-      executionConfiguration = getPipelinePreviewExecutionConfiguration();
-    } else if (debug) {
-      executionConfiguration = getPipelineDebugExecutionConfiguration();
+    if (previewDebug) {
+      executionConfiguration = getPipelinePreviewDebugExecutionConfiguration();
     } else {
       executionConfiguration = getPipelineExecutionConfiguration();
     }
@@ -109,16 +100,13 @@ public class HopGuiPipelineRunDelegate {
     //
     pipelineMeta.setMetadataProvider(hopGui.getMetadataProvider());
 
-    if (debug || preview) {
-      // Both debug and preview collect the first N rows from the selected transform.
-      // Debug additionally activates the pause-on-break-point flag so the pipeline pauses
-      // after delivering the rows, giving Stop/Next control in the preview dialog.
-      Map<PipelineMeta, PipelineDebugMeta> metaMap =
-          debug ? pipelineDebugMetaMap : pipelinePreviewMetaMap;
-      pipelineDebugMeta = metaMap.get(pipelineMeta);
+    if (previewDebug) {
+      // Collect the first N rows from selected transforms; pause-on-breakpoint is configured per
+      // transform in the dialog (TransformDebugMeta#setPausingOnBreakPoint).
+      pipelineDebugMeta = pipelinePreviewDebugMetaMap.get(pipelineMeta);
       if (pipelineDebugMeta == null) {
         pipelineDebugMeta = new PipelineDebugMeta(pipelineMeta);
-        metaMap.put(pipelineMeta, pipelineDebugMeta);
+        pipelinePreviewDebugMetaMap.put(pipelineMeta, pipelineDebugMeta);
       }
       // Reset execution-state flag from any previous run so the finished listener
       // is not silently skipped when the same PipelineDebugMeta object is reused.
@@ -131,7 +119,7 @@ public class HopGuiPipelineRunDelegate {
           TransformDebugMeta transformDebugMeta = new TransformDebugMeta(transformMeta);
           transformDebugMeta.setRowCount(PropsUi.getInstance().getDefaultPreviewSize());
           transformDebugMeta.setReadingFirstRows(true);
-          transformDebugMeta.setPausingOnBreakPoint(debug);
+          transformDebugMeta.setPausingOnBreakPoint(false);
           pipelineDebugMeta.getTransformDebugMetaMap().put(transformMeta, transformDebugMeta);
         }
       }
@@ -139,7 +127,7 @@ public class HopGuiPipelineRunDelegate {
 
     int debugAnswer = PipelineDebugDialog.DEBUG_CONFIG;
 
-    if (debug || preview) {
+    if (previewDebug) {
       PipelineDebugDialog pipelineDebugDialog =
           new PipelineDebugDialog(
               hopGui.getShell(), pipelineGraph.getVariables(), pipelineDebugMeta);
@@ -156,7 +144,7 @@ public class HopGuiPipelineRunDelegate {
     executionConfiguration.getUsedVariables(pipelineGraph.getVariables(), pipelineMeta);
     executionConfiguration.setLogLevel(logLevel);
 
-    if (debug || preview) {
+    if (previewDebug) {
       // Make sure to re-set the default parameter values. They could have been changed since the
       // last execution.
       //
@@ -195,10 +183,7 @@ public class HopGuiPipelineRunDelegate {
           HopExtensionPoint.HopGuiPipelineExecutionConfiguration.id,
           executionConfiguration);
 
-      // Verify if there is at least one transform specified to debug or preview...
-      // TODO: Is this a local preview or debugging execution? We might want to get rid of the
-      // distinction
-      if (debug || preview) {
+      if (previewDebug) {
         if (pipelineDebugMeta.getNrOfUsedTransforms() == 0) {
           MessageBox box = new MessageBox(hopGui.getShell(), SWT.ICON_WARNING | SWT.YES | SWT.NO);
           box.setText(
@@ -269,38 +254,17 @@ public class HopGuiPipelineRunDelegate {
     this.pipelineExecutionConfiguration = pipelineExecutionConfiguration;
   }
 
-  /**
-   * Gets pipelinePreviewExecutionConfiguration
-   *
-   * @return value of pipelinePreviewExecutionConfiguration
-   */
-  public PipelineExecutionConfiguration getPipelinePreviewExecutionConfiguration() {
-    return pipelinePreviewExecutionConfiguration;
-  }
-
-  /**
-   * @param pipelinePreviewExecutionConfiguration The pipelinePreviewExecutionConfiguration to set
-   */
-  public void setPipelinePreviewExecutionConfiguration(
-      PipelineExecutionConfiguration pipelinePreviewExecutionConfiguration) {
-    this.pipelinePreviewExecutionConfiguration = pipelinePreviewExecutionConfiguration;
-  }
-
-  /**
-   * Gets pipelineDebugExecutionConfiguration
-   *
-   * @return value of pipelineDebugExecutionConfiguration
-   */
-  public PipelineExecutionConfiguration getPipelineDebugExecutionConfiguration() {
-    return pipelineDebugExecutionConfiguration;
+  /** Execution settings for pipeline preview and debug runs. */
+  public PipelineExecutionConfiguration getPipelinePreviewDebugExecutionConfiguration() {
+    return pipelinePreviewDebugExecutionConfiguration;
   }
 
   /**
-   * @param pipelineDebugExecutionConfiguration The pipelineDebugExecutionConfiguration to set
+   * @param pipelinePreviewDebugExecutionConfiguration The preview and debug execution configuration
    */
-  public void setPipelineDebugExecutionConfiguration(
-      PipelineExecutionConfiguration pipelineDebugExecutionConfiguration) {
-    this.pipelineDebugExecutionConfiguration = pipelineDebugExecutionConfiguration;
+  public void setPipelinePreviewDebugExecutionConfiguration(
+      PipelineExecutionConfiguration pipelinePreviewDebugExecutionConfiguration) {
+    this.pipelinePreviewDebugExecutionConfiguration = pipelinePreviewDebugExecutionConfiguration;
   }
 
   /**
@@ -319,36 +283,16 @@ public class HopGuiPipelineRunDelegate {
     this.pipelineMap = pipelineMap;
   }
 
-  /**
-   * Gets pipelineDebugMetaMap
-   *
-   * @return value of pipelineDebugMetaMap
-   */
-  public Map<PipelineMeta, PipelineDebugMeta> getPipelineDebugMetaMap() {
-    return pipelineDebugMetaMap;
-  }
-
-  /**
-   * @param pipelineDebugMetaMap The pipelineDebugMetaMap to set
-   */
-  public void setPipelineDebugMetaMap(Map<PipelineMeta, PipelineDebugMeta> pipelineDebugMetaMap) {
-    this.pipelineDebugMetaMap = pipelineDebugMetaMap;
-  }
-
-  /**
-   * Gets pipelinePreviewMetaMap
-   *
-   * @return value of pipelinePreviewMetaMap
-   */
-  public Map<PipelineMeta, PipelineDebugMeta> getPipelinePreviewMetaMap() {
-    return pipelinePreviewMetaMap;
+  /** Preview and debug metadata remembered per pipeline. */
+  public Map<PipelineMeta, PipelineDebugMeta> getPipelinePreviewDebugMetaMap() {
+    return pipelinePreviewDebugMetaMap;
   }
 
   /**
-   * @param pipelinePreviewMetaMap The pipelinePreviewMetaMap to set
+   * @param pipelinePreviewDebugMetaMap The preview and debug meta map to set
    */
-  public void setPipelinePreviewMetaMap(
-      Map<PipelineMeta, PipelineDebugMeta> pipelinePreviewMetaMap) {
-    this.pipelinePreviewMetaMap = pipelinePreviewMetaMap;
+  public void setPipelinePreviewDebugMetaMap(
+      Map<PipelineMeta, PipelineDebugMeta> pipelinePreviewDebugMetaMap) {
+    this.pipelinePreviewDebugMetaMap = pipelinePreviewDebugMetaMap;
   }
 }
diff --git a/ui/src/main/resources/org/apache/hop/ui/hopgui/file/pipeline/messages/messages_en_US.properties b/ui/src/main/resources/org/apache/hop/ui/hopgui/file/pipeline/messages/messages_en_US.properties
index e3f83c21a9..52de2828f3 100644
--- a/ui/src/main/resources/org/apache/hop/ui/hopgui/file/pipeline/messages/messages_en_US.properties
+++ b/ui/src/main/resources/org/apache/hop/ui/hopgui/file/pipeline/messages/messages_en_US.properties
@@ -18,7 +18,7 @@
 HopGuiPipelineGraph.ContextualAction.Category.Arrange.Text=Arrange
 HopGuiPipelineGraph.ContextualAction.Category.Basic.Text=Basic
 HopGuiPipelineGraph.ContextualAction.Category.Bulk.Text=Bulk
-HopGuiPipelineGraph.ContextualAction.Category.Preview.Text=Preview
+HopGuiPipelineGraph.ContextualAction.Category.Preview.Text=Preview & debug
 HopGuiPipelineGraph.ContextualAction.Category.Routing.Text=Data routing
 HopGuiPipelineGraph.ContextualAction.NavigateToExecutionInfo.Text=To execution info
 HopGuiPipelineGraph.ContextualAction.NavigateToExecutionInfo.Tooltip=Navigate to the execution information for this pipeline
@@ -59,14 +59,12 @@ HopGuiPipelineGraph.NoteAction.SendToBack.Text=Send to back
 HopGuiPipelineGraph.NoteAction.SendToBack.Tooltip=Send note to back
 HopGuiPipelineGraph.PipelineAction.CopyToClipboard.Name=Copy to clipboard
 HopGuiPipelineGraph.PipelineAction.CopyToClipboard.Tooltip=Copy the XML representation of this object to the clipboard
-HopGuiPipelineGraph.PipelineAction.DebugOutput.Name=Debug output
-HopGuiPipelineGraph.PipelineAction.DebugOutput.Tooltip=Execute the pipeline and debug output of the transform. Pause the pipeline when the condition is met.
 HopGuiPipelineGraph.PipelineAction.EditPipeline.Name=Edit pipeline
 HopGuiPipelineGraph.PipelineAction.EditPipeline.Tooltip=Edit pipeline properties
 HopGuiPipelineGraph.PipelineAction.PasteFromClipboard.Name=Paste from the clipboard
 HopGuiPipelineGraph.PipelineAction.PasteFromClipboard.Tooltip=Paste transforms, notes or a whole pipeline from the clipboard
-HopGuiPipelineGraph.PipelineAction.Preview.Name=Preview output
-HopGuiPipelineGraph.PipelineAction.Preview.Tooltip=Execute the pipeline and see the output of the transform
+HopGuiPipelineGraph.PipelineAction.Preview.Name=Preview & debug output
+HopGuiPipelineGraph.PipelineAction.Preview.Tooltip=Execute the pipeline and inspect transform output (preview rows, conditions, pause on breakpoint)
 HopGuiPipelineGraph.PipelineAction.SniffOutput.Name=Sniff output
 HopGuiPipelineGraph.PipelineAction.SniffOutput.Tooltip=Take a look at 50 rows coming out of the selected transform
 HopGuiPipelineGraph.TransformAction.CopyRows.Name=Copy rows
@@ -106,11 +104,10 @@ PipelineGraph.Toolbar.AlignBottom.Tooltip=Align the transforms with the bottom-m
 PipelineGraph.Toolbar.AlignLeft.Tooltip=Align the transforms with the left-most transform in your selection
 PipelineGraph.Toolbar.AlignRight.Tooltip=Align the transforms with the right-most transform in your selection
 PipelineGraph.Toolbar.AlignTop.Tooltip=Align the transforms with the top-most transform in your selection
-PipelineGraph.Toolbar.Debug.Tooltip=Debug the pipeline
 PipelineGraph.Toolbar.DistributeHorizontal.Tooltip=Distribute the selected transforms evenly between the left-most and right-most transform in your selection
 PipelineGraph.Toolbar.DistributeVertical.Tooltip=Distribute the selected transforms evenly between the top-most and bottom-most transform in your selection
 PipelineGraph.Toolbar.Pause.Tooltip=Pause the execution of the pipeline
-PipelineGraph.Toolbar.Preview.Tooltip=Preview the pipeline
+PipelineGraph.Toolbar.Preview.Tooltip=Preview and debug the pipeline
 PipelineGraph.Toolbar.SnapToGrid.Tooltip=Align the selected transforms to the specified grid size
 PipelineGraph.Toolbar.Start.Tooltip=Start the execution of the pipeline
 PipelineGraph.Toolbar.Stop.Tooltip=Stop the execution of the pipeline
diff --git a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_de_DE.properties b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_de_DE.properties
index 0663b8b367..ef34795ac4 100644
--- a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_de_DE.properties
+++ b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_de_DE.properties
@@ -105,9 +105,7 @@ HopGui.Menu.Help.About=\u00DCber...
 HopGui.Menu.Redo.Available=&Wiederholen : {0}
 HopGui.Menu.Redo.NotAvailable=&Wiederholen : nicht verf\u00FCgbar
 HopGui.Menu.Run=Starten
-HopGui.Menu.Run.Debug=Debuggen
 HopGui.Menu.Run.PauseExecution=Ausf\u00FChrung pausieren
-HopGui.Menu.Run.Preview=Vorschau
 HopGui.Menu.Run.ResumeExecution=Ausf\u00FChrung fortsetzen
 HopGui.Menu.Run.StartExecution=Ausf\u00FChrung starten
 HopGui.Menu.Run.StopExecution=Ausf\u00FChrung stoppen
diff --git a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_en_US.properties b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_en_US.properties
index 88769f6d35..0101bc35cb 100644
--- a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_en_US.properties
+++ b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_en_US.properties
@@ -109,9 +109,8 @@ HopGui.Menu.View.NewTerminal=&New Terminal
 HopGui.Menu.Redo.Available=Redo \: {0}
 HopGui.Menu.Redo.NotAvailable=Redo \: not available
 HopGui.Menu.Run=&Run
-HopGui.Menu.Run.Debug=Debug
 HopGui.Menu.Run.PauseExecution=Pause Execution
-HopGui.Menu.Run.Preview=Preview
+HopGui.Menu.Run.Preview=Preview & debug
 HopGui.Menu.Run.ResumeExecution=Resume Execution
 HopGui.Menu.Run.StartExecution=Start Execution
 HopGui.Menu.Run.StopExecution=Stop Execution
diff --git a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_es_ES.properties b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_es_ES.properties
index b45749c776..5ce0ad92e6 100644
--- a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_es_ES.properties
+++ b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_es_ES.properties
@@ -108,9 +108,7 @@ HopGui.Menu.Help.About=Acerca de...
 HopGui.Menu.Redo.Available=Rehacer \: {0}
 HopGui.Menu.Redo.NotAvailable=Rehacer \: no disponible
 HopGui.Menu.Run=&Ejecutar
-HopGui.Menu.Run.Debug=Depurar
 HopGui.Menu.Run.PauseExecution=Pausar la ejecuci\u00F3n
-HopGui.Menu.Run.Preview=Vista previa
 HopGui.Menu.Run.ResumeExecution=Continuar la ejecuci\u00F3n
 HopGui.Menu.Run.StartExecution=Iniciar ejecuci\u00F3n
 HopGui.Menu.Run.StopExecution=Detener ejecuci\u00F3n
diff --git a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_fr_FR.properties b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_fr_FR.properties
index 2d56c35931..98e8080221 100644
--- a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_fr_FR.properties
+++ b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_fr_FR.properties
@@ -105,9 +105,7 @@ HopGui.Menu.Help.About=A propos...
 HopGui.Menu.Redo.Available=R\u00E9tablir \: {0}
 HopGui.Menu.Redo.NotAvailable=R\u00E9tablir \: indisponible
 HopGui.Menu.Run=Ex\u00E9cute&r
-HopGui.Menu.Run.Debug=D\u00E9boguer
 HopGui.Menu.Run.PauseExecution=Mettre l''ex\u00E9cution en pause
-HopGui.Menu.Run.Preview=Pr\u00E9visualiser
 HopGui.Menu.Run.ResumeExecution=Reprendre l''ex\u00E9cution
 HopGui.Menu.Run.StartExecution=D\u00E9marrer l''ex\u00E9cution
 HopGui.Menu.Run.StopExecution=Arr\u00EAter l''ex\u00E9cution
diff --git a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_it_IT.properties b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_it_IT.properties
index 0ad27889d9..efba83332f 100644
--- a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_it_IT.properties
+++ b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_it_IT.properties
@@ -100,9 +100,7 @@ HopGui.Menu.Help.About=About...
 HopGui.Menu.Redo.Available=Ripeti \: {0}
 HopGui.Menu.Redo.NotAvailable=Ripeti\: operazione non disponibile
 HopGui.Menu.Run=&Esegui
-HopGui.Menu.Run.Debug=Debug
 HopGui.Menu.Run.PauseExecution=Metti in pausa
-HopGui.Menu.Run.Preview=Anteprima
 HopGui.Menu.Run.ResumeExecution=Ripristina esecuzione
 HopGui.Menu.Run.StartExecution=Avvia esecuzione
 HopGui.Menu.Run.StopExecution=Termina esecuzione
diff --git a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_nl_NL.properties b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_nl_NL.properties
index 4e9775e8ec..6420808ab0 100644
--- a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_nl_NL.properties
+++ b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_nl_NL.properties
@@ -72,9 +72,7 @@ HopGui.Menu.Help.About=Over..
 HopGui.Menu.Redo.Available=Opnieuw doen \: {0}
 HopGui.Menu.Redo.NotAvailable=Opnieuw doen \: niet beschikbaar
 HopGui.Menu.Run=Uitvoeren
-HopGui.Menu.Run.Debug=Debug
 HopGui.Menu.Run.PauseExecution=Pauzeer
-HopGui.Menu.Run.Preview=Voorbeeld
 HopGui.Menu.Run.ResumeExecution=Hervat uitvoering
 HopGui.Menu.Run.StartExecution=Start uitvoering
 HopGui.Menu.Run.StopExecution=Stop uitvoering
diff --git a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_pt_BR.properties b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_pt_BR.properties
index d84b5e9b49..d8d284b779 100644
--- a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_pt_BR.properties
+++ b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_pt_BR.properties
@@ -109,9 +109,7 @@ HopGui.Menu.Help.About=Acerca de...
 HopGui.Menu.Redo.Available=Refaz \: {0}
 HopGui.Menu.Redo.NotAvailable=Refaz \: n\u00E3o dispon\u00EDvel
 HopGui.Menu.Run=&Executar
-HopGui.Menu.Run.Debug=Depurar
 HopGui.Menu.Run.PauseExecution=Pausar Execu\u00E7\u00E3o
-HopGui.Menu.Run.Preview=Pr\u00E9via
 HopGui.Menu.Run.ResumeExecution=Continuar Execu\u00E7\u00E3o
 HopGui.Menu.Run.StartExecution=Iniciar Execu\u00E7\u00E3o
 HopGui.Menu.Run.StopExecution=Parar Execu\u00E7\u00E3o
diff --git a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_zh_CN.properties b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_zh_CN.properties
index 2aad627a35..1f4376482b 100644
--- a/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_zh_CN.properties
+++ b/ui/src/main/resources/org/apache/hop/ui/hopgui/messages/messages_zh_CN.properties
@@ -101,9 +101,7 @@ HopGui.Menu.Help.About=\u5173\u4E8E...
 HopGui.Menu.Redo.Available=\u91CD\u505A\: {0}
 HopGui.Menu.Redo.NotAvailable=\u91CD\u505A\: \u4E0D\u53EF\u83B7\u5F97
 HopGui.Menu.Run=\u6267\u884C(&R)
-HopGui.Menu.Run.Debug=\u8C03\u8BD5...
 HopGui.Menu.Run.PauseExecution=\u6682\u505C
-HopGui.Menu.Run.Preview=\u9884\u89C8...
 HopGui.Menu.Run.ResumeExecution=\u6062\u590D
 HopGui.Menu.Run.StartExecution=\u8FD0\u884C...
 HopGui.Menu.Run.StopExecution=\u505C\u6B62