GP-3147 - Fixed file chooser exception on cancel

This commit is contained in:
dragonmacher 2023-02-28 14:36:44 -05:00
parent 10c7d641f0
commit d7040f78a9

View file

@ -187,9 +187,9 @@ public class GhidraFileChooser extends ReusableDialogComponentProvider implement
private SwingUpdateManager modelUpdater = new SwingUpdateManager(this::updateDirectoryModels); private SwingUpdateManager modelUpdater = new SwingUpdateManager(this::updateDirectoryModels);
/** /**
* The last input component to take focus (the text field or file view). * The last input component to take focus (the text field or file view).
* *
* <p>This may annoy users that are using the keyboard to perform navigation operations via * <p>This may annoy users that are using the keyboard to perform navigation operations via
* the toolbar buttons, as we will keep putting focus back into the last input item. We * the toolbar buttons, as we will keep putting focus back into the last input item. We
* may need a way to set this field to null when the user is working in this fashion. * may need a way to set this field to null when the user is working in this fashion.
*/ */
@ -216,7 +216,7 @@ public class GhidraFileChooser extends ReusableDialogComponentProvider implement
/** /**
* Constructs a new ghidra file chooser * Constructs a new ghidra file chooser
* *
* @param model the file chooser model * @param model the file chooser model
* @param parent the parent component * @param parent the parent component
*/ */
@ -681,9 +681,9 @@ public class GhidraFileChooser extends ReusableDialogComponentProvider implement
} }
/** /**
* Sets the text used in the <code>OK</code> button * Sets the text used in the <code>OK</code> button
* *
* @param buttonText the text * @param buttonText the text
*/ */
public void setApproveButtonText(String buttonText) { public void setApproveButtonText(String buttonText) {
setOkButtonText(buttonText); setOkButtonText(buttonText);
@ -691,7 +691,7 @@ public class GhidraFileChooser extends ReusableDialogComponentProvider implement
/** /**
* Sets the tooltip text used in the <code>OK</code> button * Sets the tooltip text used in the <code>OK</code> button
* *
* @param tooltipText the tooltip text * @param tooltipText the tooltip text
*/ */
public void setApproveButtonToolTipText(String tooltipText) { public void setApproveButtonToolTipText(String tooltipText) {
@ -810,10 +810,10 @@ public class GhidraFileChooser extends ReusableDialogComponentProvider implement
} }
// we only get here if the new dir is the current dir and we are not forcing an update // we only get here if the new dir is the current dir and we are not forcing an update
// TODO this code causes unexpected behavior when in 'directories only' mode in that // TODO this code causes unexpected behavior when in 'directories only' mode in that
// this will cause the current directory to change. The behavior can be seen by // this will cause the current directory to change. The behavior can be seen by
// putting this code back in and then running the tests. No tests are failing with this // putting this code back in and then running the tests. No tests are failing with this
// code removed. We are leaving this code here for a couple releases in case we find // code removed. We are leaving this code here for a couple releases in case we find
// a code path that requires it. // a code path that requires it.
// setSelectedFileAndUpdateDisplay((isFilesOnly() ? null : directory)); // setSelectedFileAndUpdateDisplay((isFilesOnly() ? null : directory));
} }
@ -876,10 +876,10 @@ public class GhidraFileChooser extends ReusableDialogComponentProvider implement
} }
/** /**
* Returns the selected file. This can be set either by the programmer via * Returns the selected file. This can be set either by the programmer via
* {@link #setSelectedFile(File)} or by a user action, such as either typing the * {@link #setSelectedFile(File)} or by a user action, such as either typing the
* filename into the UI or selecting the file from a list in the UI. * filename into the UI or selecting the file from a list in the UI.
* *
* @return the selected file; null if cancelled or no file was selected * @return the selected file; null if cancelled or no file was selected
*/ */
public File getSelectedFile() { public File getSelectedFile() {
@ -1963,14 +1963,14 @@ public class GhidraFileChooser extends ReusableDialogComponentProvider implement
@Override @Override
public void run(TaskMonitor monitor) { public void run(TaskMonitor monitor) {
if (monitor.isCancelled()) { if (monitor.isCancelled() || worker.isDisposed()) {
return; return;
} }
run(); run();
Swing.runLater(() -> { Swing.runLater(() -> {
if (!monitor.isCancelled()) { if (!monitor.isCancelled() && !worker.isDisposed()) {
runSwing(); runSwing();
} }
}); });
@ -2180,7 +2180,7 @@ public class GhidraFileChooser extends ReusableDialogComponentProvider implement
* size. The list also allows us to clear and set a value in one method call. We are * size. The list also allows us to clear and set a value in one method call. We are
* essentially using this list to hold selected files, where in certain modes, there will only * essentially using this list to hold selected files, where in certain modes, there will only
* be a single file selection. * be a single file selection.
* *
* <P>The methods on the class are synchronized to ensure thread visibility. * <P>The methods on the class are synchronized to ensure thread visibility.
*/ */
private class FileList { private class FileList {