package com.soundlooper.system;
import java.util.ArrayList;
import java.util.List;
import javafx.fxml.FXML;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;
import com.soundlooper.system.search.SearchEngine;
import com.soundlooper.system.search.Searchable;
import com.soundlooper.system.search.StringTransformerAccentuation;
import com.soundlooper.system.search.StringTransformerNoCase;
public class SearchDialogController {
@FXML
private TextField searchText;
@FXML
private ListView<Searchable> resultList;
private Stage stage;
private List<? extends Searchable> listSearchable = new ArrayList<Searchable>();
private Searchable result;
private SearchEngine search;
@FXML
public void close() {
stage.close();
}
public void init(List<? extends Searchable> listSearchable, Stage stage) {
this.stage = stage;
this.listSearchable = listSearchable;
this.search = new SearchEngine(this.listSearchable);
this.search.addTransformer(new StringTransformerAccentuation());
this.search.addTransformer(new StringTransformerNoCase());
resultList.setItems(this.search.getLastResult());
searchText.textProperty().addListener(
(observable, oldValue, newValue) -> {
this.search.cancelSearch();
this.search.performSearch(newValue);
});
this.search.performSearch("");
}
@FXML
public void onMouseClickedList(MouseEvent event) {
if (resultList.getSelectionModel().getSelectedItem() != null) {
if (event.getClickCount() > 1) {
validateSearch(resultList.getSelectionModel().getSelectedItem());
}
}
}
public void onKeyReleasedSearchText(KeyEvent event) {
if (event.getCode() == KeyCode.DOWN) {
if (resultList.getSelectionModel().getSelectedItem() != null) {
resultList.getSelectionModel().selectNext();
} else if (this.resultList.getItems().size() > 0) {
resultList.getSelectionModel().select(0);
}
} else if (event.getCode() == KeyCode.UP) {
if (resultList.getSelectionModel().getSelectedItem() != null) {
resultList.getSelectionModel().selectPrevious();
}
}
}
@FXML
public void onKeyReleased(KeyEvent event) {
if (event.getCode() == KeyCode.ESCAPE) {
close();
} else if (event.getCode() == KeyCode.ENTER) {
if (this.resultList.getItems().size() == 1) {
validateSearch(this.resultList.getItems().get(0));
} else if (resultList.getSelectionModel().getSelectedItem() != null) {
validateSearch(resultList.getSelectionModel().getSelectedItem());
}
}
}
private void validateSearch(Searchable searchable) {
this.result = searchable;
close();
}
public Searchable getResult() {
return this.result;
}
}