mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-06-02 19:30:41 +08:00
Merge remote-tracking branch 'origin/GP-6682_dev747368_fsb_gtree_busy_on_focus--SQUASHED'
This commit is contained in:
+34
-2
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user