package org.phoenicis.javafx.views.mainwindow.engines; import javafx.beans.binding.Bindings; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.collections.transformation.FilteredList; import javafx.collections.transformation.SortedList; import javafx.scene.control.Tab; import org.phoenicis.engines.dto.EngineCategoryDTO; import org.phoenicis.engines.dto.EngineDTO; import org.phoenicis.engines.dto.EngineSubCategoryDTO; import org.phoenicis.engines.dto.EngineVersionDTO; import org.phoenicis.javafx.views.common.widget.MiniatureListWidget; import java.nio.file.Files; import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; /** * This class represents an engine sub category tab in the tabpane inside the "Engines" section tab. * It contains a MiniatureListWidget showing a filtered subset of engine versions belonging to the engine sub category. * * @author marc * @since 22.04.17 */ public class EngineSubCategoryTab extends Tab { private EngineCategoryDTO engineCategory; private EngineSubCategoryDTO engineSubCategory; private String enginesPath; private MiniatureListWidget<EngineVersionDTO> engineVersionsView; private ObservableList<EngineVersionDTO> engineVersions; private SortedList<EngineVersionDTO> sortedEngineVersions; private FilteredList<EngineVersionDTO> filteredEngineVersions; private EnginesFilter enginesFilter; private Consumer<EngineDTO> onSelectEngine; /** * Constructor * * @param engineCategory The engine category, which contains the engine sub category * @param engineSubCategory The engine sub category to be shown in this tab * @param enginesPath The path to the engines */ public EngineSubCategoryTab(EngineCategoryDTO engineCategory, EngineSubCategoryDTO engineSubCategory, String enginesPath) { super(engineSubCategory.getDescription()); this.engineCategory = engineCategory; this.engineSubCategory = engineSubCategory; this.enginesPath = enginesPath; this.enginesFilter = new EnginesFilter(engineCategory, engineSubCategory, enginesPath); this.engineVersions = FXCollections.observableArrayList(engineSubCategory.getPackages()); this.sortedEngineVersions = engineVersions.sorted(EngineSubCategoryDTO.comparator().reversed()); this.filteredEngineVersions = sortedEngineVersions.filtered(enginesFilter); this.populate(); this.setContent(this.engineVersionsView); } /** * This method populates the engines version miniature list widget and binds the filtered engine versions list to it. */ private void populate() { this.engineVersionsView = MiniatureListWidget.create( engineVersionDTO -> MiniatureListWidget.Element .create(engineVersionDTO, Files.exists(Paths.get(enginesPath, engineCategory.getName().toLowerCase(), engineSubCategory.getName(), engineVersionDTO.getVersion()))), (engineItem, event) -> { EngineVersionDTO engineVersionDTO = engineItem.getValue(); Map<String, String> userData = new HashMap<>(); userData.put("Mono", engineVersionDTO.getMonoFile()); userData.put("Gecko", engineVersionDTO.getGeckoFile()); EngineDTO engineDTO = new EngineDTO.Builder().withCategory(engineCategory.getName()) .withSubCategory(engineSubCategory.getName()).withVersion(engineVersionDTO.getVersion()) .withUserData(userData).build(); onSelectEngine.accept(engineDTO); }); Bindings.bindContent(this.engineVersionsView.getItems(), this.filteredEngineVersions); } /** * This method updates the consumer that is called after an engine version has been selected. * * @param onSelectEngine */ public void setOnSelectEngine(Consumer<EngineDTO> onSelectEngine) { this.onSelectEngine = onSelectEngine; } /** * This method updates the filter value if installed engine versions are to be shown in this tab. * This method also triggers an automatic update of the view. * * @param installed The new filter value for installed engine versions */ public void setFilterForInstalled(boolean installed) { this.enginesFilter.setShowInstalled(installed); this.filteredEngineVersions.setPredicate(enginesFilter::test); } /** * This method updates the filter value if not installed engine versions are to be shown in this tab. * This method also triggers an automatic update of the view. * * @param notInstalled The new filter value for not installed engine versions */ public void setFilterForNotInstalled(boolean notInstalled) { this.enginesFilter.setShowNotInstalled(notInstalled); this.filteredEngineVersions.setPredicate(enginesFilter::test); } /** * This method updates the search term, which is used to filter for engine versions in this tab. * This method also triggers an automatic update of this view. * * @param searchTerm The new search term to be used for filtering */ public void setFilterForSearchTerm(String searchTerm) { this.enginesFilter.setSearchTerm(searchTerm); this.filteredEngineVersions.setPredicate(enginesFilter::test); } }