@Nonnull
	private Node createFilterDisplay(@Nonnull AggregateMappingManager aggregateMappingManager) {
		// List to house current filters.
		filters.setCellFactory(param -> new ConfiguredFilterCell());
		filters.getItems().add(new ExcludeExistingMapped(Objects.requireNonNull(aggregateMappingManager.getAggregatedMappings())));
		ReadOnlyObjectProperty<FilterWithConfigNode<?>> selectedItem = filters.getSelectionModel().selectedItemProperty();
		BooleanBinding hasItemSelection = selectedItem.isNull();

		// Button to add new filters to the list.
		// - Pops open a modal to configure the filter, and an OK button to commit it.
		ObjectProperty<Supplier<FilterWithConfigNode<?>>> nodeSupplier = new SimpleObjectProperty<>();
		Button addFilter = new ActionButton(CarbonIcons.ADD_ALT, Lang.getBinding("mapgen.filters.add"), () -> {
			FilterWithConfigNode<?> filterConfig = nodeSupplier.get().get();
			showConfigurator(filterConfig, () -> addConfiguredFilter(filterConfig));
		});
		addFilter.disableProperty().bind(nodeSupplier.isNull());

		// Button to edit the selected filter.
		Button editSelectedFilter = new ActionButton(CarbonIcons.EDIT, Lang.getBinding("mapgen.filters.edit"), () -> {
			FilterWithConfigNode<?> filterConfig = selectedItem.get();
			showConfigurator(filterConfig, null);
		});
		BooleanProperty isZero = new SimpleBooleanProperty();
		selectedItem.addListener((ob, old, cur) -> isZero.set(cur == null || cur.getInputCount() == 0));
		editSelectedFilter.disableProperty().bind(hasItemSelection.or(isZero));

		// Button to remove the selected filter.
		Button deleteSelectedFilter = new ActionButton(CarbonIcons.TRASH_CAN, Lang.getBinding("mapgen.filters.delete"), () -> {
			filters.getItems().remove(selectedItem.get());
		});
		deleteSelectedFilter.disableProperty().bind(hasItemSelection);

		// Dropdown to change the type of filter made with the add button.
		MenuButton dropdown = new MenuButton();
		StringProperty dropdownText = dropdown.textProperty();
		dropdownText.bind(Lang.getBinding("mapgen.filters.type"));
		dropdown.getItems().addAll(
				typeSetAction(nodeSupplier, dropdownText, "mapgen.filter.excludealreadymapped",
						() -> new ExcludeExistingMapped(Objects.requireNonNull(aggregateMappingManager.getAggregatedMappings()))),
				typeSetAction(nodeSupplier, dropdownText, "mapgen.filter.excludename", ExcludeName::new),
				typeSetAction(nodeSupplier, dropdownText, "mapgen.filter.excludeclasses", ExcludeClasses::new),
				typeSetAction(nodeSupplier, dropdownText, "mapgen.filter.excludemodifier", ExcludeModifiers::new),
				typeSetAction(nodeSupplier, dropdownText, "mapgen.filter.includename", IncludeName::new),
				typeSetAction(nodeSupplier, dropdownText, "mapgen.filter.includelong", IncludeLongName::new),
				typeSetAction(nodeSupplier, dropdownText, "mapgen.filter.includeclasses", IncludeClasses::new),
				typeSetAction(nodeSupplier, dropdownText, "mapgen.filter.includemodifier", IncludeModifiers::new),
				typeSetAction(nodeSupplier, dropdownText, "mapgen.filter.includewhitespacenames", IncludeWhitespaceNames::new),
				typeSetAction(nodeSupplier, dropdownText, "mapgen.filter.includenonasciinames", IncludeNonAsciiNames::new),
				typeSetAction(nodeSupplier, dropdownText, "mapgen.filter.includekeywords", IncludeKeywordNames::new)
		);

		// Layout
		addFilter.setMaxWidth(Double.MAX_VALUE);
		editSelectedFilter.setMaxWidth(Double.MAX_VALUE);
		deleteSelectedFilter.setMaxWidth(Double.MAX_VALUE);
		HBox.setHgrow(addFilter, Priority.ALWAYS);
		HBox.setHgrow(editSelectedFilter, Priority.ALWAYS);
		HBox.setHgrow(deleteSelectedFilter, Priority.ALWAYS);
		VBox filterButtons = new VBox(new InputGroup(dropdown, addFilter),
				new HBox(editSelectedFilter, deleteSelectedFilter)
		);
		filterButtons.setFillWidth(true);
		VBox layout = new VBox(filters, filterButtons);
		VBox.setVgrow(filters, Priority.ALWAYS);
		return layout;
	}
Generates the mappings for the current settings. The result is displayed in the {@link #previewGroup}.
recaf-ui/src/main/java/software/coley/recaf/ui/pane/MappingGeneratorPane.java