diff --git a/core/ui/src/main/java/org/phoebus/ui/docking/DockItem.java b/core/ui/src/main/java/org/phoebus/ui/docking/DockItem.java index cdca334c52..0945cc79d2 100644 --- a/core/ui/src/main/java/org/phoebus/ui/docking/DockItem.java +++ b/core/ui/src/main/java/org/phoebus/ui/docking/DockItem.java @@ -176,6 +176,17 @@ public DockItem(final String label) createContextMenu(); setOnClosed(event -> handleClosed()); + setOnCloseRequest(event -> { + // Select the previously selected tab: + var dockPane = getDockPane(); + dockPane.tabsInOrderOfFocus.remove(this); + + if (dockPane.tabsInOrderOfFocus.size() > 0) { + var tabToSelect = dockPane.tabsInOrderOfFocus.getFirst(); + var selectionModel = dockPane.getSelectionModel(); + selectionModel.select(tabToSelect); + } + }); } /** This tab should be in a DockPane, not a plain TabPane @@ -593,20 +604,24 @@ public void select() */ public void addCloseCheck(final Supplier> ok_to_close) { - if (getOnCloseRequest() == null) - setOnCloseRequest(event -> - { - // For now, prevent closing - event.consume(); + var alreadyExistingEventHandler = getOnCloseRequest(); - // Invoke all the ok-to-close checks in background threads - // since those that save files might take time. - JobManager.schedule("Close " + getLabel(), monitor -> - { - if (prepareToClose()) - Platform.runLater(() -> close()); - }); + setOnCloseRequest(event -> { + // For now, prevent closing + event.consume(); + + // Invoke all the ok-to-close checks in background threads + // since those that save files might take time. + JobManager.schedule("Close " + getLabel(), monitor -> + { + if (prepareToClose()) { + if (alreadyExistingEventHandler != null) { + alreadyExistingEventHandler.handle(event); + } + Platform.runLater(() -> close()); + } }); + }); close_check.add(ok_to_close); } @@ -691,6 +706,10 @@ protected void handleClosed() setContent(null); // Remove "application" entry which otherwise holds on to application data model getProperties().remove(KEY_APPLICATION); + var dockPane = getDockPane(); + if (dockPane != null) { + dockPane.tabsInOrderOfFocus.remove(this); + } } /** Programmatically close this tab diff --git a/core/ui/src/main/java/org/phoebus/ui/docking/DockPane.java b/core/ui/src/main/java/org/phoebus/ui/docking/DockPane.java index bf064e304a..7191d08a1a 100644 --- a/core/ui/src/main/java/org/phoebus/ui/docking/DockPane.java +++ b/core/ui/src/main/java/org/phoebus/ui/docking/DockPane.java @@ -9,7 +9,11 @@ import java.lang.ref.WeakReference; import java.text.MessageFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; import java.util.logging.Level; @@ -219,8 +223,17 @@ public static void alwaysShowTabs(final boolean do_show_single_tabs) getTabs().addListener((InvalidationListener) change -> handleTabChanges()); setOnContextMenuRequested(this::showContextMenu); + + getSelectionModel().selectedItemProperty().addListener((observable, previous_item, new_item) -> { + // Keep track of the order of focus of tabs: + if (new_item != null) { + tabsInOrderOfFocus.remove(new_item); + tabsInOrderOfFocus.push((DockItem) new_item); + } + }); } + protected LinkedList tabsInOrderOfFocus = new LinkedList<>(); private void showContextMenu(final ContextMenuEvent event) {