Merge remote-tracking branch 'origin/GP-6682_dev747368_fsb_gtree_busy_on_focus--SQUASHED'

This commit is contained in:
Ryan Kurtz
2026-04-28 05:59:34 -04:00
@@ -23,6 +23,7 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import javax.swing.*; import javax.swing.*;
import javax.swing.tree.TreePath; import javax.swing.tree.TreePath;
@@ -78,6 +79,9 @@ public class FSBComponentProvider extends ComponentProviderAdapter
private List<FSBFileHandler> fileHandlers = List.of(); private List<FSBFileHandler> fileHandlers = List.of();
private ProgramManager pm; private ProgramManager pm;
private Timer delayedSwitchToProgramTimer;
private AtomicReference<Program> programToSelect = new AtomicReference<>();
/** /**
* Creates a new {@link FSBComponentProvider} instance, taking * Creates a new {@link FSBComponentProvider} instance, taking
* ownership of the passed-in {@link FileSystemRef fsRef}. * ownership of the passed-in {@link FileSystemRef fsRef}.
@@ -97,11 +101,15 @@ public class FSBComponentProvider extends ComponentProviderAdapter
initTree(); initTree();
rootDir.fsRef.getFilesystem().getRefManager().addListener(this); rootDir.fsRef.getFilesystem().getRefManager().addListener(this);
// this timer is to give the user time to select successive programs before activating one
delayedSwitchToProgramTimer = new Timer(300, e -> doSwitchToProgram());
delayedSwitchToProgramTimer.setRepeats(false);
initFileHandlers(); initFileHandlers();
setHelpLocation( setHelpLocation(
new HelpLocation("FileSystemBrowserPlugin", "FileSystemBrowserIntroduction")); new HelpLocation("FileSystemBrowserPlugin", "FileSystemBrowserIntroduction"));
} }
void initFileHandlers() { void initFileHandlers() {
@@ -227,6 +235,8 @@ public class FSBComponentProvider extends ComponentProviderAdapter
} }
void dispose() { void dispose() {
programToSelect.set(null);
delayedSwitchToProgramTimer.stop();
plugin.getTool().removePopupActionProvider(this); plugin.getTool().removePopupActionProvider(this);
projectIndex.removeIndexListener(this); projectIndex.removeIndexListener(this);
@@ -498,6 +508,28 @@ public class FSBComponentProvider extends ComponentProviderAdapter
Swing.runLater(() -> gTree.repaint()); Swing.runLater(() -> gTree.repaint());
} }
/**
* Cause the ProgramManager to switch to the specified program after a non-blocking delay,
* discarding any pending program that will be switched to.
*
* @param program {@link Program}
*/
void delayedSwitchToProgram(Program program) {
if (pm == null) {
return;
}
programToSelect.set(program);
delayedSwitchToProgramTimer.restart();
}
void doSwitchToProgram() {
ProgramManager localPM = pm;
Program program = programToSelect.getAndSet(null);
if (localPM != null && program != null) {
Swing.runLater(() -> localPM.setCurrentProgram(program));
}
}
//--------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------
private class DefaultFileHandler implements FSBFileHandler { private class DefaultFileHandler implements FSBFileHandler {
@@ -524,7 +556,7 @@ public class FSBComponentProvider extends ComponentProviderAdapter
if (df != null && (domObj = df.getOpenedDomainObject(this)) != null) { if (df != null && (domObj = df.getOpenedDomainObject(this)) != null) {
domObj.release(this); domObj.release(this);
if (domObj instanceof Program program) { if (domObj instanceof Program program) {
runTask(monitor -> pm.setCurrentProgram(program)); delayedSwitchToProgram(program);
} }
return true; return true;
} }