diff --git a/app/filebrowser/src/main/java/org/phoebus/applications/filebrowser/FileBrowser.java b/app/filebrowser/src/main/java/org/phoebus/applications/filebrowser/FileBrowser.java index d83506b943..b4ca758044 100644 --- a/app/filebrowser/src/main/java/org/phoebus/applications/filebrowser/FileBrowser.java +++ b/app/filebrowser/src/main/java/org/phoebus/applications/filebrowser/FileBrowser.java @@ -58,16 +58,34 @@ public class FileBrowser implements AppInstance final DockItem tab = new DockItem(this, content); DockPane.getActiveDockPane().addTab(tab); - if (controller != null && file != null){ - if(file.isDirectory()){ - controller.setRoot(file); - } - else{ - controller.setRootAndHighlight(file); - } + // Initial title for the tab + if (file != null) + { + String folderName = file.getName().isEmpty() ? file.getPath() : file.getName(); + tab.setLabel(app.getDisplayName() + " (" + folderName + ")"); } - tab.addClosedNotification(controller::shutdown); + // When the user navigates, update the tab name dynamically + if (controller != null) + { + controller.addRootChangeListener(newRoot -> { + if (newRoot != null) + { + String folderName = newRoot.getName().isEmpty() ? newRoot.getPath() : newRoot.getName(); + tab.setLabel(app.getDisplayName() + " (" + folderName + ")"); + } + }); + + if (file != null) + { + if (file.isDirectory()) + controller.setRoot(file); + else + controller.setRootAndHighlight(file); + } + + tab.addClosedNotification(controller::shutdown); + } } @Override diff --git a/app/filebrowser/src/main/java/org/phoebus/applications/filebrowser/FileBrowserApp.java b/app/filebrowser/src/main/java/org/phoebus/applications/filebrowser/FileBrowserApp.java index 03bf90f99c..053898261b 100644 --- a/app/filebrowser/src/main/java/org/phoebus/applications/filebrowser/FileBrowserApp.java +++ b/app/filebrowser/src/main/java/org/phoebus/applications/filebrowser/FileBrowserApp.java @@ -2,6 +2,7 @@ import java.io.File; import java.net.URI; +import java.net.URL; import org.phoebus.framework.preferences.AnnotatedPreferences; import org.phoebus.framework.preferences.Preference; @@ -45,11 +46,28 @@ public AppInstance create() { @Override public AppInstance create(final URI resource) { - return createWithRoot(new File(resource)); + try + { + // Remove query component since File(URI) does not accept it + URI clean = new URI(resource.getScheme(), resource.getSchemeSpecificPart(), null); + return createWithRoot(new File(clean)); + } + catch (Exception ex) + { + // Fallback: try using path string + return createWithRoot(new File(resource.getPath())); + } } + public AppInstance createWithRoot(final File directory) { return new FileBrowser(this, directory); } + + @Override + public URL getIconURL() + { + return FileBrowserApp.class.getResource("/icons/filebrowser.png"); + } } diff --git a/app/filebrowser/src/main/java/org/phoebus/applications/filebrowser/FileBrowserController.java b/app/filebrowser/src/main/java/org/phoebus/applications/filebrowser/FileBrowserController.java index bbf0d1fa73..eb8256a8a1 100644 --- a/app/filebrowser/src/main/java/org/phoebus/applications/filebrowser/FileBrowserController.java +++ b/app/filebrowser/src/main/java/org/phoebus/applications/filebrowser/FileBrowserController.java @@ -43,9 +43,11 @@ import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.logging.Level; +import java.util.function.Consumer; import static org.phoebus.applications.filebrowser.FileBrowser.logger; @@ -71,6 +73,21 @@ public class FileBrowserController { private final Menu openWith = new Menu(Messages.OpenWith, ImageCache.getImageView(PhoebusApplication.class, "/icons/fldr_obj.png")); private final ContextMenu contextMenu = new ContextMenu(); + /** + * Create a listener for changes in the selected directory + */ + private final List> root_change_listeners = new ArrayList<>(); + public void addRootChangeListener(Consumer listener) { + root_change_listeners.add(listener); + } + + private void notifyRootChange(File newRoot) { + // Notify that the directory has changed + for (Consumer listener : root_change_listeners) + listener.accept(newRoot); + } + + private ExpandedCountChangeListener expandedCountChangeListener; public FileBrowserController() { @@ -461,6 +478,7 @@ public void setRoot(final File directory) { monitor.setRoot(directory); path.setText(directory.toString()); treeView.setRoot(new FileTreeItem(monitor, directory)); + notifyRootChange(directory); } /**