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 32166a0f25 fix Hop Gui startup after Hop Web updates. fixes #8479 
(#8481)
32166a0f25 is described below

commit 32166a0f255cf3e3d9c5a258116f250fbf5da4bb
Author: Bart Maertens <[email protected]>
AuthorDate: Sun Sep 20 11:51:44 2026 +0200

    fix Hop Gui startup after Hop Web updates. fixes #8479 (#8481)
---
 .../hop/ui/hopgui/perspective/TabCloseHandler.java | 15 +++++-
 .../perspective/explorer/ExplorerPerspective.java  | 57 ++++++++++------------
 2 files changed, 38 insertions(+), 34 deletions(-)

diff --git 
a/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/TabCloseHandler.java 
b/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/TabCloseHandler.java
index 5e0b7b36b1..38ca3a526d 100644
--- a/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/TabCloseHandler.java
+++ b/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/TabCloseHandler.java
@@ -17,6 +17,7 @@
 
 package org.apache.hop.ui.hopgui.perspective;
 
+import lombok.Getter;
 import org.apache.hop.i18n.BaseMessages;
 import org.apache.hop.ui.hopgui.HopGui;
 import org.eclipse.swt.SWT;
@@ -33,8 +34,18 @@ public class TabCloseHandler {
 
   private final TabClosable tabClosablePerspective;
   CTabFolder tabFolder;
-  CTabItem selectedItem;
-  private final Menu menu;
+
+  /**
+   * The tab the context menu was opened on. It is set before the menu is 
shown, so listeners on the
+   * menu can rely on it being current for this click.
+   */
+  @Getter CTabItem selectedItem;
+
+  /**
+   * The tab context menu. It is not attached to the folder, so callers that 
want to add their own
+   * items have to get it from here rather than from {@code 
CTabFolder.getMenu()}.
+   */
+  @Getter private final Menu menu;
 
   public TabCloseHandler(TabClosable tabClosablePerspective) {
     this(tabClosablePerspective, tabClosablePerspective.getTabFolder());
diff --git 
a/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/explorer/ExplorerPerspective.java
 
b/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/explorer/ExplorerPerspective.java
index f61d6b5a52..3b859237fa 100644
--- 
a/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/explorer/ExplorerPerspective.java
+++ 
b/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/explorer/ExplorerPerspective.java
@@ -159,7 +159,6 @@ import org.eclipse.swt.dnd.FileTransfer;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.layout.FormAttachment;
 import org.eclipse.swt.layout.FormData;
@@ -308,7 +307,6 @@ public class ExplorerPerspective implements 
IHopPerspective, TabClosable, IFileD
   private final List<TabItemHandler> items;
   private boolean showingHiddenFiles;
 
-  private CTabItem splitMenuTargetTab;
   private boolean fileExplorerPanelVisible = true;
   @Getter private String rootFolder;
   @Getter private String rootName;
@@ -2154,13 +2152,14 @@ public class ExplorerPerspective implements 
IHopPerspective, TabClosable, IFileD
       folder.setTabHeight(Math.max(height, folder.getTabHeight()));
     }
 
-    new TabCloseHandler(this, folder);
+    TabCloseHandler tabCloseHandler = new TabCloseHandler(this, folder);
     new TabItemReorder(this, folder);
 
     // Split ("Move to Right") works in both desktop and web since it operates 
within the docked
     // editor layout. Detach ("Move to New Window") depends on floating 
windows, which don't work
     // under RAP, so it is desktop-only.
-    Menu menu = folder.getMenu();
+    // The tab menu is not attached to the folder, so take it from the close 
handler that owns it.
+    Menu menu = tabCloseHandler.getMenu();
     new MenuItem(menu, SWT.SEPARATOR);
     MenuItem miSplitMove = new MenuItem(menu, SWT.NONE);
     miSplitMove.setText(BaseMessages.getString(PKG, 
"ExplorerPerspective.TabMenu.MoveToRight"));
@@ -2176,20 +2175,6 @@ public class ExplorerPerspective implements 
IHopPerspective, TabClosable, IFileD
     MenuItem miJoinAbove = new MenuItem(menu, SWT.NONE);
     miJoinAbove.setText(BaseMessages.getString(PKG, 
"ExplorerPerspective.TabMenu.JoinAbove"));
 
-    folder.addListener(
-        SWT.MenuDetect,
-        event -> {
-          Point pt =
-              (event.x != 0 || event.y != 0)
-                  ? folder.toControl(event.x, event.y)
-                  : folder.toControl(folder.getDisplay().getCursorLocation());
-          CTabItem item = folder.getItem(new Point(pt.x, pt.y));
-          if (item == null) {
-            item = folder.getSelection();
-          }
-          splitMenuTargetTab = item;
-        });
-
     final MenuItem miDetach;
     if (!EnvironmentUtils.getInstance().isWeb()) {
       new MenuItem(menu, SWT.SEPARATOR);
@@ -2198,8 +2183,9 @@ public class ExplorerPerspective implements 
IHopPerspective, TabClosable, IFileD
       miDetach.addListener(
           SWT.Selection,
           e -> {
-            if (splitMenuTargetTab != null && 
!splitMenuTargetTab.isDisposed()) {
-              detachTabToWindow(splitMenuTargetTab);
+            CTabItem targetTab = tabCloseHandler.getSelectedItem();
+            if (targetTab != null && !targetTab.isDisposed()) {
+              detachTabToWindow(targetTab);
             }
           });
     } else {
@@ -2215,48 +2201,54 @@ public class ExplorerPerspective implements 
IHopPerspective, TabClosable, IFileD
           miJoinLeft.setText(BaseMessages.getString(PKG, 
"ExplorerPerspective.TabMenu.JoinLeft"));
           miJoinAbove.setText(BaseMessages.getString(PKG, 
"ExplorerPerspective.TabMenu.JoinAbove"));
 
+          // The close handler sets this before it shows the menu, so it is 
current for this click.
+          CTabItem targetTab = tabCloseHandler.getSelectedItem();
+
           // Splitting creates a new pane, requiring at least one tab to stay 
behind.
-          boolean canSplit = splitMenuTargetTab != null && 
folder.getItemCount() > 1;
+          boolean canSplit = targetTab != null && folder.getItemCount() > 1;
           miSplitMove.setEnabled(canSplit);
           miSplitDown.setEnabled(canSplit);
 
           // Joining moves the tab into an existing adjacent pane.
           CTabFolder leftFolder = findFolderToLeft(folder);
           miJoinLeft.setEnabled(
-              splitMenuTargetTab != null && leftFolder != null && 
!leftFolder.isDisposed());
+              targetTab != null && leftFolder != null && 
!leftFolder.isDisposed());
 
           CTabFolder aboveFolder = findFolderAbove(folder);
           miJoinAbove.setEnabled(
-              splitMenuTargetTab != null && aboveFolder != null && 
!aboveFolder.isDisposed());
+              targetTab != null && aboveFolder != null && 
!aboveFolder.isDisposed());
 
           if (miDetach != null) {
-            miDetach.setEnabled(splitMenuTargetTab != null);
+            miDetach.setEnabled(targetTab != null);
           }
         });
 
     miSplitMove.addListener(
         SWT.Selection,
         e -> {
-          if (splitMenuTargetTab != null && !splitMenuTargetTab.isDisposed()) {
-            splitAndMoveTab(splitMenuTargetTab, SWT.HORIZONTAL, true);
+          CTabItem targetTab = tabCloseHandler.getSelectedItem();
+          if (targetTab != null && !targetTab.isDisposed()) {
+            splitAndMoveTab(targetTab, SWT.HORIZONTAL, true);
           }
         });
 
     miSplitDown.addListener(
         SWT.Selection,
         e -> {
-          if (splitMenuTargetTab != null && !splitMenuTargetTab.isDisposed()) {
-            splitAndMoveTab(splitMenuTargetTab, SWT.VERTICAL, true);
+          CTabItem targetTab = tabCloseHandler.getSelectedItem();
+          if (targetTab != null && !targetTab.isDisposed()) {
+            splitAndMoveTab(targetTab, SWT.VERTICAL, true);
           }
         });
 
     miJoinLeft.addListener(
         SWT.Selection,
         e -> {
-          if (splitMenuTargetTab != null && !splitMenuTargetTab.isDisposed()) {
+          CTabItem targetTab = tabCloseHandler.getSelectedItem();
+          if (targetTab != null && !targetTab.isDisposed()) {
             CTabFolder leftFolder = findFolderToLeft(folder);
             if (leftFolder != null && !leftFolder.isDisposed()) {
-              joinTabToFolder(splitMenuTargetTab, leftFolder);
+              joinTabToFolder(targetTab, leftFolder);
             }
           }
         });
@@ -2264,10 +2256,11 @@ public class ExplorerPerspective implements 
IHopPerspective, TabClosable, IFileD
     miJoinAbove.addListener(
         SWT.Selection,
         e -> {
-          if (splitMenuTargetTab != null && !splitMenuTargetTab.isDisposed()) {
+          CTabItem targetTab = tabCloseHandler.getSelectedItem();
+          if (targetTab != null && !targetTab.isDisposed()) {
             CTabFolder aboveFolder = findFolderAbove(folder);
             if (aboveFolder != null && !aboveFolder.isDisposed()) {
-              joinTabToFolder(splitMenuTargetTab, aboveFolder);
+              joinTabToFolder(targetTab, aboveFolder);
             }
           }
         });

Reply via email to