Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 71da0962 by Tony Chemit at 2021-02-13T17:29:06+01:00 Review Move API and generate most of it. - See #1787 - - - - - 27 changed files: - client/core/src/main/java/fr/ird/observe/client/ObserveActionExecutor.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/edit/actions/MoveEdit.java → client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveAction.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveExecutor.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveRequest.java - + client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveTreeAdapter.java - − client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/MoveTreeAdapter.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUINavigationInitializer.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUINavigationNode.java - − client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/actions/MoveMultiple.java - − client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/open/actions/MoveOpenable.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/NavigationNode.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/capability/ReferenceContainerCapability.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationNode.java - client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/ActivitySampleUIHandler.java - client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/SampleListUIHandler.java - client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/SampleUIHandler.java - client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/sample/ActivitySampleUIMoveTreeAdapter.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/DefaultMultipleMoveTreeAdapter.java → client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/sample/ActivitySampleUIMoveTreeAdapterToTrip.java - client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/sample/SampleUIHelper.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/DefaultSingleMoveTreeAdapter.java → client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/sample/SampleUIMoveTreeAdapterToActivity.java - client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/GenerateContentUISupport.java - client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/data/list/GenerateContentListUINavigationNode.java - client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/data/openable/ContentOpenableUIDescriptor.java - + client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/data/openable/GenerateContentOpenableUIMoveTreeAdapter.java - client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/data/openable/GenerateContentOpenableUINavigationNode.java - client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/helper/ContentUIHandlerHelper.java - client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/helper/ContentUINavigationContextHelper.java Changes: ===================================== client/core/src/main/java/fr/ird/observe/client/ObserveActionExecutor.java ===================================== @@ -46,9 +46,9 @@ public class ObserveActionExecutor extends ActionExecutor implements Closeable { @Override protected void executeWorker(String actionLabel, ActionWorker<?, ?> worker) { - log.info(String.format("Launch ObServe worker [%s] now...", actionLabel)); + log.info(String.format("Launch ObServe worker [%s] register...", actionLabel)); executorService.execute(worker); - log.info(String.format("Launch ObServe worker [%s] is on...", actionLabel)); + log.info(String.format("Launch ObServe worker [%s] running....", actionLabel)); } @Override ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/edit/actions/MoveEdit.java → client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveAction.java ===================================== @@ -1,4 +1,4 @@ -package fr.ird.observe.client.datasource.editor.api.content.data.edit.actions; +package fr.ird.observe.client.datasource.editor.api.content.actions.move; /*- * #%L @@ -24,14 +24,17 @@ package fr.ird.observe.client.datasource.editor.api.content.data.edit.actions; import com.google.common.collect.ImmutableSet; import fr.ird.observe.client.datasource.editor.api.ObserveKeyStrokesEditorApi; +import fr.ird.observe.client.datasource.editor.api.content.ContentUI; import fr.ird.observe.client.datasource.editor.api.content.actions.ConfigureMenuAction; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveExecutor; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequest; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequestBuilder; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.tree.MoveTreeAdapter; +import fr.ird.observe.client.datasource.editor.api.content.actions.ContentUIActionSupport; import fr.ird.observe.client.datasource.editor.api.content.data.edit.ContentEditUI; +import fr.ird.observe.client.datasource.editor.api.content.data.list.ContentListUI; +import fr.ird.observe.client.datasource.editor.api.content.data.open.ContentOpenableUI; import fr.ird.observe.client.datasource.editor.api.content.data.open.ContentOpenableUII18nHelper; +import fr.ird.observe.dto.ObserveUtil; +import fr.ird.observe.dto.data.DataDto; import fr.ird.observe.dto.data.EditableDto; +import fr.ird.observe.dto.data.OpenableDto; import javax.swing.AbstractButton; import java.awt.event.ActionEvent; @@ -41,31 +44,101 @@ import java.util.function.Function; import java.util.function.Supplier; /** - * Created on 12/10/2020. + * To move a data. + * <p> + * Created on 12/02/2021. * * @author Tony Chemit - dev@tchemit.fr - * @since 8.0.1 + * @since 8.0.6 */ -public final class MoveEdit<D extends EditableDto, U extends ContentEditUI<D, U>> extends ContentEditUIActionSupport<D, U> implements ConfigureMenuAction<U> { +public class MoveAction<D extends DataDto, U extends ContentUI> extends ContentUIActionSupport<U> implements ConfigureMenuAction<U> { + /** + * To execute the move action. + */ private final MoveExecutor executor; - public static <D extends EditableDto, U extends ContentEditUI<D, U>> void installAction(U ui, Supplier<MoveRequestBuilder.StepBuild> requestBuilderSupplier, Function<MoveRequest, BiConsumer<String, ImmutableSet<String>>> requestConsumer, Function<MoveRequest, MoveTreeAdapter> treeAdapter) { - MoveExecutor moveExecutor = new MoveExecutor(requestBuilderSupplier, requestConsumer, treeAdapter); - MoveEdit<D, U> action = new MoveEdit<>(ui.getModel().getSource().getScope().getMainType(), moveExecutor); - init(ui, (AbstractButton) Objects.requireNonNull(ui).getObjectById("move"), action); + public static class Builder<D extends DataDto, U extends ContentUI> implements AddOnStep<D, U>, AddSaveStep<D, U>, AddThenStep<D, U>, BuildStep<D, U> { + + private final U ui; + private final Class<D> dtoType; + private Supplier<MoveRequestBuilder.StepBuild> requestBuilderSupplier; + private Function<MoveRequest, BiConsumer<String, ImmutableSet<String>>> requestConsumer; + private Function<MoveRequest, ? extends MoveTreeAdapter<?, ?, ?>> treeAdapter; + + public Builder(U ui, Class<D> dtoType) { + this.ui = Objects.requireNonNull(ui); + this.dtoType = Objects.requireNonNull(dtoType); + } + + @Override + public AddSaveStep<D, U> on(Supplier<MoveRequestBuilder.StepBuild> requestBuilderSupplier) { + this.requestBuilderSupplier = Objects.requireNonNull(requestBuilderSupplier); + return this; + } + + @Override + public AddThenStep<D, U> move(Function<MoveRequest, BiConsumer<String, ImmutableSet<String>>> requestConsumer) { + this.requestConsumer = Objects.requireNonNull(requestConsumer); + return this; + } + + @Override + public BuildStep<D, U> then(Function<U, Function<MoveRequest, ? extends MoveTreeAdapter<?, ?, ?>>> treeAdapter) { + this.treeAdapter = Objects.requireNonNull(treeAdapter).apply(ui); + return this; + } + + @Override + public MoveAction<D, U> install(Supplier<? extends AbstractButton> editor) { + MoveExecutor moveExecutor = new MoveExecutor(requestBuilderSupplier, requestConsumer, treeAdapter); + MoveAction<D, U> action = new MoveAction<>(dtoType, moveExecutor); + init(ui, editor.get(), action); + return action; + } } - protected MoveEdit(Class<D> dataType, MoveExecutor executor) { - super(dataType, null, null, "move", ObserveKeyStrokesEditorApi.KEY_STROKE_MOVE); - this.executor = executor; - setText(ContentOpenableUII18nHelper.getActionMove(getDataType())); - setTooltipText(ContentOpenableUII18nHelper.getActionMove(getDataType())); + public static <D extends DataDto, U extends ContentUI> AddOnStep<D, U> create(U ui, Class<D> dtoType) { + return new Builder<>(ui, dtoType); + } + + public static <D extends EditableDto, U extends ContentEditUI<D, U>> AddOnStep<D, U> create(U ui) { + return create(ui, ObserveUtil.getFirstType(ui)); + } + + public static <D extends OpenableDto, U extends ContentOpenableUI<D, U>> AddOnStep<D, U> create(U ui) { + return create(ui, ObserveUtil.getFirstType(ui)); + } + + public static <D extends OpenableDto, U extends ContentListUI<D, ?, U>> AddOnStep<D, U> create(U ui) { + return create(ui, ObserveUtil.getFirstType(ui)); + } + + protected MoveAction(Class<D> dataType, MoveExecutor executor) { + super(null, null, "move", ObserveKeyStrokesEditorApi.KEY_STROKE_MOVE); + this.executor = Objects.requireNonNull(executor); + setText(ContentOpenableUII18nHelper.getActionMove(dataType)); + setTooltipText(ContentOpenableUII18nHelper.getActionMove(dataType)); } @Override - protected void doActionPerformed(ActionEvent e, U ui) { + protected final void doActionPerformed(ActionEvent e, U ui) { executor.execute(getClientUIContext().getActionExecutor(), getDataSourceEditor(), null); } + public interface AddOnStep<D extends DataDto, U extends ContentUI> { + AddSaveStep<D, U> on(Supplier<MoveRequestBuilder.StepBuild> requestBuilderSupplier); + } + + public interface AddSaveStep<D extends DataDto, U extends ContentUI> { + AddThenStep<D, U> move(Function<MoveRequest, BiConsumer<String, ImmutableSet<String>>> requestConsumer); + } + + public interface AddThenStep<D extends DataDto, U extends ContentUI> { + BuildStep<D, U> then(Function<U, Function<MoveRequest, ? extends MoveTreeAdapter<?, ?, ?>>> treeAdapter); + } + + public interface BuildStep<D extends DataDto, U extends ContentUI> { + MoveAction<D, U> install(Supplier<? extends AbstractButton> editor); + } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveExecutor.java ===================================== @@ -25,7 +25,6 @@ package fr.ird.observe.client.datasource.editor.api.content.actions.move; import com.google.common.collect.ImmutableSet; import fr.ird.observe.client.datasource.editor.api.DataSourceEditor; import fr.ird.observe.client.datasource.editor.api.content.actions.mode.ChangeMode; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.tree.MoveTreeAdapter; import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree; import fr.ird.observe.toolkit.dto.navigation.edit.EditNode; import fr.ird.observe.toolkit.dto.navigation.edit.close.CloseEditNodeVetoException; @@ -34,6 +33,7 @@ import org.apache.logging.log4j.Logger; import org.nuiton.jaxx.runtime.swing.application.ActionExecutor; import javax.swing.SwingUtilities; +import java.lang.reflect.InvocationTargetException; import java.util.Objects; import java.util.Optional; import java.util.function.BiConsumer; @@ -60,9 +60,9 @@ public class MoveExecutor { /** * To adapt tree. */ - private final Function<MoveRequest, MoveTreeAdapter> treeAdapter; + private final Function<MoveRequest, ? extends MoveTreeAdapter<?, ?, ?>> treeAdapter; - public MoveExecutor(Supplier<MoveRequestBuilder.StepBuild> requestBuilderSupplier, Function<MoveRequest, BiConsumer<String, ImmutableSet<String>>> requestConsumer, Function<MoveRequest, MoveTreeAdapter> treeAdapter) { + public MoveExecutor(Supplier<MoveRequestBuilder.StepBuild> requestBuilderSupplier, Function<MoveRequest, BiConsumer<String, ImmutableSet<String>>> requestConsumer, Function<MoveRequest, ? extends MoveTreeAdapter<?, ?, ?>> treeAdapter) { this.requestBuilderSupplier = Objects.requireNonNull(requestBuilderSupplier); this.requestConsumer = Objects.requireNonNull(requestConsumer); this.treeAdapter = Objects.requireNonNull(treeAdapter); @@ -74,7 +74,7 @@ public class MoveExecutor { if (optionalRequest.isPresent()) { MoveRequest request = optionalRequest.get(); if (editNode == null || close(request, editNode, dataSourceEditor)) { - actionExecutor.addAction("", () -> consume(request, dataSourceEditor.getNavigationUI().getTree())); + actionExecutor.addAction("Move " + request, () -> consume(request, dataSourceEditor.getNavigationUI().getTree())); } return; } @@ -93,12 +93,17 @@ public class MoveExecutor { String newParentId = request.getNewParentId(); String oldParentId = request.getOldParentId(); ImmutableSet<String> referenceId = request.getIds(); - log.info(String.format("Move %s from parent: %s to %s", referenceId, oldParentId, newParentId)); + log.info(String.format("Move adapt tree [start] %s from parent: %s to %s", referenceId, oldParentId, newParentId)); BiConsumer<String, ImmutableSet<String>> consumer = getRequestConsumer(request); consumer.accept(newParentId, referenceId); - - SwingUtilities.invokeLater(() -> treeAdapter.apply(request).adaptTree(request, tree)); + MoveTreeAdapter<?, ?, ?> moveTreeAdapter = this.treeAdapter.apply(request); + try { + SwingUtilities.invokeAndWait(() -> moveTreeAdapter.adaptTree(request, tree)); + } catch (InterruptedException | InvocationTargetException e) { + log.error(e); + } + log.info(String.format("Move adapt tree [end..] %s from parent: %s to %s", referenceId, oldParentId, newParentId)); } protected boolean close(MoveRequest request, EditNode<?> editNode, DataSourceEditor dataSourceEditor) { ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveRequest.java ===================================== @@ -26,6 +26,8 @@ import com.google.common.collect.ImmutableSet; import fr.ird.observe.dto.reference.DataDtoReference; import fr.ird.observe.dto.reference.DtoReference; +import java.util.StringJoiner; + /** * Created on 13/10/2020. * @@ -108,4 +110,17 @@ public class MoveRequest { public boolean isSingle() { return ids.size() == 1; } + + @Override + public String toString() { + return new StringJoiner(", ", MoveRequest.class.getSimpleName() + "[", "]") +// .add("referenceType=" + referenceType) +// .add("parentReferenceType=" + parentReferenceType) +// .add("parentTargetReferenceType=" + parentTargetReferenceType) +// .add("oldParentId='" + oldParentId + "'") + .add("ids=" + ids) + .add("newParentId='" + newParentId + "'") +// .add("selectTarget=" + selectTarget) + .toString(); + } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveTreeAdapter.java ===================================== @@ -0,0 +1,119 @@ +package fr.ird.observe.client.datasource.editor.api.content.actions.move; + +/*- + * #%L + * ObServe Client :: DataSource :: Editor :: API + * %% + * Copyright (C) 2008 - 2021 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.collect.ImmutableSet; +import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree; +import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; + +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; + +/** + * FIXME:Tree Create a template to generate implementations + * <p> + * Created on 12/02/2021. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 8.0.6 + */ +public abstract class MoveTreeAdapter<OldParent extends NavigationNode, NewParent extends NavigationNode, NewNode extends NavigationNode> { + + private final NavigationNode incomingNode; + private final Function<NavigationNode, OldParent> oldParentSupplier; + + protected MoveTreeAdapter(NavigationNode incomingNode, Function<NavigationNode, OldParent> oldParentSupplier) { + this.incomingNode = Objects.requireNonNull(incomingNode); + this.oldParentSupplier = Objects.requireNonNull(oldParentSupplier); + } + + public abstract NewParent getNewParentNode(OldParent oldParentNode, String newParentId); + + public abstract NewNode addMissingChildren(NewParent newParentNode); + + public abstract void removeChildren(OldParent oldParentNode, Set<String> ids); + + public final void adaptTree(MoveRequest request, NavigationTree tree) { + ImmutableSet<String> ids = request.getIds(); + boolean selectTarget = request.isSelectTarget(); + boolean multiple = !request.isSingle(); + OldParent oldParentNode = getOldParentNode(getIncomingNode()); + NewParent newParentNode = getNewParentNode(oldParentNode, request.getNewParentId()); + NavigationNode nodeToSelect = adaptNewParentNode(newParentNode, ids); + if (!selectTarget) { + // stay on old parent node + nodeToSelect = oldParentNode; + } else { + if (multiple) { + // on multiple move select new parent node + nodeToSelect = newParentNode; + } + } + adaptOldParentNode(oldParentNode, ids); + doFinalSelect(selectTarget, tree, nodeToSelect); + } + + public final OldParent getOldParentNode(NavigationNode incomingNode) { + return oldParentSupplier.apply(incomingNode); + } + + public final void adaptOldParentNode(OldParent oldParentNode, ImmutableSet<String> ids) { + // reload node + oldParentNode.reloadNodeData(); + // remove obsolete nodes + removeChildren(oldParentNode, ids); + } + + public final NewNode adaptNewParentNode(NewParent newParentNode, ImmutableSet<String> ids) { + // reload node + newParentNode.reloadNodeData(); + // add new nodes + NewNode newNode = addMissingChildren(newParentNode); + if (ids.size() == 1) { + //FIXME:Tree Make sure this is required, should be done by node + newNode.getParent().refreshToRoot(); + } + return newNode; + } + + public final void doFinalSelect(boolean selectTarget, NavigationTree tree, NavigationNode nodeToSelect) { + if (selectTarget) { + // select new node + tree.selectSafeNode(nodeToSelect); + } else { + if (nodeToSelect.getParent() == null) { + // limit case: node to select is old parent node and was removed + tree.selectFirstNode(); + } else { + // re-select the node (to update associated form) + tree.reSelectSafeNode(nodeToSelect); + } + } + } + + public NavigationNode getIncomingNode() { + return incomingNode; + } + +} ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/MoveTreeAdapter.java deleted ===================================== @@ -1,95 +0,0 @@ -package fr.ird.observe.client.datasource.editor.api.content.actions.move.tree; - -/*- - * #%L - * ObServe Client :: DataSource :: Editor :: API - * %% - * Copyright (C) 2008 - 2021 IRD, Code Lutin, Ultreia.io - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import com.google.common.collect.ImmutableSet; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequest; -import fr.ird.observe.client.datasource.editor.api.content.data.list.ContentListUINavigationNode; -import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree; -import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; -import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationNode; -import fr.ird.observe.dto.referential.common.ProgramReference; - -/** - * To adapt navigation tree after the move operation. - * <p> - * Created on 15/10/2020. - * - * @author Tony Chemit - dev@tchemit.fr - * @since 8.0.1 - */ -public interface MoveTreeAdapter { - - void adaptTree(MoveRequest request, NavigationTree tree); - - static void cleanOldParentNode(NavigationTree tree, ImmutableSet<String> ids, ContentListUINavigationNode oldParentNode) { - if (oldParentNode.getChildCount() == ids.size() && oldParentNode.getParent().isRoot()) { - RootNavigationNode root = (RootNavigationNode) oldParentNode.getParent(); - if (!root.getInitializer().getConfig().isLoadEmptyProgram()) { - // limit case : node will be empty, must remove it - root.remove(oldParentNode); - return; - } - } - // clean it - oldParentNode.removeChildren(ids); - - // reload node - oldParentNode.reloadNodeData(); - - // re-select the node (to update associated form) - tree.reSelectSafeNode(oldParentNode); - } - - static ContentListUINavigationNode getNewParentNode(MoveRequest request, NavigationNode oldParentContainerNode) { - String newParentId = request.getNewParentId(); - if (oldParentContainerNode.isRoot()) { - RootNavigationNode root = (RootNavigationNode) oldParentContainerNode; - boolean loadEmptyProgram = root.getInitializer().getConfig().isLoadEmptyProgram(); - if (!loadEmptyProgram) { - NavigationNode result = root.findChildById(newParentId); - if (result == null) { - // limit case : node does not exist (was empty previously), need to create it - ProgramReference reference = root.getInitializer().getNavigationResult().getProgram(newParentId); - result = root.getCapability().createChildNode(reference); - int position = root.getCapability().getNodePosition(reference); - root.insert(result, position); - } - return (ContentListUINavigationNode) result; - } - } - return (ContentListUINavigationNode) oldParentContainerNode.downToReferenceNode(request.getParentTargetReferenceType(), newParentId); - } - - static void doFinalSelect(MoveRequest request, NavigationTree tree,NavigationNode oldParentNode, NavigationNode newParentNode ) { - if (request.isSelectTarget()) { - // select new parent node - tree.selectSafeNode(newParentNode); - } else { - if (oldParentNode.getParent() == null) { - // limit case: select first node in tree (previous old parent node was removed) - tree.selectFirstNode(); - } - } - } -} ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUINavigationInitializer.java ===================================== @@ -34,6 +34,8 @@ import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; /** * Created on 25/10/2020. @@ -90,6 +92,11 @@ public class ContentListUINavigationInitializer extends NavigationInitializer<Co return references.get().toArrayList(); } + public List<? extends DataDtoReference> getReferencesWithout(Set<String> idsToExclude) { + //FIXME Add this in framework (.without(idsToExclude) + return references.get().stream().filter(r -> !idsToExclude.contains(r.getId())).collect(Collectors.toList()); + } + public final boolean isOpen() { return Objects.equals(getSelectedParentId(), getParentEditNodeId()); } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUINavigationNode.java ===================================== @@ -22,8 +22,8 @@ package fr.ird.observe.client.datasource.editor.api.content.data.list; * #L% */ -import com.google.common.collect.ImmutableSet; import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; +import fr.ird.observe.dto.IdDto; import fr.ird.observe.dto.reference.DataDtoReference; import fr.ird.observe.dto.reference.DtoReference; import fr.ird.observe.dto.reference.LazyDataDtoReferenceSet; @@ -31,6 +31,7 @@ import io.ultreia.java4all.lang.Objects2; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; /** * Created on 07/10/2020. @@ -51,8 +52,6 @@ public abstract class ContentListUINavigationNode extends NavigationNode { return node; } -// public abstract OpenableDtoServiceContext<?, ?, ?> getSpi(); - @Override public ContentListUINavigationInitializer getInitializer() { return (ContentListUINavigationInitializer) super.getInitializer(); @@ -81,45 +80,21 @@ public abstract class ContentListUINavigationNode extends NavigationNode { return getInitializer().getParentReference(); } - public void removeChildren(ImmutableSet<String> ids) { + public void removeChildren(Set<String> ids) { for (String id : ids) { NavigationNode childNode = findChildById(id); childNode.removeFromParent(); } } - public void addChildren(Set<String> ids) { + public NavigationNode addMissingChildren() { ContentListUINavigationInitializer initializer = getInitializer(); - boolean notLoaded = isNotLoaded(); - reloadNodeData(); - List<? extends DataDtoReference> references = initializer.getReferences(); + Set<String> existingIds = getChildrenReferences(getScope().getMainReferenceType()).stream().map(IdDto::getId).collect(Collectors.toSet()); + List<? extends DataDtoReference> references = initializer.getReferencesWithout(existingIds); ContentListUINavigationCapability<?> capability = getCapability(); + NavigationNode result = null; for (DataDtoReference reference : references) { - if (notLoaded || ids.contains(reference.getId())) { - NavigationNode childNode = capability.createChildNode(reference); - int nodePosition = capability.getNodePosition(reference); - insert(childNode, nodePosition); - } - } - } - public NavigationNode addChildren(String id) { - NavigationNode result=null; - ContentListUINavigationInitializer initializer = getInitializer(); - boolean notLoaded = isNotLoaded(); - reloadNodeData(); - List<? extends DataDtoReference> references = initializer.getReferences(); - ContentListUINavigationCapability<?> capability = getCapability(); - for (DataDtoReference reference : references) { - boolean idEquals = id.equals(reference.getId()); - if (notLoaded || idEquals) { - - NavigationNode childNode = capability.createChildNode(reference); - int nodePosition = capability.getNodePosition(reference); - insert(childNode, nodePosition); - if (idEquals) { - result = childNode; - } - } + result = capability.insertChildNode(reference); } return result; } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/actions/MoveMultiple.java deleted ===================================== @@ -1,77 +0,0 @@ -package fr.ird.observe.client.datasource.editor.api.content.data.list.actions; - -/*- - * #%L - * ObServe Client :: DataSource :: Editor :: API - * %% - * Copyright (C) 2008 - 2021 IRD, Code Lutin, Ultreia.io - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import com.google.common.collect.ImmutableSet; -import fr.ird.observe.client.datasource.editor.api.ObserveKeyStrokesEditorApi; -import fr.ird.observe.client.datasource.editor.api.content.actions.ConfigureMenuAction; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveExecutor; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequest; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequestBuilder; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.tree.DefaultMultipleMoveTreeAdapter; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.tree.MoveTreeAdapter; -import fr.ird.observe.client.datasource.editor.api.content.data.list.ContentListUI; -import fr.ird.observe.client.datasource.editor.api.content.data.list.ContentListUII18nHelper; -import fr.ird.observe.dto.data.DataDto; -import fr.ird.observe.dto.reference.DataDtoReference; -import fr.ird.observe.dto.reference.DtoReferenceCollection; - -import java.awt.event.ActionEvent; -import java.util.Objects; -import java.util.function.BiConsumer; -import java.util.function.Function; -import java.util.function.Supplier; - -/** - * Created by tchemit on 12/06/17. - * - * @author Tony Chemit - dev@tchemit.fr - */ -public final class MoveMultiple<D extends DataDto, R extends DataDtoReference, U extends ContentListUI<D, R, U>> extends ContentListUIActionSupport<D, R, U> implements ConfigureMenuAction<U> { - - private final MoveExecutor executor; - - public static <D extends DataDto, R extends DataDtoReference, U extends ContentListUI<D, R, U>> void installMoveAction(U ui, Function<String, DtoReferenceCollection<?>> parentCandidates, Function<MoveRequest, BiConsumer<String, ImmutableSet<String>>> consumer) { - Supplier<MoveRequestBuilder.StepBuild> requestBuilderSupplier = () -> MoveRequestBuilder.create(ui.getModel()).setParentCandidates(parentCandidates); - installMoveAction(ui, requestBuilderSupplier, consumer, r -> new DefaultMultipleMoveTreeAdapter()); - } - - public static <D extends DataDto, R extends DataDtoReference, U extends ContentListUI<D, R, U>> void installMoveAction(U ui, Supplier<MoveRequestBuilder.StepBuild> requestBuilderSupplier, Function<MoveRequest, BiConsumer<String, ImmutableSet<String>>> requestConsumer, Function<MoveRequest, MoveTreeAdapter> treeAdapter) { - MoveExecutor moveExecutor = new MoveExecutor(requestBuilderSupplier, requestConsumer, treeAdapter); - MoveMultiple<D, R, U> action = new MoveMultiple<>(ui.getModel().getSource().getScope().getMainType(), moveExecutor); - init(ui, Objects.requireNonNull(ui).getMove(), action); - } - - protected MoveMultiple(Class<D> dataType, MoveExecutor executor) { - super(dataType, null, null, "move", ObserveKeyStrokesEditorApi.KEY_STROKE_MOVE); - this.executor = executor; - setText(ContentListUII18nHelper.getActionMove(getDataType())); - setTooltipText(ContentListUII18nHelper.getActionMoveTip(getDataType())); - } - - @Override - protected void doActionPerformed(ActionEvent e, U ui) { - executor.execute(getClientUIContext().getActionExecutor(), getDataSourceEditor(), ui.getModel().getSource().getInitializer().getEditNode()); - } - -} ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/open/actions/MoveOpenable.java deleted ===================================== @@ -1,78 +0,0 @@ -package fr.ird.observe.client.datasource.editor.api.content.data.open.actions; - -/*- - * #%L - * ObServe Client :: DataSource :: Editor :: API - * %% - * Copyright (C) 2008 - 2021 IRD, Code Lutin, Ultreia.io - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import com.google.common.collect.ImmutableSet; -import fr.ird.observe.client.datasource.editor.api.ObserveKeyStrokesEditorApi; -import fr.ird.observe.client.datasource.editor.api.content.actions.ConfigureMenuAction; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveExecutor; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequest; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequestBuilder; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.tree.DefaultSingleMoveTreeAdapter; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.tree.MoveTreeAdapter; -import fr.ird.observe.client.datasource.editor.api.content.data.open.ContentOpenableUI; -import fr.ird.observe.client.datasource.editor.api.content.data.open.ContentOpenableUII18nHelper; -import fr.ird.observe.dto.data.OpenableDto; -import fr.ird.observe.dto.reference.DtoReferenceCollection; - -import java.awt.event.ActionEvent; -import java.util.Objects; -import java.util.function.BiConsumer; -import java.util.function.Function; -import java.util.function.Supplier; - -/** - * Created by tchemit on 12/06/17. - * - * @author Tony Chemit - dev@tchemit.fr - */ -public final class MoveOpenable<D extends OpenableDto, U extends ContentOpenableUI<D, U>> extends ContentOpenableUIActionSupport<D, U> implements ConfigureMenuAction<U> { - - private final MoveExecutor executor; - - public static <D extends OpenableDto, U extends ContentOpenableUI<D, U>> void installAction(U ui, Function<String, DtoReferenceCollection<?>> parentCandidates, Function<MoveRequest, BiConsumer<String, ImmutableSet<String>>> consumer) { - Supplier<MoveRequestBuilder.StepBuild> requestBuilderSupplier = () -> ui.getModel().toMoveRequest().setParentCandidates(parentCandidates); - MoveExecutor moveExecutor = new MoveExecutor(requestBuilderSupplier, consumer, r -> new DefaultSingleMoveTreeAdapter()); - MoveOpenable<D, U> action = new MoveOpenable<>(ui.getModel().getSource().getScope().getMainType(), moveExecutor); - init(ui, Objects.requireNonNull(ui).getMove(), action); - } - - public static <D extends OpenableDto, U extends ContentOpenableUI<D, U>> void installAction(U ui, Supplier<MoveRequestBuilder.StepBuild> requestBuilderSupplier, Function<MoveRequest, BiConsumer<String, ImmutableSet<String>>> requestConsumer, Function<MoveRequest, MoveTreeAdapter> treeAdapter) { - MoveExecutor moveExecutor = new MoveExecutor(requestBuilderSupplier, requestConsumer, treeAdapter); - MoveOpenable<D, U> action = new MoveOpenable<>(ui.getModel().getSource().getScope().getMainType(), moveExecutor); - init(ui, Objects.requireNonNull(ui).getMove(), action); - } - - protected MoveOpenable(Class<D> dataType, MoveExecutor executor) { - super(dataType, null, null, "move", ObserveKeyStrokesEditorApi.KEY_STROKE_MOVE); - this.executor = executor; - setText(ContentOpenableUII18nHelper.getActionMove(getDataType())); - setTooltipText(ContentOpenableUII18nHelper.getActionMove(getDataType())); - } - - @Override - protected void doActionPerformed(ActionEvent e, U ui) { - executor.execute(getClientUIContext().getActionExecutor(), getDataSourceEditor(), ui.getModel().getSource().getInitializer().getEditNode()); - } - -} ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/NavigationNode.java ===================================== @@ -271,6 +271,25 @@ public abstract class NavigationNode extends DefaultMutableTreeNode implements W return result; } + public final <R extends DtoReference> List<R> getChildrenReferences(Class<R> referenceType) { + Enumeration<?> children = children(); + List<R> result = new LinkedList<>(); + while (children.hasMoreElements()) { + NavigationNode o = (NavigationNode) children.nextElement(); + if (o.isReference()) { + ReferenceCapability<?> capability = (ReferenceCapability<?>) o.getCapability(); + DtoReference nodeReference = capability.getReference(); + if (nodeReference.isNotPersisted()) { + continue; + } + if (referenceType.isAssignableFrom(nodeReference.getReferenceType())) { + result.add(referenceType.cast(nodeReference)); + } + } + } + return result; + } + //-------------------------------------------------------------------------------------------- // Update methods //-------------------------------------------------------------------------------------------- @@ -625,6 +644,24 @@ public abstract class NavigationNode extends DefaultMutableTreeNode implements W return null; } + /** + * @param siblingId id to seek + * @return sibling node with the given id + */ + public NavigationNode findSibling(String siblingId) { + NavigationNode parent = getParent(); + return parent.findChildByType(getClass(), siblingId); + } + + /** + * @param siblingId id to seek + * @return sibling node with the given id (using parent sibling on given id) + */ + public NavigationNode findParentSibling(String siblingId) { + NavigationNode sibling = getParent().findSibling(siblingId); + return sibling.findChildByType(getClass()); + } + /** * @return next sibling with exact node type matching */ @@ -723,20 +760,6 @@ public abstract class NavigationNode extends DefaultMutableTreeNode implements W throw new IllegalStateException(String.format("Can't go down reference node of type: %s from node: %s", referenceType.getName(), this)); } - public NavigationNode downToReferenceContainerNode(Class<? extends DtoReference> referenceType) { - if (acceptReferenceContainerNode(referenceType)) { - return this; - } - Enumeration<?> children = children(); - while (children.hasMoreElements()) { - NavigationNode childrenNode = (NavigationNode) children.nextElement(); - if (childrenNode.acceptReferenceContainerNode(referenceType)) { - return childrenNode; - } - } - throw new IllegalStateException(String.format("Can't go down to reference container node of type: %s from node: %s", referenceType.getName(), this)); - } - //-------------------------------------------------------------------------------------------- // TreeNode override methods //-------------------------------------------------------------------------------------------- ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/capability/ReferenceContainerCapability.java ===================================== @@ -40,6 +40,13 @@ public interface ReferenceContainerCapability<N extends NavigationNode> extends int getNodePosition(DtoReference reference); + default NavigationNode insertChildNode(DtoReference reference) { + NavigationNode result = createChildNode(reference); + int nodePosition = getNodePosition(reference); + getNode().insert(result, nodePosition); + return result; + } + default boolean acceptChildReferenceType(Class<? extends DtoReference> dtoReferenceType) { return getAcceptedTypes().contains(dtoReferenceType); } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationNode.java ===================================== @@ -46,10 +46,6 @@ public class RootNavigationNode extends NavigationNode { public static int nodeCount; - public RootNavigationNode() { - nodeCount = 0; - } - public static int incrementsAndGetNodeCount() { return ++nodeCount; } @@ -84,6 +80,10 @@ public class RootNavigationNode extends NavigationNode { return node; } + public RootNavigationNode() { + nodeCount = 0; + } + @Override public RootNavigationInitializer getInitializer() { return (RootNavigationInitializer) super.getInitializer(); @@ -119,6 +119,46 @@ public class RootNavigationNode extends NavigationNode { return (RootNavigationCapability) super.getCapability(); } + @Override + public NavigationNode findChildById(String id) { + NavigationNode result = super.findChildById(id); + if (result == null) { + result = createMissingProgramNode(id); + } + return result; + } + + @SuppressWarnings("unchecked") + @Override + public <N extends NavigationNode> N findChildByType(Class<N> childType, String id) { + N result = super.findChildByType(childType, id); + if (result == null) { + result = (N) createMissingProgramNode(id); + } + return result; + } + + @Override + public NavigationNode findChildByModelNode(NavigationModelNode<?> node) { + NavigationNode result = super.findChildByModelNode(node); + if (result == null && node.isRoot()) { + result = createMissingProgramNode(node.getId()); + } + return result; + } + + protected NavigationNode createMissingProgramNode(String id) { + // limit case : node does not exist (was empty previously), need to create it + ProgramReference reference = getInitializer().getNavigationResult().getProgram(id); + if (reference == null) { + throw new IllegalStateException(String.format("Could not find program: %s", id)); + } + NavigationNode result = getCapability().createChildNode(reference); + int position = getCapability().getNodePosition(reference); + insert(result, position); + return result; + } + public NavigationNode findNodeFromPreviousSelectedNode(NavigationNode oldSelectedNode) { NavigationNode result = this; TreeNode[] pathToRoot = oldSelectedNode.getPath(); @@ -138,7 +178,6 @@ public class RootNavigationNode extends NavigationNode { return result; } - public NavigationNode findNode(NavigationModelNode<?> editNode) { NavigationNode result = this; ImmutableList<NavigationModelNode<?>> nodesFromRoot = editNode.getNodesFromRoot(); ===================================== client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/ActivitySampleUIHandler.java ===================================== @@ -23,13 +23,9 @@ package fr.ird.observe.client.datasource.editor.ll.data.logbook; */ import fr.ird.observe.client.datasource.editor.api.content.ContentUIInitializer; +import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveAction; import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequestBuilder; -import fr.ird.observe.client.datasource.editor.api.content.data.edit.actions.MoveEdit; -import fr.ird.observe.client.datasource.editor.ll.data.logbook.sample.ActivitySampleUIMoveTreeAdapter; import fr.ird.observe.client.datasource.editor.ll.data.logbook.sample.SampleUIHelper; -import fr.ird.observe.dto.data.ll.common.TripReference; -import fr.ird.observe.dto.data.ll.logbook.ActivityReference; -import io.ultreia.java4all.i18n.I18n; /** * Created on 12/5/14. @@ -54,28 +50,11 @@ public class ActivitySampleUIHandler extends GeneratedActivitySampleUIHandler { @Override protected void installSaveAction() { super.installSaveAction(); - MoveEdit.installAction(ui, - () -> { - Boolean moveToTrip = SampleUIHelper.movetoTrip(); - if (moveToTrip == null) { - return null; - } - MoveRequestBuilder.StepSetParentCandidates requestBuilder = MoveRequestBuilder - .create(getModel()); - if (moveToTrip) { - return requestBuilder - .setParentTargetReferenceType(TripReference.class) - .setParentCandidates(this.getLlLogbookActivitySampleService()::getParents); - } - // move to activity - return requestBuilder - .setParentTargetReferenceType(ActivityReference.class) - .setAskNewParentTitle(I18n.t("observe.data.ll.logbook.Sample.action.move.choose.parent.activity.title")) - .setAskNewParentMessage(I18n.t("observe.data.ll.logbook.Sample.action.move.choose.parent.activity.message")) - .setParentCandidates(this.getLlLogbookActivityService()::getBrothers); - }, - r -> getLlLogbookActivitySampleService()::move, - r -> new ActivitySampleUIMoveTreeAdapter()); + MoveAction.create(ui) + .on(SampleUIHelper.newSupplier(this, () -> MoveRequestBuilder.create(ui.getModel()))) + .move(r -> getLlLogbookActivitySampleService()::move) + .then(SampleUIHelper::create) + .install(ui::getMove); } } ===================================== client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/SampleListUIHandler.java ===================================== @@ -22,9 +22,7 @@ package fr.ird.observe.client.datasource.editor.ll.data.logbook; * #L% */ -import fr.ird.observe.client.datasource.editor.api.content.actions.move.tree.DefaultMultipleMoveTreeAdapter; -import fr.ird.observe.client.datasource.editor.api.content.data.list.actions.MoveMultiple; -import fr.ird.observe.client.datasource.editor.ll.data.logbook.sample.ActivitySampleUIMoveTreeAdapter; +import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveAction; import fr.ird.observe.client.datasource.editor.ll.data.logbook.sample.SampleUIHelper; /** @@ -37,9 +35,10 @@ class SampleListUIHandler extends GeneratedSampleListUIHandler { @Override protected void installMoveAction() { - MoveMultiple.installMoveAction(ui, - SampleUIHelper.newSupplier(this, getModel()::toMoveRequest), - r -> getLlLogbookSampleService()::move, - r -> SampleUIHelper.toTrip(r) ? new DefaultMultipleMoveTreeAdapter() : new ActivitySampleUIMoveTreeAdapter()); + MoveAction.create(ui) + .on(SampleUIHelper.newSupplier(this, getModel()::toMoveRequest)) + .move(r -> getLlLogbookSampleService()::move) + .then(SampleUIHelper::create) + .install(ui::getMove); } } ===================================== client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/SampleUIHandler.java ===================================== @@ -24,9 +24,7 @@ package fr.ird.observe.client.datasource.editor.ll.data.logbook; import fr.ird.observe.client.datasource.editor.api.content.ContentMode; import fr.ird.observe.client.datasource.editor.api.content.ContentUIInitializer; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.tree.DefaultSingleMoveTreeAdapter; -import fr.ird.observe.client.datasource.editor.api.content.data.open.actions.MoveOpenable; -import fr.ird.observe.client.datasource.editor.ll.data.logbook.sample.ActivitySampleUIMoveTreeAdapter; +import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveAction; import fr.ird.observe.client.datasource.editor.ll.data.logbook.sample.SampleUIHelper; /** @@ -66,9 +64,10 @@ class SampleUIHandler extends GeneratedSampleUIHandler { @Override protected void installMoveAction() { - MoveOpenable.installAction(ui, - SampleUIHelper.newSupplier(this, getModel()::toMoveRequest), - r -> getLlLogbookSampleService()::move, - r -> SampleUIHelper.toTrip(r) ? new DefaultSingleMoveTreeAdapter() : new ActivitySampleUIMoveTreeAdapter()); + MoveAction.create(ui) + .on(SampleUIHelper.newSupplier(this, getModel()::toMoveRequest)) + .move(r -> getLlLogbookSampleService()::move) + .then(SampleUIHelper::create) + .install(ui::getMove); } } ===================================== client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/sample/ActivitySampleUIMoveTreeAdapter.java ===================================== @@ -22,74 +22,39 @@ package fr.ird.observe.client.datasource.editor.ll.data.logbook.sample; * #L% */ -import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequest; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.tree.DefaultSingleMoveTreeAdapter; -import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree; -import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; +import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveTreeAdapter; import fr.ird.observe.client.datasource.editor.ll.data.logbook.ActivitySampleUINavigationNode; import fr.ird.observe.client.datasource.editor.ll.data.logbook.ActivityUINavigationNode; -import fr.ird.observe.client.datasource.editor.ll.data.logbook.SampleListUINavigationNode; -import fr.ird.observe.client.datasource.editor.ll.data.logbook.SampleUINavigationNode; +import fr.ird.observe.dto.data.ll.logbook.ActivitySampleReference; + +import java.util.Set; /** - * Created on 15/10/2020. + * FIXME:Tree Generate me + * Created on 12/02/2021. * * @author Tony Chemit - dev@tchemit.fr - * @since 8.0.1 + * @since 8.0.6 */ -public class ActivitySampleUIMoveTreeAdapter extends DefaultSingleMoveTreeAdapter { - - public static void moveFromActivityToActivity(NavigationTree tree, ActivitySampleUINavigationNode referenceNode, String activityId) { - ActivityUINavigationNode newContainerNode = referenceNode.getParent().getParent() - .getActivityUINavigationNode(activityId); - newContainerNode.updateNode(); - ActivitySampleUINavigationNode node = newContainerNode.getActivitySampleUINavigationNode(); - tree.selectSafeNode(node); - } +public class ActivitySampleUIMoveTreeAdapter extends MoveTreeAdapter<ActivityUINavigationNode, ActivityUINavigationNode, ActivitySampleUINavigationNode> { - public static void moveFromTripToActivity(NavigationTree tree, SampleUINavigationNode referenceNode, String activityId) { - ActivityUINavigationNode newContainerNode = referenceNode.getParent().getParent() - .getLogbookActivityListUINavigationNode().getActivityUINavigationNode(activityId); - newContainerNode.updateNode(); - ActivitySampleUINavigationNode node = newContainerNode.getActivitySampleUINavigationNode(); - tree.selectSafeNode(node); + public ActivitySampleUIMoveTreeAdapter(ActivitySampleUINavigationNode incomingNode) { + super(incomingNode, e -> incomingNode.getParent()); } - public static void moveFromTripToTrip(NavigationTree tree, SampleUINavigationNode referenceNode, String tripId, String sampleId) { - SampleListUINavigationNode newContainerNode = referenceNode.getParent().getParent().getParent() - .getTripUINavigationNode(tripId).getSampleListUINavigationNode(); - newContainerNode.reloadNodeDataToRoot(); - NavigationNode node = newContainerNode.getSampleUINavigationNode(sampleId); - tree.selectSafeNode(node); + @Override + public ActivityUINavigationNode getNewParentNode(ActivityUINavigationNode oldParentNode, String newParentId) { + return oldParentNode.findParentSibling(newParentId); } - public static void moveFromActivityToTrip(NavigationTree tree, ActivitySampleUINavigationNode referenceNode, String tripId, String sampleId) { - SampleListUINavigationNode newContainerNode = referenceNode.getParent().getParent().getParent().getParent() - .getTripUINavigationNode(tripId).getSampleListUINavigationNode(); - newContainerNode.reloadNodeDataToRoot(); - NavigationNode node = newContainerNode.getSampleUINavigationNode(sampleId); - tree.selectSafeNode(node); + @Override + public ActivitySampleUINavigationNode addMissingChildren(ActivityUINavigationNode newParentNode) { + ActivitySampleReference reference = newParentNode.getReference().getActivitySample(); + return newParentNode.addActivitySampleUINavigationNode(reference); } @Override - public void adaptTree(MoveRequest request, NavigationTree tree) { - NavigationNode referenceNode = tree.getSelectedNode(); - boolean fromTrip = SampleUIHelper.fromTrip(request); - if (SampleUIHelper.toTrip(request)) { - if (fromTrip) { - moveFromTripToTrip(tree, (SampleUINavigationNode) referenceNode, request.getNewParentId(), request.getId()); - } else { - moveFromActivityToTrip(tree, (ActivitySampleUINavigationNode) referenceNode, request.getNewParentId(), request.getId()); - } - } else { - // move to activity - if (fromTrip) { - moveFromTripToActivity(tree, (SampleUINavigationNode) referenceNode, request.getNewParentId()); - } else { - moveFromActivityToActivity(tree, (ActivitySampleUINavigationNode) referenceNode, request.getNewParentId()); - } - } - //FIXME Not sure we still need to do this. - referenceNode.removeFromParent(); + public void removeChildren(ActivityUINavigationNode oldParentNode, Set<String> ids) { + oldParentNode.getActivitySampleUINavigationNode().removeFromParent(); } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/DefaultMultipleMoveTreeAdapter.java → client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/sample/ActivitySampleUIMoveTreeAdapterToTrip.java ===================================== @@ -1,8 +1,8 @@ -package fr.ird.observe.client.datasource.editor.api.content.actions.move.tree; +package fr.ird.observe.client.datasource.editor.ll.data.logbook.sample; /*- * #%L - * ObServe Client :: DataSource :: Editor :: API + * ObServe Client :: DataSource :: Editor :: LL * %% * Copyright (C) 2008 - 2021 IRD, Code Lutin, Ultreia.io * %% @@ -22,41 +22,40 @@ package fr.ird.observe.client.datasource.editor.api.content.actions.move.tree; * #L% */ -import com.google.common.collect.ImmutableSet; -import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequest; -import fr.ird.observe.client.datasource.editor.api.content.data.list.ContentListUINavigationNode; -import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree; -import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; +import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveTreeAdapter; +import fr.ird.observe.client.datasource.editor.ll.data.logbook.ActivitySampleUINavigationNode; +import fr.ird.observe.client.datasource.editor.ll.data.logbook.ActivityUINavigationNode; +import fr.ird.observe.client.datasource.editor.ll.data.logbook.SampleListUINavigationNode; +import fr.ird.observe.client.datasource.editor.ll.data.logbook.SampleUINavigationNode; + +import java.util.Set; /** - * Created on 15/10/2020. + * Created on 12/02/2021. * * @author Tony Chemit - dev@tchemit.fr - * @since 8.0.1 + * @since 8.0.6 */ -public class DefaultMultipleMoveTreeAdapter implements MoveTreeAdapter { - - @Override - public void adaptTree(MoveRequest request, NavigationTree tree) { - ImmutableSet<String> ids = request.getIds(); +public class ActivitySampleUIMoveTreeAdapterToTrip extends MoveTreeAdapter<ActivityUINavigationNode, SampleListUINavigationNode, SampleUINavigationNode> { - // get old parent node - ContentListUINavigationNode oldParentNode = (ContentListUINavigationNode) tree.getSelectedNode().upToReferenceContainerNode(request.getReferenceType()); - - // get shared ancestor of two parents - NavigationNode parentContainerNode = oldParentNode.upToReferenceContainerNode(request.getParentReferenceType()); - - // get new parent node - ContentListUINavigationNode newParentNode = MoveTreeAdapter.getNewParentNode(request, parentContainerNode); + public ActivitySampleUIMoveTreeAdapterToTrip(ActivitySampleUINavigationNode incomingNode) { + super(incomingNode, e -> incomingNode.getParent()); + } - // update it - newParentNode.addChildren(ids); - // clean old paren node - MoveTreeAdapter.cleanOldParentNode(tree, ids, oldParentNode); + @Override + public SampleListUINavigationNode getNewParentNode(ActivityUINavigationNode oldParentNode, String newParentId) { + return oldParentNode.getParent().getParent().getSampleListUINavigationNode(); + } - MoveTreeAdapter.doFinalSelect(request, tree, oldParentNode, newParentNode); + @Override + public SampleUINavigationNode addMissingChildren(SampleListUINavigationNode newParentNode) { + return newParentNode.addMissingChildren(); } + @Override + public void removeChildren(ActivityUINavigationNode oldParentNode, Set<String> ids) { + oldParentNode.getActivitySampleUINavigationNode().removeFromParent(); + } -} \ No newline at end of file +} ===================================== client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/sample/SampleUIHelper.java ===================================== @@ -25,6 +25,11 @@ package fr.ird.observe.client.datasource.editor.ll.data.logbook.sample; import fr.ird.observe.client.ClientUIContext; import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequest; import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequestBuilder; +import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveTreeAdapter; +import fr.ird.observe.client.datasource.editor.ll.data.logbook.ActivitySampleUI; +import fr.ird.observe.client.datasource.editor.ll.data.logbook.SampleListUI; +import fr.ird.observe.client.datasource.editor.ll.data.logbook.SampleUI; +import fr.ird.observe.client.datasource.editor.ll.data.logbook.SampleUIMoveTreeAdapter; import fr.ird.observe.dto.data.TripAware; import fr.ird.observe.dto.data.ll.common.TripReference; import fr.ird.observe.dto.data.ll.logbook.ActivityReference; @@ -32,6 +37,7 @@ import fr.ird.observe.services.ObserveServicesProvider; import io.ultreia.java4all.i18n.I18n; import javax.swing.JOptionPane; +import java.util.function.Function; import java.util.function.Supplier; /** @@ -46,10 +52,6 @@ public class SampleUIHelper { return TripAware.class.isAssignableFrom(request.getParentTargetReferenceType()); } - public static boolean fromTrip(MoveRequest request) { - return TripAware.class.isAssignableFrom(request.getParentReferenceType()); - } - public static Boolean movetoTrip() { int response = ClientUIContext.askUser( I18n.t("observe.data.ll.logbook.Sample.action.move.choose.parent.target.title"), @@ -88,4 +90,22 @@ public class SampleUIHelper { .setParentCandidates(servicesProvider.getLlLogbookActivityService()::getChildren); }; } + + public static Function<MoveRequest, ? extends MoveTreeAdapter<?, ?, ?>> create(ActivitySampleUI ui) { + return r -> toTrip(r) + ? new ActivitySampleUIMoveTreeAdapterToTrip(ui.getModel().getSource()) + : new ActivitySampleUIMoveTreeAdapter(ui.getModel().getSource()); + } + + public static Function<MoveRequest, ? extends MoveTreeAdapter<?, ?, ?>> create(SampleListUI ui) { + return r -> toTrip(r) + ? new SampleUIMoveTreeAdapter(ui.getModel().getSource()) + : new SampleUIMoveTreeAdapterToActivity(ui.getModel().getSource()); + } + + public static Function<MoveRequest, ? extends MoveTreeAdapter<?, ?, ?>> create(SampleUI ui) { + return r -> toTrip(r) + ? new SampleUIMoveTreeAdapter(ui.getModel().getSource()) + : new SampleUIMoveTreeAdapterToActivity(ui.getModel().getSource()); + } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/DefaultSingleMoveTreeAdapter.java → client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/data/logbook/sample/SampleUIMoveTreeAdapterToActivity.java ===================================== @@ -1,8 +1,8 @@ -package fr.ird.observe.client.datasource.editor.api.content.actions.move.tree; +package fr.ird.observe.client.datasource.editor.ll.data.logbook.sample; /*- * #%L - * ObServe Client :: DataSource :: Editor :: API + * ObServe Client :: DataSource :: Editor :: LL * %% * Copyright (C) 2008 - 2021 IRD, Code Lutin, Ultreia.io * %% @@ -22,48 +22,44 @@ package fr.ird.observe.client.datasource.editor.api.content.actions.move.tree; * #L% */ -import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequest; -import fr.ird.observe.client.datasource.editor.api.content.data.list.ContentListUINavigationNode; -import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree; -import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; -import fr.ird.observe.dto.reference.DtoReference; +import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveTreeAdapter; +import fr.ird.observe.client.datasource.editor.ll.data.logbook.ActivitySampleUINavigationNode; +import fr.ird.observe.client.datasource.editor.ll.data.logbook.ActivityUINavigationNode; +import fr.ird.observe.client.datasource.editor.ll.data.logbook.SampleListUINavigationNode; +import fr.ird.observe.client.datasource.editor.ll.data.logbook.SampleUINavigationNode; +import fr.ird.observe.dto.data.ll.logbook.ActivitySampleReference; + +import java.util.Set; /** - * Created on 15/10/2020. + * Created on 12/02/2021. * * @author Tony Chemit - dev@tchemit.fr - * @since 8.0.1 + * @since 8.0.6 */ -public class DefaultSingleMoveTreeAdapter implements MoveTreeAdapter { - - @Override - public void adaptTree(MoveRequest request, NavigationTree tree) { - String id = request.getId(); - - Class<? extends DtoReference> parentReferenceType = request.getParentTargetReferenceType(); - - Class<? extends DtoReference> referenceType = request.getReferenceType(); - - // get old parent node - ContentListUINavigationNode oldParentNode = (ContentListUINavigationNode) tree.getSelectedNode().upToReferenceContainerNode(referenceType); - - // get shared ancestor of two parents - NavigationNode parentContainerNode = oldParentNode.upToReferenceContainerNode(parentReferenceType); - - // dow to new parent node - ContentListUINavigationNode newParentNode = MoveTreeAdapter.getNewParentNode(request, parentContainerNode); +public class SampleUIMoveTreeAdapterToActivity extends MoveTreeAdapter<SampleListUINavigationNode, ActivityUINavigationNode, ActivitySampleUINavigationNode> { - // down to new child container node - ContentListUINavigationNode newChildContainerNode = (ContentListUINavigationNode) newParentNode.downToReferenceContainerNode(referenceType); + public SampleUIMoveTreeAdapterToActivity(SampleListUINavigationNode incomingNode) { + super(incomingNode, e -> incomingNode); + } - // update it - NavigationNode node = newChildContainerNode.addChildren(id); + public SampleUIMoveTreeAdapterToActivity(SampleUINavigationNode incomingNode) { + super(incomingNode, e -> incomingNode.getParent()); + } - // clean old paren node - MoveTreeAdapter.cleanOldParentNode(tree, request.getIds(), oldParentNode); + @Override + public ActivityUINavigationNode getNewParentNode(SampleListUINavigationNode oldParentNode, String newParentId) { + return oldParentNode.getParent().getLogbookActivityListUINavigationNode().getActivityUINavigationNode(newParentId); + } - node.getParent().refreshToRoot(); + @Override + public ActivitySampleUINavigationNode addMissingChildren(ActivityUINavigationNode newParentNode) { + ActivitySampleReference reference = newParentNode.getReference().getActivitySample(); + return newParentNode.addActivitySampleUINavigationNode(reference); + } - MoveTreeAdapter.doFinalSelect(request, tree, oldParentNode, node); + @Override + public void removeChildren(SampleListUINavigationNode oldParentNode, Set<String> ids) { + oldParentNode.removeChildren(ids); } } ===================================== client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/GenerateContentUISupport.java ===================================== @@ -149,20 +149,21 @@ public abstract class GenerateContentUISupport extends GenerateJavaFileSupport { protected final boolean alwaysGenerateConcreteFile() { return !getClass().getSimpleName().endsWith("ContentEditUIModel") && !getClass().getSimpleName().endsWith("EditUIHandler") + && !getClass().getSimpleName().endsWith("EditUIModelStates") && !getClass().getSimpleName().endsWith("OpenableUIHandler") + && !getClass().getSimpleName().endsWith("OpenableUIMoveTreeAdapter") + && !getClass().getSimpleName().endsWith("OpenableUIModelStates") && !getClass().getSimpleName().endsWith("ListUIHandler") + && !getClass().getSimpleName().endsWith("ListUINavigationCapability") +// && !getClass().getSimpleName().endsWith("ListUINavigationHandler") && !getClass().getSimpleName().endsWith("SimpleUIHandler") - && !getClass().getSimpleName().endsWith("TableUIHandler") + && !getClass().getSimpleName().endsWith("SimpleUIModelStates") && !getClass().getSimpleName().endsWith("NavigationScope") && !getClass().getSimpleName().endsWith("NavigationHandler") -// && !getClass().getSimpleName().endsWith("ListUINavigationHandler") - && !getClass().getSimpleName().endsWith("ListUINavigationCapability") // && !getClass().getSimpleName().endsWith("TableUINavigationContext") + && !getClass().getSimpleName().endsWith("TableUIHandler") && !getClass().getSimpleName().endsWith("TableUITableModel") && !getClass().getSimpleName().endsWith("TableUIModelStates") - && !getClass().getSimpleName().endsWith("EditUIModelStates") - && !getClass().getSimpleName().endsWith("OpenableUIModelStates") - && !getClass().getSimpleName().endsWith("SimpleUIModelStates") ; } ===================================== client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/data/list/GenerateContentListUINavigationNode.java ===================================== @@ -29,6 +29,7 @@ import fr.ird.observe.client.datasource.editor.spi.content.helper.ContentUINavig import java.nio.file.Path; import java.util.LinkedList; import java.util.List; +import java.util.Set; /** * Created on 06/11/2020. @@ -38,6 +39,17 @@ import java.util.List; */ public class GenerateContentListUINavigationNode extends GenerateContentListUISupport { + public static final String REMOVE_CHILDREN = "" + + " @Override\n" + + " public void removeChildren(Set<String> ids) {\n" + + " if (getChildCount() == ids.size() && !getParent().getInitializer().getConfig().isLoadEmptyProgram()) {\n" + + " // limit case : node will be empty, must remove it\n" + + " removeFromParent();\n" + + " return;\n" + + " }\n" + + " super.removeChildren(ids);\n" + + " }\n\n"; + @Override protected String generateConcreteContent(Path path, String packageName, String namePrefix) { List<String> imports = new LinkedList<>(); @@ -51,6 +63,13 @@ public class GenerateContentListUINavigationNode extends GenerateContentListUISu context += ContentUINavigationContextHelper.generateGetReferences(imports, referenceType); context += ContentUINavigationContextHelper.generateGetParentReference(imports, parentReferenceType); context += ContentUINavigationContextHelper.generateGetOpenableServiceSpi(imports, dtoType, referenceType, serviceType); + context += ContentUINavigationContextHelper.generateGetSibling(imports, cleanClassName); + context += ContentUINavigationContextHelper.generateGetParentSibling(imports, cleanClassName); + imports.add(Set.class.getName()); + context += ContentUINavigationContextHelper.generateAddChildren(imports, dtoNamePrefix); + if (scopeBuilder.editNode.getParent().isRoot()) { + context += REMOVE_CHILDREN; + } return uiNavigationNodeHelper.generateContent(imports, context); } ===================================== client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/data/openable/ContentOpenableUIDescriptor.java ===================================== @@ -75,6 +75,7 @@ public class ContentOpenableUIDescriptor implements ContentUIDescriptor { GenerateContentOpenableUINavigationNode.class, GenerateContentOpenableUINavigationScope.class, GenerateContentOpenableUIHandler.class, + GenerateContentOpenableUIMoveTreeAdapter.class, GenerateContentOpenableUIModelStates.class ); } ===================================== client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/data/openable/GenerateContentOpenableUIMoveTreeAdapter.java ===================================== @@ -0,0 +1,102 @@ +package fr.ird.observe.client.datasource.editor.spi.content.data.openable; + +/*- + * #%L + * ObServe Client :: DataSource :: Editor :: SPI + * %% + * Copyright (C) 2008 - 2021 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequest; +import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveTreeAdapter; + +import java.nio.file.Path; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.function.Function; + +/** + * Created on 13/02/2021. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 8.0.6 + */ +public class GenerateContentOpenableUIMoveTreeAdapter extends GenerateContentOpenableUISupport { + + public static final String GENERATED_CONTENT = "" + + "public abstract class Generated%1$sUIMoveTreeAdapter extends MoveTreeAdapter<%1$sListUINavigationNode, %1$sListUINavigationNode, %1$sUINavigationNode> {\n" + + "\n" + + " public static Function<MoveRequest, %1$sUIMoveTreeAdapter> create(%1$sListUI ui) {\n" + + " return r -> new %1$sUIMoveTreeAdapter(ui.getModel().getSource());\n" + + " }\n" + + "\n" + + " public static Function<MoveRequest, %1$sUIMoveTreeAdapter> create(%1$sUI ui) {\n" + + " return r -> new %1$sUIMoveTreeAdapter(ui.getModel().getSource());\n" + + " }\n\n" + + " public Generated%1$sUIMoveTreeAdapter(%1$sListUINavigationNode incomingNode) {\n" + + " super(incomingNode, e -> incomingNode);\n" + + " }\n\n" + + " public Generated%1$sUIMoveTreeAdapter(%1$sUINavigationNode incomingNode) {\n" + + " super(incomingNode, e -> incomingNode.getParent());\n" + + " }\n\n" + + " @Override\n" + + " public %1$sListUINavigationNode getNewParentNode(%1$sListUINavigationNode oldParentNode, String newParentId) {\n" + + " return oldParentNode.%2$s(newParentId);\n" + + " }\n" + + "\n" + + " @Override\n" + + " public %1$sUINavigationNode addMissingChildren(%1$sListUINavigationNode newParentNode) {\n" + + " return newParentNode.addMissingChildren();\n" + + " }\n" + + "\n" + + " @Override\n" + + " public void removeChildren(%1$sListUINavigationNode oldParentNode, Set<String> ids) {\n" + + " oldParentNode.removeChildren(ids);\n" + + " }\n" + + "}\n"; + public static final String CONTENT = "" + + "public class %1$sUIMoveTreeAdapter extends Generated%1$sUIMoveTreeAdapter {\n\n" + + " public %1$sUIMoveTreeAdapter(%1$sListUINavigationNode incomingNode) {\n" + + " super(incomingNode);\n" + + " }\n\n" + + " public %1$sUIMoveTreeAdapter(%1$sUINavigationNode incomingNode) {\n" + + " super(incomingNode);\n" + + " }\n\n" + + "}\n"; + + @Override + protected String generateAbstractContent0(Path sourceDirectory, Path targetDirectory, Path path, String packageName, String namePrefix) { + List<String> imports = new LinkedList<>(); + imports.add(Set.class.getName()); + imports.add(MoveTreeAdapter.class.getName()); + imports.add(MoveRequest.class.getName()); + imports.add(Function.class.getName()); + String siblingMethod = "findParentSibling"; + if (scopeBuilder.selectNode.getParent().isRoot()) { + siblingMethod = "findSibling"; + } + return generate(GENERATED_CONTENT, imports, dtoNamePrefix, siblingMethod); + } + + @Override + protected String generateConcreteContent(Path path, String packageName, String namePrefix) { + List<String> imports = new LinkedList<>(); + return generate(CONTENT, imports, dtoNamePrefix); + } +} ===================================== client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/data/openable/GenerateContentOpenableUINavigationNode.java ===================================== @@ -51,6 +51,8 @@ public class GenerateContentOpenableUINavigationNode extends GenerateContentOpen context += ContentUINavigationContextHelper.generateGetReference(imports, referenceType); context += ContentUINavigationContextHelper.generateGetParentReference(imports, parentReferenceType); context += ContentUINavigationContextHelper.generateGetOpenableServiceSpi(imports, dtoType, referenceType, serviceType); + context += ContentUINavigationContextHelper.generateGetSibling(imports, cleanClassName); + context += ContentUINavigationContextHelper.generateGetParentSibling(imports, cleanClassName); return uiNavigationNodeHelper.generateContent(imports, context); } ===================================== client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/helper/ContentUIHandlerHelper.java ===================================== @@ -23,13 +23,13 @@ package fr.ird.observe.client.datasource.editor.spi.content.helper; */ import fr.ird.observe.client.datasource.editor.api.content.actions.create.CreateNewOpenableUI; +import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveAction; +import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequestBuilder; import fr.ird.observe.client.datasource.editor.api.content.actions.save.SaveAction; import fr.ird.observe.client.datasource.editor.api.content.data.edit.actions.DeleteEdit; import fr.ird.observe.client.datasource.editor.api.content.data.edit.actions.SaveContentEditUIAdapter; import fr.ird.observe.client.datasource.editor.api.content.data.list.actions.DeleteMultiple; -import fr.ird.observe.client.datasource.editor.api.content.data.list.actions.MoveMultiple; import fr.ird.observe.client.datasource.editor.api.content.data.open.actions.DeleteOpenable; -import fr.ird.observe.client.datasource.editor.api.content.data.open.actions.MoveOpenable; import fr.ird.observe.client.datasource.editor.api.content.data.open.actions.SaveContentOpenableUIAdapter; import fr.ird.observe.client.datasource.editor.api.content.data.simple.actions.SaveContentSimpleUIAdapter; import fr.ird.observe.client.datasource.editor.api.content.data.table.actions.SaveContentTableUIAdapter; @@ -72,7 +72,12 @@ public class ContentUIHandlerHelper extends ContentUIHelperSupport { public static final String INSTALL_MOVE_SIMPLE_ACTION = "" + " @Override\n" + " protected void installMoveAction() {\n" + - " MoveOpenable.installAction(ui, %1$s()::%2$s, r -> %3$s()::move);\n" + + " MoveAction\n" + + " .create(ui)\n" + + " .on(() -> MoveRequestBuilder.create(ui.getModel()).setParentCandidates(%1$s()::%2$s))\n" + + " .move(r -> %3$s()::move)\n" + + " .then(%4$sMoveTreeAdapter::create)\n" + + " .install(ui::getMove);\n" + " }\n\n"; public static final String INSTALL_DELETE_SIMPLE_ACTION = "" + " @Override\n" + @@ -82,7 +87,12 @@ public class ContentUIHandlerHelper extends ContentUIHelperSupport { public static final String INSTALL_MOVE_ACTION = "" + " @Override\n" + " protected void installMoveAction() {\n" + - " MoveMultiple.installMoveAction(ui, %1$s()::%2$s, r -> %3$s()::move);\n" + + " MoveAction\n" + + " .create(ui)\n" + + " .on(() -> MoveRequestBuilder.create(ui.getModel()).setParentCandidates(%1$s()::%2$s))\n" + + " .move(r -> %3$s()::move)\n" + + " .then(%4$sMoveTreeAdapter::create)\n" + + " .install(ui::getMove);\n" + " }\n\n"; public static final String INSTALL_DELETE_ACTION = "" + " @Override\n" + @@ -97,7 +107,8 @@ public class ContentUIHandlerHelper extends ContentUIHelperSupport { public static final String INSTALL_SAVE_ACTION_METHOD = "" + " @Override\n" + " protected void installSaveAction() {\n" + - " SaveAction.create(ui, %1$s.class)\n" + + " SaveAction\n" + + " .create(ui, %1$s.class)\n" + " .on(ui.getModel().getStates()::toSaveRequest)\n" + " .save((r, d) -> %2$s)\n" + " .then(new %3$s<>())\n" + @@ -169,8 +180,6 @@ public class ContentUIHandlerHelper extends ContentUIHelperSupport { adapterType = SaveContentEditUIAdapter.class; serviceCall += "().save(r.getParentId(), d)"; break; - case REFERENTIAL: - return ""; case OPEN: dtoType = generator.scopeBuilder.dtoType; adapterType = SaveContentOpenableUIAdapter.class; @@ -240,14 +249,15 @@ public class ContentUIHandlerHelper extends ContentUIHelperSupport { } if (extraType == null) { if (editNode != null && selectNode != null && selectNode.getType().equals(editNode.getType())) { - imports.add(MoveOpenable.class.getName()); + imports.add(MoveAction.class.getName()); + imports.add(MoveRequestBuilder.class.getName()); String methodName = "getBrothers"; if (editNode.getLevel() == 1) { methodName = "getParentBrothers"; } imports.add(CreateNewOpenableUI.class.getName()); - extraMethods += String.format(INSTALL_MOVE_SIMPLE_ACTION, serviceParentMethod, methodName, serviceMethod); + extraMethods += String.format(INSTALL_MOVE_SIMPLE_ACTION, serviceParentMethod, methodName, serviceMethod, generator.cleanClassName); } Class<?> deleteActionType = null; switch (generator.getDescriptor().getContentNodeType()) { @@ -275,7 +285,8 @@ public class ContentUIHandlerHelper extends ContentUIHelperSupport { String helperName = StringUtils.capitalize(editNode.getModule().getName().toLowerCase()) + "TripActionHelper"; imports.add(generator.packageName.substring(0, generator.packageName.lastIndexOf(".") + 1) + helperName); imports.add(DeleteMultiple.class.getName()); - imports.add(MoveMultiple.class.getName()); + imports.add(MoveAction.class.getName()); + imports.add(MoveRequestBuilder.class.getName()); imports.add(CreateNewOpenableUI.class.getName()); if (editNode.getLevel() == 1) { extraMethods += String.format(ON_END_OPEN_UI, helperName); @@ -283,7 +294,7 @@ public class ContentUIHandlerHelper extends ContentUIHelperSupport { } extraMethods += generateListCreateNewAction(imports, generator); - extraMethods += String.format(INSTALL_MOVE_ACTION, serviceParentMethod, methodName, serviceMethod); + extraMethods += String.format(INSTALL_MOVE_ACTION, serviceParentMethod, methodName, serviceMethod, generator.cleanClassName.replace("List", "")); extraMethods += String.format(INSTALL_DELETE_ACTION, serviceMethod); return generate(ContentUIHandlerHelper.UI_HANDLER_GENERATED2, imports, generator.cleanClassName, uiHandler, dtoType, extraType, extraMethods); } ===================================== client/datasource/editor/spi/src/main/java/fr/ird/observe/client/datasource/editor/spi/content/helper/ContentUINavigationContextHelper.java ===================================== @@ -82,6 +82,21 @@ public class ContentUINavigationContextHelper extends ContentUIHelperSupport { " public final %1$s get%2$s() {\n" + " return (%1$s) super.get%2$s();\n" + " }\n\n"; + public static final String GET_SIBLING = "" + + " @Override\n" + + " public %1$sNavigationNode findSibling(String siblingId) {\n" + + " return (%1$sNavigationNode) super.findSibling(siblingId);\n" + + " }\n\n"; + public static final String GET_PARENT_SIBLING = "" + + " @Override\n" + + " public %1$sNavigationNode findParentSibling(String siblingId) {\n" + + " return (%1$sNavigationNode) super.findParentSibling(siblingId);\n" + + " }\n\n"; + public static final String ADD_CHILDREN = "" + + " @Override\n" + + " public %1$sUINavigationNode addMissingChildren() {\n" + + " return (%1$sUINavigationNode) super.addMissingChildren();\n" + + " }\n\n"; public static String generateGetReference(List<String> imports, Class<?> referenceType) { imports.add(referenceType.getName()); @@ -99,6 +114,21 @@ public class ContentUINavigationContextHelper extends ContentUIHelperSupport { return String.format(GET_REFERENCE, referenceType.getSimpleName(), "ParentReference"); } + public static String generateAddChildren(List<String> imports, String name) { + imports.add(OpenableDtoServiceContext.class.getName()); + return String.format(ADD_CHILDREN, name); + } + + public static String generateGetSibling(List<String> imports, String name) { + imports.add(OpenableDtoServiceContext.class.getName()); + return String.format(GET_SIBLING, name); + } + + public static String generateGetParentSibling(List<String> imports, String name) { + imports.add(OpenableDtoServiceContext.class.getName()); + return String.format(GET_PARENT_SIBLING, name); + } + public static String generateGetOpenableServiceSpi(List<String> imports, Class<?> dtoType, Class<?> referenceType, Class<?> serviceType) { imports.add(dtoType.getName()); imports.add(referenceType.getName()); View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/71da0962713044ece2fa66112c... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/71da0962713044ece2fa66112c... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT