private void editDirectoryTransform(SourcePathTransformRecord transformRecord) {
		SourcePathTransformer pathTransformer =
			UserDataPathTransformer.getPathTransformer(sourceFilesTableModel.getProgram());
		String source = transformRecord.source();
		GValuesMap valueMap = new GValuesMap();
		valueMap.defineDirectory(DESTINATION, new File(transformRecord.target()));
		valueMap.setValidator((map, status) -> {
			File directory = valueMap.getFile(DESTINATION);
			if (directory == null || !directory.exists()) {
				status.setStatusText("Directory does not exist", MessageType.ERROR);
				return false;
			}
			if (!directory.isDirectory()) {
				status.setStatusText("Must select a directory", MessageType.ERROR);
				return false;
			}
			return true;
		});
		ValuesMapDialog mapDialog =
			new ValuesMapDialog("Enter Directory Transform", "Transform for " + source, valueMap);
		tool.showDialog(mapDialog, this);
		GValuesMap results = mapDialog.getValues();
		if (results == null) {
			return;
		}
		try {
			String canonical = results.getFile(DESTINATION).getCanonicalPath();
			URI uri = new File(canonical).toURI().normalize();
			String transformedPath = uri.getPath();
			if (!transformedPath.endsWith("/")) {
				transformedPath = transformedPath + "/";
			}
			pathTransformer.addDirectoryTransform(source, transformedPath);
		}
		catch (IOException e) {
			Msg.showError(this, sourceFilesTable, "IOException getting canonical path",
				e.getMessage());
		}

		sourceFilesTableModel.refresh();
		transformsModel.reload();

	}
Sets isStale to {@code true} when {@code rec} has an event type relevant to the source
file table.  If the event type is {@link ProgramEvent#SOURCE_FILE_REMOVED}, any associated
file transform is also removed.

@param rec program change record
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/sourcefilestable/SourceFilesTableProvider.java