diff --git a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java index f32db360ace36a08950712174d970cfa3b9ef3c7..5ee9a57bb682cd2e278cabef6d952cbdc5c3a8c6 100644 --- a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java +++ b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java @@ -201,99 +201,11 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { } - public void addStep(ItineraryFile itineraryFile, StepFile parentStep) { - if(parentStep != null && parentStep.getFather() != null) { - Alert notPossible = new Alert(Alert.AlertType.INFORMATION); - notPossible.setTitle("Add substep"); - notPossible.setContentText("Adding substep here is not allowed"); - notPossible.initModality(Modality.APPLICATION_MODAL); - notPossible.initOwner(MainApp.primaryStage); - notPossible.showAndWait(); - return; - } - - GeneralFile current = itineraryFile.getProcessFile(); - - Dialog<String> diagNewStep = new Dialog(); - diagNewStep.initModality(Modality.WINDOW_MODAL); - diagNewStep.initOwner(MainApp.primaryStage); - diagNewStep.setTitle("Create new step"); - - GridPane g1 = new GridPane(); - ColumnConstraints c1 = new ColumnConstraints(); - c1.setPercentWidth(50); - g1.getColumnConstraints().add(c1); - diagNewStep.getDialogPane().setContent(g1); - VBox bg = new VBox(10); - TextField nextStepName = new TextField(); - bg.getChildren().addAll(new Label("New step name :"), nextStepName); - g1.add(bg, 0, 0); - - VBox vd = new VBox(5); - RadioButton rbScratch = new RadioButton("Create from scratch"); - RadioButton rbCopy = new RadioButton("Copy an existing step :"); - rbCopy.setGraphic(new ImageView(UITools.getImage("resources/images/help_16.png"))); - rbCopy.setTooltip(new Tooltip("Itineraries are not cloned")); - rbCopy.setContentDisplay(ContentDisplay.RIGHT); - final ToggleGroup group = new ToggleGroup(); - rbScratch.setToggleGroup(group); - rbCopy.setToggleGroup(group); - rbScratch.setSelected(true); - - Callback<ListView<StepFile>, ListCell<StepFile>> cellFactoryStepFile = new Callback<ListView<StepFile>, ListCell<StepFile>>() { - @Override - public ListCell<StepFile> call(ListView<StepFile> l) { - return new ListCell<StepFile>() { - @Override - protected void updateItem(StepFile item, boolean empty) { - super.updateItem(item, empty); - if (item == null || empty) { - setGraphic(null); - } else { - setText(item.getNameProperty().getValue()); - } - } - } ; - } - }; - - ComboBox<StepFile> comboStep = new ComboBox<>(); - comboStep.setCellFactory(cellFactoryStepFile); - comboStep.setButtonCell(cellFactoryStepFile.call(null)); - - ObservableList<StepFile> listCombo = FXCollections.observableArrayList(current.getListStep()); - comboStep.setItems(listCombo); - - vd.getChildren().addAll(rbScratch, rbCopy,comboStep); - - g1.add(vd, 1,0); - diagNewStep.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL); - Button bok = (Button) diagNewStep.getDialogPane().lookupButton(ButtonType.OK); - bok.disableProperty().bind(Bindings.or(nextStepName.textProperty().isEmpty(), Bindings.and(rbCopy.selectedProperty(), comboStep.valueProperty().isNull()))); - bok.setOnAction(actionEvent -> { - addStepData(itineraryFile, parentStep, current, nextStepName.getText(), rbCopy.isSelected(), comboStep); - if(parentStep != null && !parentStep.getCompositionFile().isEmpty()) { - Platform.runLater(() -> { - Alert warningMoveComposition = new Alert(Alert.AlertType.WARNING); - warningMoveComposition.getDialogPane().setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); - warningMoveComposition.setTitle("Composition on " + parentStep.getNameProperty().get()); - warningMoveComposition.setContentText("Please keep in mind that composition on step " + parentStep.getNameProperty().get() + " are not allowed.\n You can move or remove it"); - warningMoveComposition.initModality(Modality.APPLICATION_MODAL); - warningMoveComposition.initOwner(MainApp.primaryStage); - warningMoveComposition.showAndWait(); - }); - } - }); - diagNewStep.showAndWait(); - - } - - private static StepFile addStepData(ItineraryFile itiFile, StepFile parentStep, GeneralFile current, String stepName, boolean rbCopy, ComboBox<StepFile> comboStep) { + private static StepFile addStepData(ItineraryFile itiFile, StepFile parentStep, GeneralFile current, boolean rbCopy, StepFile stepToClone) { StepFile s = new StepFile("new step", current); - s.setId(stepName); - if(rbCopy && comboStep != null) { - StepFile initial = comboStep.getSelectionModel().getSelectedItem(); - s.cloneFrom(initial, itiFile, new HashMap<>(), itiFile, null); + s.setId(""); + if(rbCopy && stepToClone != null) { + s.cloneFrom(stepToClone, itiFile, new HashMap<>(), itiFile, null); } if(parentStep != null) { @@ -317,6 +229,38 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { return s; } + private static void newStepImport(ItineraryFile iti, StepFile parent) { + File fileImport = getFile(MainApp.primaryStage); + if (fileImport == null) { + return; + } + MainApp.logger.info("start importing file " + fileImport.getName()); + ImportReport importReport = iti.checkImportStepFromXLSX(fileImport); + if(importReport.success()) { + StepFile step = iti.importStepFromXLSX(fileImport); + if(parent != null && step != null) { + parent.addSubStep(step); + } + handleInterfaceUpdate(step.getGeneralFile(), importReport.success(), importReport.toString()); + } else { + showErrorImportAlert(importReport.toString()); + } + } + + public void addStepFromScratch(ItineraryFile itineraryFile, StepFile parentStep) { + if(parentStep != null && parentStep.getFather() != null) { + Alert notPossible = new Alert(Alert.AlertType.INFORMATION); + notPossible.setTitle("Add substep"); + notPossible.setContentText("Adding substep here is not allowed"); + notPossible.initModality(Modality.APPLICATION_MODAL); + notPossible.initOwner(MainApp.primaryStage); + notPossible.showAndWait(); + return; + } + GeneralFile current = itineraryFile.getProcessFile(); + addStepData(itineraryFile, parentStep, current, false, null); + } + private static void newItineraryObsImport(ItineraryFile iti) { File fileImport = getFile(MainApp.primaryStage); @@ -335,6 +279,53 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { } } + public void copyStep(ItineraryFile itineraryFile, StepFile parentStep) { + if(parentStep != null && parentStep.getFather() != null) { + Alert notPossible = new Alert(Alert.AlertType.INFORMATION); + notPossible.setTitle("Add substep"); + notPossible.setContentText("Adding substep here is not allowed"); + notPossible.initModality(Modality.APPLICATION_MODAL); + notPossible.initOwner(MainApp.primaryStage); + notPossible.showAndWait(); + return; + } + GeneralFile current = itineraryFile.getProcessFile(); + + ChoiceDialog<StepFile> diagCloneStep = new ChoiceDialog<>(); + diagCloneStep.initModality(Modality.WINDOW_MODAL); + diagCloneStep.initOwner(MainApp.primaryStage); + diagCloneStep.setTitle("Create a new step by cloning an existing one"); + + ObservableList<StepFile> listCombo = FXCollections.observableArrayList(current.getListStep()); + diagCloneStep.getItems().addAll(listCombo); + Optional<StepFile> result = diagCloneStep.showAndWait(); + result.ifPresent(step -> addStepData(itineraryFile, parentStep, current, true, step)); + } + + private void newStepObsImport(StepFile step) { + File fileImport = getFile(MainApp.primaryStage); + if (fileImport == null) { + return; + } + MainApp.logger.info("start importing/create file " + fileImport.getName()); + Report r = step.checkCreateObservationFromXLSX(fileImport); + if(r.success()) { + ObservationFile obs = step.createObservationFromXLSX(fileImport); + handleInterfaceUpdate(obs.getStepFile().getGeneralFile(), r.success(), "File import completed"); + MainApp.getDataControler().selectNode(obs); + MainApp.logger.info("import done with sucess"); + } else { + showErrorImportAlert(r.prettyPrintError()); + } + } + + private static File getFile(Stage primaryStage) { + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle("Import file"); + fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Xlsx files (*.xlsx)", "*.xlsx")); + return fileChooser.showOpenDialog(primaryStage); + } + @Override public void updateItem(DataNode item, boolean empty) { super.updateItem(item, empty); @@ -650,7 +641,11 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { menu.getItems().add(downloadSCHACLConstraints); break; case PROCESS: - MenuItem addItinerary = new MenuItem("New Itinerary"); + Menu newIti = new Menu("New Itinerary"); + newIti.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/itinerary.png"))); + newIti.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); + + MenuItem addItinerary = new MenuItem("New Itinerary from scratch"); addItinerary.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/itinerary.png"))); addItinerary.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); addItinerary.setOnAction(event -> { @@ -665,17 +660,17 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { MainApp.getDataControler().selectNode(itineraryFile); }); - menu.getItems().add(addItinerary); + newIti.getItems().add(addItinerary); - MenuItem addCopyItinerary = new MenuItem("New Itinerary from existing"); + MenuItem addCopyItinerary = new MenuItem("Copy an existing Itinerary"); addCopyItinerary.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/itinerary.png"))); addCopyItinerary.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); addCopyItinerary.setOnAction(event -> { GeneralFile current = (GeneralFile) item.getFile(); copyItinerary(current); }); - menu.getItems().add(addCopyItinerary); - + newIti.getItems().add(addCopyItinerary); + menu.getItems().add(newIti); MenuItem unloadProcess = new MenuItem("Unload Process"); unloadProcess.setGraphic(new ImageView(UITools.getImage("resources/images/revert_16.png"))); @@ -1032,39 +1027,69 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { case STEP: StepFile s = (StepFile) item.getFile(); - MenuItem newSubStep = new MenuItem("New SubStep"); + + Menu newSubStep = new Menu("New SubStep"); newSubStep.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step.png"))); newSubStep.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); - newSubStep.setOnAction(event -> { - addStep(item.getItineraryFile(),s ); + + MenuItem newSubStepFC = new MenuItem("New SubStep from scratch"); + newSubStepFC.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step.png"))); + newSubStepFC.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); + newSubStepFC.setOnAction(event -> { + addStepFromScratch(item.getItineraryFile(), s); }); + + MenuItem cloneSubStep = new MenuItem("Copy an existing Step"); + cloneSubStep.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step.png"))); + cloneSubStep.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); + cloneSubStep.setOnAction(event -> { + copyStep(item.getItineraryFile(), s); + }); + + MenuItem addProcessSubStepFromCSV = new MenuItem("New SubStep From CSV"); + addProcessSubStepFromCSV.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step_csv.png"))); + addProcessSubStepFromCSV.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); + addProcessSubStepFromCSV.setOnAction(event -> { + newStepImport(item.getItineraryFile(), s); + }); + + newSubStep.getItems().add(newSubStepFC); + newSubStep.getItems().add(cloneSubStep); + newSubStep.getItems().add(addProcessSubStepFromCSV); + if (s.getFather() == null) menu.getItems().add(newSubStep); - MenuItem newObs = new MenuItem("New Observation File"); - newObs.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation.png"))); + Menu newObs = new Menu("New Observation"); newObs.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); - newObs.setOnAction(event -> { + newObs.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation.png"))); + + MenuItem newObsFC = new MenuItem("New Observation from scratch"); + newObsFC.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation.png"))); + newObsFC.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); + newObsFC.setOnAction(event -> { ObservationFile newFile = new ObservationFile(s); for(DataNode nodeS : MainApp.getDataControler().getDataNodes(s)) { DataNode obsNode = new DataNode(DataNodeType.OBSERVATION); MainApp.getDataControler().addNode(newFile, obsNode, nodeS); } -// s.getGeneralFile().reconstructItineraty(); s.getData().setModified(true); MainApp.getDataControler().selectNode(newFile); }); - menu.getItems().add(newObs); - MenuItem addNewStepObservationFromCsv = new MenuItem("Import New Observation from CSV"); + MenuItem addNewStepObservationFromCsv = new MenuItem("New Observation from CSV"); addNewStepObservationFromCsv.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation_csv.png"))); addNewStepObservationFromCsv.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); addNewStepObservationFromCsv.setOnAction(event -> { newStepObsImport(s); }); - menu.getItems().add(addNewStepObservationFromCsv); - MenuItem newMix = new MenuItem("Add Composition"); + newObs.getItems().add(newObsFC); + newObs.getItems().add(addNewStepObservationFromCsv); + + menu.getItems().add(newObs); + + MenuItem newMix = new MenuItem("New Composition"); newMix.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/composition.png"))); newMix.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); newMix.setOnAction(event -> { @@ -1470,24 +1495,39 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { }); + Menu newStep = new Menu("New Step"); + newStep.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step.png"))); + newStep.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); - MenuItem addProcessStep = new MenuItem("Create New Step"); + MenuItem addProcessStep = new MenuItem("New Step from scratch"); addProcessStep.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step.png"))); addProcessStep.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); addProcessStep.setOnAction(event -> { ItineraryFile iti = (ItineraryFile) item.getFile(); - addStep(iti, null); + addStepFromScratch(iti, null); }); - MenuItem addProcessStepFromCSV = new MenuItem("Create New Step From CSV"); + MenuItem cloneStep = new MenuItem("Copy an existing Step"); + cloneStep.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step.png"))); + cloneStep.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); + cloneStep.setOnAction(event -> { + ItineraryFile iti = (ItineraryFile) item.getFile(); + copyStep(iti, null); + }); + + MenuItem addProcessStepFromCSV = new MenuItem("New Step From CSV"); addProcessStepFromCSV.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step_csv.png"))); addProcessStepFromCSV.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); addProcessStepFromCSV.setOnAction(event -> { ItineraryFile iti = (ItineraryFile) item.getFile(); - newStepImport(iti); + newStepImport(iti, null); }); - MenuItem addProcessExistingStep = new MenuItem("Add Existing Step"); + newStep.getItems().add(addProcessStep); + newStep.getItems().add(cloneStep); + newStep.getItems().add(addProcessStepFromCSV); + + MenuItem addProcessExistingStep = new MenuItem("Reuse an existing Step"); addProcessExistingStep.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/step.png"))); addProcessExistingStep.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); addProcessExistingStep.setOnAction(event -> { @@ -1495,20 +1535,23 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { addExistingStep(iti); }); - MenuItem newObsIti = new MenuItem("New Observation File"); + Menu newObsIti = new Menu("New Observation"); newObsIti.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation.png"))); newObsIti.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); - newObsIti.setOnAction(event -> { + + MenuItem newObsItiFC = new MenuItem("New Observation from scratch"); + newObsItiFC.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation.png"))); + newObsItiFC.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); + newObsItiFC.setOnAction(event -> { ItineraryFile iti = (ItineraryFile) item.getFile(); ObservationFile newFile = new ObservationFile(iti); DataNode obsNode = new DataNode(DataNodeType.OBSERVATION); MainApp.getDataControler().addNode(newFile, obsNode, item); iti.getProcessFile().getData().setModified(true); MainApp.getDataControler().selectNode(newFile); - }); - MenuItem addNewItineraryObservationFromCsv = new MenuItem("Import New Observation from CSV"); + MenuItem addNewItineraryObservationFromCsv = new MenuItem("New Observation from CSV"); addNewItineraryObservationFromCsv.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation_csv.png"))); addNewItineraryObservationFromCsv.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); addNewItineraryObservationFromCsv.setOnAction(event -> { @@ -1516,11 +1559,13 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { newItineraryObsImport(iti); }); - menu.getItems().add(addProcessStep); - menu.getItems().add(addProcessStepFromCSV); + newObsIti.getItems().add(newObsItiFC); + newObsIti.getItems().add(addNewItineraryObservationFromCsv); + + + menu.getItems().add(newStep); menu.getItems().add(addProcessExistingStep); menu.getItems().add(newObsIti); - menu.getItems().add(addNewItineraryObservationFromCsv); menu.getItems().add(new SeparatorMenuItem()); menu.getItems().add(delItinerary); break; @@ -1532,45 +1577,6 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { } } - private void newStepObsImport(StepFile step) { - File fileImport = getFile(MainApp.primaryStage); - if (fileImport == null) { - return; - } - MainApp.logger.info("start importing/create file " + fileImport.getName()); - Report r = step.checkCreateObservationFromXLSX(fileImport); - if(r.success()) { - ObservationFile obs = step.createObservationFromXLSX(fileImport); - handleInterfaceUpdate(obs.getStepFile().getGeneralFile(), r.success(), "File import completed"); - MainApp.getDataControler().selectNode(obs); - MainApp.logger.info("import done with sucess"); - } else { - showErrorImportAlert(r.prettyPrintError()); - } - } - - private static File getFile(Stage primaryStage) { - FileChooser fileChooser = new FileChooser(); - fileChooser.setTitle("Import file"); - fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Xlsx files (*.xlsx)", "*.xlsx")); - return fileChooser.showOpenDialog(primaryStage); - } - - private static void newStepImport(ItineraryFile iti) { - File fileImport = getFile(MainApp.primaryStage); - if (fileImport == null) { - return; - } - MainApp.logger.info("start importing file " + fileImport.getName()); - ImportReport importReport = iti.checkImportStepFromXLSX(fileImport); - if(importReport.success()) { - StepFile step = iti.importStepFromXLSX(fileImport); - handleInterfaceUpdate(step.getGeneralFile(), importReport.success(), importReport.toString()); - } else { - showErrorImportAlert(importReport.toString()); - } - } - private static void stepImport(StepFile file, boolean isNewStep) { File fileImport = getFile(MainApp.primaryStage); if (fileImport != null) { diff --git a/src/main/resources/resources/changelog.txt b/src/main/resources/resources/changelog.txt index c4fb0a770af7769a6d12d1af9b239389403b497b..2fb41b10c245b2dee043104781e3059664ac481d 100644 --- a/src/main/resources/resources/changelog.txt +++ b/src/main/resources/resources/changelog.txt @@ -1,3 +1,6 @@ +------------------ NEXT ------------------ + * Enhancement (PO2-Tools/po2manager#95) : uniformiser les fonctionnalités de copies (step / itinerary / ....) + ------------------ V1.8.3.4 ------------------ * Bug Fix (PO2-Tools/po2-engine#50) : Gestion de troncage de nom dans les sheets excel * Bug Fix (PO2-Tools/po2-engine#59) : Problème d'import de template d'observation