package be.bendem.manga.library.controllers; import be.bendem.manga.library.MangaLibrary; import be.bendem.manga.library.ScraperImplementation; import be.bendem.manga.library.utils.Log; import be.bendem.manga.scraper.MangaScraper; import be.bendem.manga.scraper.Scraper; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.ListView; import javafx.scene.control.TextField; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import java.net.URL; import java.util.Map; import java.util.ResourceBundle; public class SearchCtrl implements Initializable { @FXML private TextField searchField; @FXML private ComboBox<ScraperImplementation> hostComboBox; @FXML private Button searchButton; @FXML private Button selectChapters; @FXML private ListView<String> searchResult; private final MangaLibrary app; private Map<String, String> currentSearchResult; private MangaScraper mangaScraper; public SearchCtrl(MangaLibrary app) { this.app = app; } @Override public void initialize(URL location, ResourceBundle resources) { searchResult.getSelectionModel().selectedItemProperty().addListener((obj, oldVal, newVal) -> selectChapters.setDisable(newVal == null || newVal.isEmpty())); hostComboBox.getItems().setAll(ScraperImplementation.values()); hostComboBox.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> updateSearchButtonStatus()); searchField.textProperty().addListener((obs, oldVal, newVal) -> updateSearchButtonStatus()); } private void updateSearchButtonStatus() { searchButton.setDisable(hostComboBox.getSelectionModel().isEmpty() || searchField.getText().isEmpty()); } public void searchFieldKeyPressed(KeyEvent event) { if(event.getCode() != KeyCode.ENTER) { return; } searchButton.getOnAction().handle(new ActionEvent(searchField, searchButton)); } public void onSearchButtonAction(ActionEvent event) { String text = searchField.getText(); if(text.isEmpty()) { // TODO Visual effect Log.info("No search provided"); return; } ScraperImplementation selectedHost = hostComboBox.getSelectionModel().getSelectedItem(); if(selectedHost == null) { // TODO Visual effect Log.info("No host selected"); return; } Scraper scraper; try { scraper = selectedHost.getScraperClass().newInstance(); } catch(InstantiationException | IllegalAccessException e) { // TODO Error handling throw new RuntimeException(e); } searchResult.getItems().clear(); mangaScraper = new MangaScraper(scraper); currentSearchResult = mangaScraper.search(text, Throwable::printStackTrace); if(currentSearchResult.isEmpty()) { // TODO Visual effect return; } searchResult.getItems().addAll(currentSearchResult.keySet()); } public void searchResultKeyPressed(KeyEvent event) { if(event.getCode() != KeyCode.ENTER) { return; } selectChapters.getOnAction().handle(new ActionEvent(searchResult, selectChapters)); } public void onChapterSelect(ActionEvent event) { String selected = searchResult.getSelectionModel().getSelectedItem(); app .getController() .<ChapterSelectionCtrl>setMain("chapter-selection.fxml") .setManga(mangaScraper, selected, currentSearchResult.get(selected)); } }