GT-2764 - fix task monitor dialog conflict when dbl click container

Change FSB "open program" actions to not try to import the missing files
inside of a task's runnable.
This commit is contained in:
dev747368 2019-04-16 12:29:23 -04:00
parent ca7d169d62
commit aba70e3c96

View File

@ -18,6 +18,7 @@ package ghidra.plugins.fsbrowser;
import java.awt.Component;
import java.io.*;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.*;
import javax.swing.tree.TreePath;
@ -42,7 +43,6 @@ import ghidra.plugin.importer.ImporterUtilities;
import ghidra.plugin.importer.ProgramMappingService;
import ghidra.plugins.fsbrowser.tasks.GFileSystemExtractAllTask;
import ghidra.plugins.importer.batch.BatchImportDialog;
import ghidra.plugins.importer.tasks.ImportBatchTask;
import ghidra.program.model.listing.Program;
import ghidra.util.Msg;
import ghidra.util.SystemUtilities;
@ -297,32 +297,34 @@ class FSBActionManager {
private void openProgramFromFile(FSRL file, String suggestedDestinationPath) {
ProgramManager pm = FSBUtils.getProgramManager(plugin.getTool(), false);
if (pm != null) {
TaskLauncher.launchNonModal("Open Programs", monitor -> {
doOpenProgramFromFile(file, suggestedDestinationPath, pm, monitor);
AtomicBoolean success = new AtomicBoolean();
TaskLauncher.launchModal("Open Programs", monitor -> {
success.set(doOpenProgramFromFile(file, suggestedDestinationPath, pm, monitor));
});
if (!success.get()) {
ImporterUtilities.showImportDialog(file, null, suggestedDestinationPath,
plugin.getTool(), pm);
}
}
}
private void doOpenProgramFromFile(FSRL fsrl, String suggestedDestinationPath,
private boolean doOpenProgramFromFile(FSRL fsrl, String suggestedDestinationPath,
ProgramManager programManager, TaskMonitor monitor) {
if (programManager == null) {
return;
}
Object consumer = new Object();
Program program = ProgramMappingService.findMatchingProgramOpenIfNeeded(fsrl, consumer,
programManager, ProgramManager.OPEN_CURRENT);
if (program == null) {
searchProjectForMatchingFileOrImport(fsrl, suggestedDestinationPath, programManager,
monitor);
return;
return searchProjectForMatchingFileOrFail(fsrl, suggestedDestinationPath,
programManager, monitor);
}
program.release(consumer);
return true;
}
private void searchProjectForMatchingFileOrImport(FSRL fsrl, String suggestedDestinationPath,
private boolean searchProjectForMatchingFileOrFail(FSRL fsrl, String suggestedDestinationPath,
ProgramManager programManager, TaskMonitor monitor) {
boolean doSearch = isProjectSmallEnoughToSearchWithoutWarningUser() ||
OptionDialog.showYesNoDialog(null, "Search Project for matching program?",
@ -336,10 +338,9 @@ class FSBActionManager {
if (domainFile != null) {
ProgramMappingService.createAssociation(fsrl, domainFile);
showProgramInProgramManager(fsrl, domainFile, programManager, true);
return;
return true;
}
ImporterUtilities.showImportDialog(fsrl, null, suggestedDestinationPath, plugin.getTool(),
programManager);
return false;
}
/**
@ -356,10 +357,19 @@ class FSBActionManager {
*/
private void openProgramsFromFiles(List<FSRL> files) {
ProgramManager pm = FSBUtils.getProgramManager(plugin.getTool(), false);
List<FSRL> unmatchedFiles = new ArrayList<>();
if (pm != null) {
TaskLauncher.launchNonModal("Open Programs", monitor -> {
doOpenProgramsFromFiles(files, pm, monitor);
TaskLauncher.launchModal("Open Programs", monitor -> {
List<FSRL> tmpUnmatchedFiles = doOpenProgramsFromFiles(files, pm, monitor);
unmatchedFiles.addAll(tmpUnmatchedFiles);
});
if (unmatchedFiles.size() == 1) {
ImporterUtilities.showImportDialog(unmatchedFiles.get(0), null, null,
plugin.getTool(), pm);
}
else if (unmatchedFiles.size() > 1) {
BatchImportDialog.showAndImport(plugin.getTool(), null, unmatchedFiles, null, pm);
}
}
}
@ -373,12 +383,10 @@ class FSBActionManager {
* @param fsrls {@link List} of {@link FSRL}s of the files to search for.
* @param programManager {@link ProgramManager} to use to open the programs, null ok.
* @param monitor {@link TaskMonitor} to watch for cancel and update with progress.
* @return list of unmatched files that need to be imported
*/
private void doOpenProgramsFromFiles(List<FSRL> fsrls, ProgramManager programManager,
private List<FSRL> doOpenProgramsFromFiles(List<FSRL> fsrls, ProgramManager programManager,
TaskMonitor monitor) {
if (programManager == null) {
return;
}
int programsOpened = 0;
List<FSRL> unmatchedFiles = new ArrayList<>();
@ -400,12 +408,14 @@ class FSBActionManager {
// UnmatchedFiles contains any files that had no association to a Program
// Give the user a chance to search the project for it, and import it if not found
if (!unmatchedFiles.isEmpty()) {
searchProjectForMatchingFilesOrImport(unmatchedFiles, programManager, monitor,
programsOpened);
unmatchedFiles = searchProjectForMatchingFilesOrFail(unmatchedFiles, programManager,
monitor, programsOpened);
}
return unmatchedFiles;
}
private void searchProjectForMatchingFilesOrImport(List<FSRL> fsrlList,
private List<FSRL> searchProjectForMatchingFilesOrFail(List<FSRL> fsrlList,
ProgramManager programManager, TaskMonitor monitor, int programsOpened) {
boolean doSearch = isProjectSmallEnoughToSearchWithoutWarningUser() ||
OptionDialog.showYesNoDialog(null, "Search Project for matching programs?",
@ -430,16 +440,7 @@ class FSBActionManager {
}
}
if (unmatchedFSRLs.size() == 1) {
ProgramManager pmForImporter =
programsOpened < ImportBatchTask.MAX_PROGRAMS_TO_OPEN ? programManager : null;
ImporterUtilities.showImportDialog(unmatchedFSRLs.get(0), null, null, plugin.getTool(),
pmForImporter);
}
else if (unmatchedFSRLs.size() > 1) {
BatchImportDialog.showAndImport(plugin.getTool(), null, unmatchedFSRLs, null,
programManager);
}
return unmatchedFSRLs;
}
private boolean isProjectSmallEnoughToSearchWithoutWarningUser() {