private static File getFileFromUser(File startingDir) {
		KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
		Component activeComponent = kfm.getActiveWindow();
		GhidraFileChooser fileChooser = new GhidraFileChooser(activeComponent);
		fileChooser.setTitle("Please Select A File");
		fileChooser.setFileFilter(FILE_FILTER);
		fileChooser.setApproveButtonText("OK");
		fileChooser.setCurrentDirectory(startingDir);

		File selectedFile = fileChooser.getSelectedFile();

		// make sure the file has the correct extension
		if ((selectedFile != null) &&
			!selectedFile.getName().endsWith(PREFERENCES_FILE_EXTENSION)) {
			selectedFile = new File(selectedFile.getAbsolutePath() + PREFERENCES_FILE_EXTENSION);
		}

		// save off the last location to which the user navigated so we can
		// return them to that spot if they user the dialog again.
		Preferences.setProperty(LAST_KEY_BINDING_EXPORT_DIRECTORY,
			fileChooser.getCurrentDirectory().getAbsolutePath());
		fileChooser.dispose();
		return selectedFile;
	}
Parses the given text into a KeyStroke.  This method relies upon
{@link KeyStroke#getKeyStroke(String)} for parsing.  Before making that call, this method
will perform fixup on the given text for added flexibility.  For example, the given
text may contain spaces or dashes as the separators between parts in the string.  Also,
the text is converted such that it is not case-sensitive.  So, the following example
formats are allowed:
<pre>
   Alt-F
   alt p
   Ctrl-Alt-Z
   ctrl Z
</pre>

<p><b>Note:</b> The returned keystroke will always correspond to a {@code pressed} event,
regardless of the value passed in (pressed, typed or released).

@param keyStroke the key stroke
@return the new key stroke (as returned by  {@link KeyStroke#getKeyStroke(String)}
Ghidra/Framework/Docking/src/main/java/docking/actions/KeyBindingUtils.java