Skip to content
Snippets Groups Projects

Resolve "amélioration de la fonction Search au niveau de l'ontologie"

2 files
+ 113
45
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -19,15 +19,19 @@
package fr.inra.po2vocabmanager.view.ontoView;
import fr.inra.po2vocabmanager.MainApp;
import fr.inra.po2vocabmanager.utils.FilterableTreeItem;
import fr.inra.po2vocabmanager.utils.TreeItemPredicate;
import fr.inrae.po2engine.externalTools.JenaTools;
import fr.inrae.po2engine.model.VocabConcept;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import javafx.beans.binding.Bindings;
import javafx.collections.FXCollections;
import javafx.collections.transformation.FilteredList;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.control.*;
import javafx.scene.input.MouseEvent;
import java.util.stream.Collectors;
/**
* @author stephane
@@ -44,6 +48,8 @@ public class SearchOverviewController {
private TableColumn<VocabConcept, String> labelColumn;
@FXML
private TableColumn<VocabConcept, String> descColumn;
@FXML
private TreeView<VocabConcept> treeView;
@FXML
private void initialize() {
@@ -59,37 +65,97 @@ public class SearchOverviewController {
});
return row;
});
treeView.setOnMouseClicked(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent mouseEvent)
{
if(mouseEvent.getClickCount() == 2)
{
TreeItem<VocabConcept> item = treeView.getSelectionModel().getSelectedItem();
mainApp.openNode(item.getValue());
}
}
});
}
public void setMainApp(MainApp mainApp) {
this.mainApp = mainApp;
textfield.setOnKeyReleased(event -> {
if (event.getCode().equals(KeyCode.ENTER)) {
search();
}
});
// textfield.setOnKeyReleased(event -> {
// if (event.getCode().equals(KeyCode.ENTER)) {
// search();
// }
// });
initTableView();
initTreeView(JenaTools.uriToLoad.toArray(new String[0]));
}
/**
*
*/
@FXML
private void search() {
if (!textfield.getText().isEmpty()) {
Task<Boolean> task = new Task<Boolean>() {
@Override
protected Boolean call() throws Exception {
MainApp.logger.info("start Search : " + textfield.getText());
ObservableList<VocabConcept> result = mainApp.getOntologyControler().getVocabTree().getValue().search(textfield.getText());
MainApp.logger.info("Found : " + result.size() + " results");
tableView.setItems(result);
return true;
public void initTableView() {
FilteredList<VocabConcept> filteredList = new FilteredList<>(MainApp.getOntologyControler().getRootItem().getValue().flattened().collect(Collectors.toCollection(FXCollections::observableArrayList)), p -> true);
filteredList.predicateProperty().bind(Bindings.createObjectBinding(() -> {
if (textfield.getText() == null || textfield.getText().isEmpty())
return vocabConcept -> true;
return vocabConcept -> {
if(vocabConcept == null || vocabConcept.getSearchIn() == null) {
return false;
}
return vocabConcept.getSearchIn().toLowerCase().contains(textfield.getText().toLowerCase());
};
new Thread(task).start();
}, textfield.textProperty()));
tableView.setItems(filteredList);
}
private void buildTree(FilterableTreeItem<VocabConcept> filterLocalRoot, VocabConcept localRoot) {
for(VocabConcept son : localRoot.getSubNode().filtered(vocabConcept -> !vocabConcept.getDeprecated())) {
FilterableTreeItem<VocabConcept> vson = new FilterableTreeItem<>(son);
filterLocalRoot.getInternalChildren().add(vson);
buildTree(vson, son);
}
}
public void initTreeView(String... topURIs) {
VocabConcept frv = new VocabConcept("", null);
frv.setName("fake-root");
FilterableTreeItem<VocabConcept> fakeRoot = new FilterableTreeItem<>(frv);
treeView.setShowRoot(false);
treeView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null) {
// open in treeView node ???
}
});
fakeRoot.getChildren().clear();
treeView.setRoot(fakeRoot);
if (MainApp.getOntologyControler() != null && MainApp.getOntologyControler().getCurrentOntology() != null) {
fakeRoot.getChildren().clear();
for(String topURI : topURIs) {
// recherche du root item
TreeItem<VocabConcept> localRoot = MainApp.getOntologyControler().getRootItem().getChildren().stream().filter(vocabConceptTreeItem -> {
return vocabConceptTreeItem.getValue().getURI().equalsIgnoreCase(topURI);
}).findFirst().orElse(null);
FilterableTreeItem<VocabConcept> filterLocalRoot = new FilterableTreeItem<>(localRoot.getValue());
buildTree(filterLocalRoot, localRoot.getValue());
filterLocalRoot.predicateProperty().bind(Bindings.createObjectBinding(() -> {
if (textfield.getText() == null || textfield.getText().isEmpty())
return TreeItemPredicate.create(value -> true);
return TreeItemPredicate.create(value -> value.getSearchIn().toLowerCase().contains(textfield.getText().toLowerCase()));
}, textfield.textProperty()));
fakeRoot.getChildren().add(filterLocalRoot);
}
treeView.setRoot(fakeRoot);
}
}
}
Loading