mailman.cloud.codelutin.com
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

Observe-commits

Thread Start a new thread
Download
Threads by month
  • ----- 2026 -----
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2025 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2021 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2020 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2019 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2018 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2017 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2016 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2015 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2014 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2013 -----
  • December
  • November
  • October
  • September
observe-commits@list.forge.codelutin.com

February 2021

  • 1 participants
  • 72 discussions
[Git][ultreiaio/ird-observe][develop] Review Move API and generate most of it. - See #1787
by Tony CHEMIT 13 Feb '21

13 Feb '21
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(a)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(a)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(a)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(a)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(a)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(a)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(a)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(a)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(a)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/71da0962713044ece2fa66112… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/71da0962713044ece2fa66112… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] Revoir l'ordre des actions dans la popup **Actions** - Closes #1788
by Tony CHEMIT 11 Feb '21

11 Feb '21
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 5b045f48 by Tony Chemit at 2021-02-11T21:54:08+01:00 Revoir l&#39;ordre des actions dans la popup **Actions** - Closes #1788 - - - - - 24 changed files: - client/datasource/editor/api/src/main/i18n/getters/java.getter - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/ObserveKeyStrokesEditorApi.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/ConfigureMenuAction.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/id/ChangeId.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/id/ShowTechnicalInformations.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveRequestBuilder.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/data/list/ContentListUI.jaxx - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUIHandler.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/ContentOpenableUI.jaxx - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/open/ContentOpenableUI.jcss - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/open/ContentOpenableUIHandler.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/content/referential/ContentReferentialUIHandler.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/actions/ShowUniqueKeysReferential.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/actions/ShowUsagesReferential.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/ContentUIMenuAction.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/NavigationTreeShowPopupHandler.java - client/datasource/editor/api/src/main/resources/fr/ird/observe/client/datasource/editor/api/content/data/list/CommonContentListUI.jcss - client/datasource/editor/api/src/main/resources/fr/ird/observe/client/datasource/editor/api/content/data/open/CommonContentOpenableUI.jcss - client/i18n/src/main/i18n/translations/observe_en_GB.properties - client/i18n/src/main/i18n/translations/observe_es_ES.properties - client/i18n/src/main/i18n/translations/observe_fr_FR.properties Changes: ===================================== client/datasource/editor/api/src/main/i18n/getters/java.getter ===================================== @@ -190,10 +190,10 @@ observe.ui.action.test.remote observe.ui.action.test.remote.tip observe.ui.action.test.server observe.ui.action.test.server.tip -observe.ui.choice.apply observe.ui.choice.cancel observe.ui.choice.cancel.tip observe.ui.choice.confirm.delete +observe.ui.choice.confirm.move observe.ui.choice.confirm.replace observe.ui.choice.continue observe.ui.choice.doNotSave ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/ObserveKeyStrokesEditorApi.java ===================================== @@ -65,8 +65,13 @@ public class ObserveKeyStrokesEditorApi extends ObserveKeyStrokesSupport { public static final KeyStroke KEY_STROKE_RESET_DATA = KeyStroke.getKeyStroke("pressed F4"); public static final KeyStroke KEY_STROKE_SAVE_DATA = KeyStroke.getKeyStroke("pressed F5"); public static final KeyStroke KEY_STROKE_DELETE_DATA_GLOBAL = KeyStroke.getKeyStroke("pressed F6"); + public static final KeyStroke KEY_STROKE_MOVE = KeyStroke.getKeyStroke("pressed F7"); public static final KeyStroke KEY_STROKE_DUPLICATE = KeyStroke.getKeyStroke("pressed F7"); public static final KeyStroke KEY_STROKE_GENERATE = KeyStroke.getKeyStroke("pressed F9"); + public static final KeyStroke KEY_STROKE_CHANGE_ID = KeyStroke.getKeyStroke("pressed F9"); + public static final KeyStroke KEY_STROKE_SHOW_TECHNICAL_INFORMATIONS = KeyStroke.getKeyStroke("pressed F10"); + public static final KeyStroke KEY_STROKE_SHOW_USAGES = KeyStroke.getKeyStroke("pressed F11"); + public static final KeyStroke KEY_STROKE_SHOW_UNIQUE_KEYS = KeyStroke.getKeyStroke("pressed F12"); public static final KeyStroke KEY_STROKE_COPY_VALUES_AND_SAVE = KeyStroke.getKeyStroke("ctrl pressed T"); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/ConfigureMenuAction.java ===================================== @@ -26,6 +26,7 @@ import fr.ird.observe.client.datasource.editor.api.content.ContentUI; import org.nuiton.jaxx.runtime.swing.action.MenuAction; import javax.swing.JPopupMenu; +import javax.swing.KeyStroke; /** * Created on 25/11/2020. @@ -41,4 +42,12 @@ public interface ConfigureMenuAction<U extends ContentUI> extends MenuAction { default JPopupMenu getPopupMenu() { return getUi().getConfigurePopup(); } + + @Override + default KeyStroke getMenuKeyStroke() { + // always use the given key-stroke to avoid change between two content + // a same such action is unique on a form, so can be determine once for all + return (KeyStroke) getValue(ACCELERATOR_KEY); + } + } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/id/ChangeId.java ===================================== @@ -24,6 +24,7 @@ package fr.ird.observe.client.datasource.editor.api.content.actions.id; import com.google.common.collect.ImmutableSet; import fr.ird.observe.client.datasource.api.ObserveSwingDataSource; +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.ContentUIActionSupport; @@ -92,7 +93,7 @@ public class ChangeId<U extends ContentUI> extends ContentUIActionSupport<U> imp } public ChangeId(ChangeIdRequest request, ChangeIdExecutor executor) { - super(t("observe.common.ReferentialDto.action.changeId.tip"), t("observe.common.ReferentialDto.action.changeId.tip"), "changeId", null); + super(t("observe.common.ReferentialDto.action.changeId.tip"), t("observe.common.ReferentialDto.action.changeId.tip"), "changeId", ObserveKeyStrokesEditorApi.KEY_STROKE_CHANGE_ID); this.request = Objects.requireNonNull(request); this.executor = Objects.requireNonNull(executor); } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/id/ShowTechnicalInformations.java ===================================== @@ -22,6 +22,7 @@ package fr.ird.observe.client.datasource.editor.api.content.actions.id; * #L% */ +import fr.ird.observe.client.datasource.editor.api.ObserveKeyStrokesEditorApi; import fr.ird.observe.client.datasource.editor.api.content.ContentMode; import fr.ird.observe.client.datasource.editor.api.content.ContentUI; import fr.ird.observe.client.datasource.editor.api.content.actions.ConfigureMenuAction; @@ -110,7 +111,7 @@ public class ShowTechnicalInformations<U extends ContentUI> extends ContentUIAct public ShowTechnicalInformations(ShowIdRequest request, ShowIdExecutor executor) { super(n("observe.ui.action.show.technical.information.tip"), n("observe.ui.action.show.technical.information.tip"), - "show-information", null); + "show-information", ObserveKeyStrokesEditorApi.KEY_STROKE_SHOW_TECHNICAL_INFORMATIONS); this.request = Objects.requireNonNull(request); this.executor = Objects.requireNonNull(executor); } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveRequestBuilder.java ===================================== @@ -188,8 +188,8 @@ public class MoveRequestBuilder { selectTargetAction.putValue(Action.ACCELERATOR_KEY, keyStroke); selectTargetAction.putValue(Action.NAME, t); selectTarget.setFocusable(false); - keyStroke = ObserveKeyStrokesEditorApi.KEY_STROKE_APPLY; - t = ObserveKeyStrokesEditorApi.suffixTextWithKeyStroke(t("observe.ui.choice.apply"), keyStroke); + keyStroke = ObserveKeyStrokesEditorApi.KEY_STROKE_MOVE; + t = ObserveKeyStrokesEditorApi.suffixTextWithKeyStroke(t("observe.ui.choice.confirm.move"), keyStroke); applyAction = new AbstractAction() { @Override @@ -200,7 +200,6 @@ public class MoveRequestBuilder { }; applyAction.putValue(Action.ACCELERATOR_KEY, keyStroke); applyAction.putValue(Action.NAME, t); -// selectTarget.setAction(selectTargetAction); } public MoveRequestBuilder setParentTargetReferenceType(Class<? extends DtoReference> parentTargetReferenceType) { @@ -296,7 +295,7 @@ public class MoveRequestBuilder { JLayeredPane parent = (JLayeredPane) optionPane.getParent().getParent(); - InputMap inputMap = parent.getRootPane().getInputMap(2); + InputMap inputMap = parent.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); inputMap.put(KeyStroke.getKeyStroke("pressed ENTER"), "none"); inputMap.put(KeyStroke.getKeyStroke("ctrl pressed ENTER"), "none"); @@ -305,6 +304,7 @@ public class MoveRequestBuilder { } }; jButton = UsageUIHandlerSupport.findButton(optionPane, continueActionText); + jButton.setIcon(UIHelper.getUIManagerActionIcon("move")); Objects.requireNonNull(jButton); jButton.setEnabled(false); editor.getModel().addPropertyChangeListener("selectedItem", evt -> jButton.setEnabled(evt.getNewValue() != null)); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/edit/actions/MoveEdit.java ===================================== @@ -23,6 +23,7 @@ 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.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; @@ -56,7 +57,7 @@ public final class MoveEdit<D extends EditableDto, U extends ContentEditUI<D, U> } protected MoveEdit(Class<D> dataType, MoveExecutor executor) { - super(dataType, null, null, "move", null); + super(dataType, null, null, "move", ObserveKeyStrokesEditorApi.KEY_STROKE_MOVE); this.executor = executor; setText(ContentOpenableUII18nHelper.getActionMove(getDataType())); setTooltipText(ContentOpenableUII18nHelper.getActionMove(getDataType())); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUI.jaxx ===================================== @@ -80,6 +80,6 @@ public abstract ContentListUIHandler<D, R, U> getHandler(); </row> </Table> + <JMenuItem id='move'/> <JMenuItem id='showTechnicalInformations'/> - <JMenuItem id='move' styleClass="ifOpen"/> </fr.ird.observe.client.datasource.editor.api.content.ContentUI> ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUIHandler.java ===================================== @@ -139,9 +139,9 @@ public abstract class ContentListUIHandler<D extends DataDto, R extends DataDtoR GotoOpenData.installAction(ui); GotoSelectedData.installAction(ui); installDeleteAction(); - ShowTechnicalInformations.installAction(ui); installCreateNewAction(); installMoveAction(); + ShowTechnicalInformations.installAction(ui); } @Override ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/actions/MoveMultiple.java ===================================== @@ -23,6 +23,7 @@ package fr.ird.observe.client.datasource.editor.api.content.data.list.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.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; @@ -62,7 +63,7 @@ public final class MoveMultiple<D extends DataDto, R extends DataDtoReference, U } protected MoveMultiple(Class<D> dataType, MoveExecutor executor) { - super(dataType, null, null, "move", null); + super(dataType, null, null, "move", ObserveKeyStrokesEditorApi.KEY_STROKE_MOVE); this.executor = executor; setText(ContentListUII18nHelper.getActionMove(getDataType())); setTooltipText(ContentListUII18nHelper.getActionMoveTip(getDataType())); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/open/ContentOpenableUI.jaxx ===================================== @@ -70,7 +70,7 @@ public void resetEdit() { </cell> </row> </Table> + <JMenuItem id='move'/> <JMenuItem id='showTechnicalInformations'/> - <JMenuItem id='move' styleClass="ifOpen"/> </fr.ird.observe.client.datasource.editor.api.content.ContentUI> ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/open/ContentOpenableUI.jcss ===================================== @@ -44,7 +44,11 @@ } #delete { - visible:{states.isUpdatingMode()}; + /*visible:{states.isUpdatingMode()};*/ + enabled:{!states.isModified()}; +} + +#move { enabled:{!states.isModified()}; } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/open/ContentOpenableUIHandler.java ===================================== @@ -95,8 +95,8 @@ public abstract class ContentOpenableUIHandler<D extends OpenableDto, U extends installCreateNewAction(); installResetAction(); installSaveAction(); - installMoveAction(); installDeleteAction(); + installMoveAction(); ShowTechnicalInformations.installAction(ui); } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/open/actions/MoveOpenable.java ===================================== @@ -23,6 +23,7 @@ package fr.ird.observe.client.datasource.editor.api.content.data.open.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.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; @@ -63,7 +64,7 @@ public final class MoveOpenable<D extends OpenableDto, U extends ContentOpenable } protected MoveOpenable(Class<D> dataType, MoveExecutor executor) { - super(dataType, null, null, "move", null); + super(dataType, null, null, "move", ObserveKeyStrokesEditorApi.KEY_STROKE_MOVE); this.executor = executor; setText(ContentOpenableUII18nHelper.getActionMove(getDataType())); setTooltipText(ContentOpenableUII18nHelper.getActionMove(getDataType())); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/ContentReferentialUIHandler.java ===================================== @@ -135,10 +135,10 @@ public class ContentReferentialUIHandler<D extends ReferentialDto, R extends Ref BackToListReferential.installAction(ui); DetailReferential.installAction(ui); DeleteReferential.installAction(ui); + ChangeId.installAction(ui); ShowTechnicalInformations.installAction(ui); - ShowUniqueKeysReferential.installAction(ui); ShowUsagesReferential.installAction(ui); - ChangeId.installAction(ui); + ShowUniqueKeysReferential.installAction(ui); installCreateAction(); installModifyAction(); installSaveAction(); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/actions/ShowUniqueKeysReferential.java ===================================== @@ -22,6 +22,7 @@ package fr.ird.observe.client.datasource.editor.api.content.referential.actions; * #L% */ +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.referential.ContentReferentialUI; import fr.ird.observe.client.datasource.editor.api.content.referential.ContentReferentialUII18nHelper; @@ -67,7 +68,7 @@ public final class ShowUniqueKeysReferential<D extends ReferentialDto, R extends } public ShowUniqueKeysReferential(Class<D> dataType) { - super(dataType, t("observe.referential.Referential.action.show.unique.keys.tip"), t("observe.referential.Referential.action.show.unique.keys.tip"), "show-keys", null); + super(dataType, t("observe.referential.Referential.action.show.unique.keys.tip"), t("observe.referential.Referential.action.show.unique.keys.tip"), "show-keys", ObserveKeyStrokesEditorApi.KEY_STROKE_SHOW_UNIQUE_KEYS); } @Override ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/referential/actions/ShowUsagesReferential.java ===================================== @@ -23,6 +23,7 @@ package fr.ird.observe.client.datasource.editor.api.content.referential.actions; */ import fr.ird.observe.client.ClientUIContext; +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.referential.ContentReferentialUI; import fr.ird.observe.client.datasource.editor.api.content.referential.ContentReferentialUIModel; @@ -53,7 +54,7 @@ public final class ShowUsagesReferential<D extends ReferentialDto, R extends Ref } public ShowUsagesReferential(Class<D> dataType) { - super(dataType, t("observe.referential.Referential.action.show.usages.tip"), t("observe.referential.Referential.action.show.usages.tip"), "show-usages", null); + super(dataType, t("observe.referential.Referential.action.show.usages.tip"), t("observe.referential.Referential.action.show.usages.tip"), "show-usages", ObserveKeyStrokesEditorApi.KEY_STROKE_SHOW_USAGES); } @Override ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/ContentUIMenuAction.java ===================================== @@ -80,7 +80,7 @@ public class ContentUIMenuAction extends AbstractAction implements MenuAction { toolTipText = ObserveKeyStrokesSupport.removeKeyStroke(toolTipText); putValue(SHORT_DESCRIPTION, toolTipText); String name = (String) getValue(NAME); - if (name!=null && name.isEmpty()) { + if (name != null && name.isEmpty()) { putValue(NAME, toolTipText); } } @@ -114,19 +114,11 @@ public class ContentUIMenuAction extends AbstractAction implements MenuAction { editor.setEnabled(action.isEnabled()); } - @Override - public void initUI() { - if (!isWithKeyStroke()) { - KeyStroke keyStroke = getMenuKeyStroke(); - setKeyStroke(keyStroke); - } - AbstractButton editor = getEditor(); - getPopupMenu().add(editor); - initEditor(); - } - @Override public KeyStroke getMenuKeyStroke() { + if (isWithKeyStroke()) { + return (KeyStroke) getValue(ACCELERATOR_KEY); + } int usedCount = (int) Arrays.stream(getPopupMenu().getSubElements()).filter(p -> !((ContentUIMenuAction) ((AbstractButton) p).getAction()).isWithKeyStroke()).count(); return getMenuKeyStroke(usedCount); } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/NavigationTreeShowPopupHandler.java ===================================== @@ -93,12 +93,12 @@ public class NavigationTreeShowPopupHandler implements KeyListener, MouseListene popup.addSeparator(); length = popup.getSubElements().length; } - Arrays.stream(selectedContentUI.getInsertPopup().getSubElements()).forEach(a -> new ContentUIMenuAction(popup, (AbstractButton) a).init()); + Arrays.stream(selectedContentUI.getConfigurePopup().getSubElements()).forEach(a -> ContentUIMenuAction.createWithKeyStroke(popup, (AbstractButton) a).init()); if (popup.getSubElements().length > length) { popup.addSeparator(); } - Arrays.stream(selectedContentUI.getConfigurePopup().getSubElements()).forEach(a -> new ContentUIMenuAction(popup, (AbstractButton) a).init()); length = popup.getSubElements().length; + Arrays.stream(selectedContentUI.getInsertPopup().getSubElements()).forEach(a -> new ContentUIMenuAction(popup, (AbstractButton) a).init()); if (length == 0) { popup.add(noAction); } ===================================== client/datasource/editor/api/src/main/resources/fr/ird/observe/client/datasource/editor/api/content/data/list/CommonContentListUI.jcss ===================================== @@ -24,6 +24,3 @@ enabled: true; } -.ifOpen { - enabled:{states.isUpdatingMode()}; -} ===================================== client/datasource/editor/api/src/main/resources/fr/ird/observe/client/datasource/editor/api/content/data/open/CommonContentOpenableUI.jcss ===================================== @@ -49,6 +49,3 @@ BeanCheckBox { horizontalTextPosition:{BeanCheckBox.LEFT}; } -.ifOpen { - enabled:{states.isUpdatingMode() && !states.isModified()}; -} ===================================== client/i18n/src/main/i18n/translations/observe_en_GB.properties ===================================== @@ -1300,6 +1300,7 @@ observe.ui.choice.cancel=Cancel observe.ui.choice.cancel.tip=To cancel, press ESCAPE key. observe.ui.choice.confirm.delete=Confirm delete observe.ui.choice.confirm.insert=Confirm to insert +observe.ui.choice.confirm.move=Move observe.ui.choice.confirm.replace=Replace observe.ui.choice.continue=Continue observe.ui.choice.dcp.default=Other opérations or objects (FOB) ===================================== client/i18n/src/main/i18n/translations/observe_es_ES.properties ===================================== @@ -1300,6 +1300,7 @@ observe.ui.choice.cancel=Cancelar observe.ui.choice.cancel.tip=To cancel, press ESCAPE key. \#TODO observe.ui.choice.confirm.delete=Eliminar observe.ui.choice.confirm.insert=Confirmer l'insertion \#TODO +observe.ui.choice.confirm.move=Cambiar observe.ui.choice.confirm.replace=Reemplazar observe.ui.choice.continue=Continuar observe.ui.choice.dcp.default=Other opérations or objects (FOB) \#TODO ===================================== client/i18n/src/main/i18n/translations/observe_fr_FR.properties ===================================== @@ -1300,6 +1300,7 @@ observe.ui.choice.cancel=Annuler observe.ui.choice.cancel.tip=Pour annuler, presser la touche ÉCHAP. observe.ui.choice.confirm.delete=Supprimer observe.ui.choice.confirm.insert=Confirmer l'insertion +observe.ui.choice.confirm.move=Déplacer observe.ui.choice.confirm.replace=Remplacer observe.ui.choice.continue=Continuer observe.ui.choice.dcp.default=Autre opérations et types d'objets (FOB) View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/5b045f480095dead439711916… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/5b045f480095dead439711916… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] 2 commits: Problème de contexte d'édition lors de déplacement - Closes #1789
by Tony CHEMIT 11 Feb '21

11 Feb '21
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 3d3fda15 by Tony Chemit at 2021-02-11T19:04:53+01:00 Problème de contexte d&#39;édition lors de déplacement - Closes #1789 - - - - - 20b77f77 by Tony Chemit at 2021-02-11T19:06:32+01:00 Déplacement de marées pas effectif - Closes #1786 Revue pour le déplacement simple. - - - - - 5 changed files: - 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/tree/DefaultMultipleMoveTreeAdapter.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/DefaultSingleMoveTreeAdapter.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/ContentListUINavigationNode.java Changes: ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveExecutor.java ===================================== @@ -27,7 +27,6 @@ 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.dto.data.TripAware; import fr.ird.observe.toolkit.dto.navigation.edit.EditNode; import fr.ird.observe.toolkit.dto.navigation.edit.close.CloseEditNodeVetoException; import org.apache.logging.log4j.LogManager; @@ -103,13 +102,7 @@ public class MoveExecutor { } protected boolean close(MoveRequest request, EditNode<?> editNode, DataSourceEditor dataSourceEditor) { - if (TripAware.class.isAssignableFrom(request.getReferenceType())) { - // while moving trip, we do not close them - //FIXME Maybe this should be driven by request (with doClose parameter) - return true; - } - String id = request.getIds().iterator().next(); - if (editNode != null && Objects.equals(id, editNode.getId())) { + if (editNode != null && request.getIds().contains(editNode.getId())) { try { ChangeMode.closeData(dataSourceEditor, editNode); } catch (CloseEditNodeVetoException e) { ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/DefaultMultipleMoveTreeAdapter.java ===================================== @@ -27,8 +27,6 @@ import fr.ird.observe.client.datasource.editor.api.content.actions.move.MoveRequ 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; /** * Created on 15/10/2020. @@ -41,69 +39,24 @@ public class DefaultMultipleMoveTreeAdapter implements MoveTreeAdapter { @Override public void adaptTree(MoveRequest request, NavigationTree tree) { ImmutableSet<String> ids = request.getIds(); + // get old parent node ContentListUINavigationNode oldParentNode = (ContentListUINavigationNode) tree.getSelectedNode().upToReferenceContainerNode(request.getReferenceType()); - // get shared ancestor of tow parents + // get shared ancestor of two parents NavigationNode parentContainerNode = oldParentNode.upToReferenceContainerNode(request.getParentReferenceType()); // get new parent node - ContentListUINavigationNode newParentNode = getNewParentNode(request, parentContainerNode); + ContentListUINavigationNode newParentNode = MoveTreeAdapter.getNewParentNode(request, parentContainerNode); // update it newParentNode.addChildren(ids); // clean old paren node - cleanOldParentNode(tree, ids, oldParentNode); - - 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(); - } - } - } + MoveTreeAdapter.cleanOldParentNode(tree, ids, oldParentNode); - protected 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); + MoveTreeAdapter.doFinalSelect(request, tree, oldParentNode, newParentNode); } - protected 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); - } } \ No newline at end of file ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/DefaultSingleMoveTreeAdapter.java ===================================== @@ -23,6 +23,7 @@ package fr.ird.observe.client.datasource.editor.api.content.actions.move.tree; */ 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; @@ -37,47 +38,32 @@ public class DefaultSingleMoveTreeAdapter implements MoveTreeAdapter { @Override public void adaptTree(MoveRequest request, NavigationTree tree) { + String id = request.getId(); Class<? extends DtoReference> parentReferenceType = request.getParentTargetReferenceType(); - // selected node - NavigationNode node = tree.getSelectedNode(); + Class<? extends DtoReference> referenceType = request.getReferenceType(); - Class<? extends DtoReference> referenceType = node.getScope().getMainReferenceType(); + // get old parent node + ContentListUINavigationNode oldParentNode = (ContentListUINavigationNode) tree.getSelectedNode().upToReferenceContainerNode(referenceType); - // up to old container reference node - NavigationNode oldChildContainerNode = node.upToReferenceContainerNode(referenceType); - - // remove node from old child container node - node.removeFromParent(); - - // reload old child container node - oldChildContainerNode.nodeChanged(); - - // up to old parent container node - NavigationNode oldParentContainerNode = oldChildContainerNode.upToReferenceContainerNode(parentReferenceType); + // get shared ancestor of two parents + NavigationNode parentContainerNode = oldParentNode.upToReferenceContainerNode(parentReferenceType); // dow to new parent node - NavigationNode newParentNode = oldParentContainerNode.downToReferenceNode(parentReferenceType, request.getNewParentId()); + ContentListUINavigationNode newParentNode = MoveTreeAdapter.getNewParentNode(request, parentContainerNode); // down to new child container node - NavigationNode newChildContainerNode = newParentNode.downToReferenceContainerNode(referenceType); - - // insert node into new child container node - newChildContainerNode.add(node); + ContentListUINavigationNode newChildContainerNode = (ContentListUINavigationNode) newParentNode.downToReferenceContainerNode(referenceType); - // reload new child container node - newChildContainerNode.nodeChanged(); + // update it + NavigationNode node = newChildContainerNode.addChildren(id); - // select final node parent (need to do this, otherwise next command has no effect (node stays the same) - tree.selectSafeNode(newChildContainerNode); - - // get back brand new node (otherwise tree model is broken) - node = newChildContainerNode.downToReferenceNode(referenceType, request.getId()); - - // select final node - tree.selectSafeNode(node); + // clean old paren node + MoveTreeAdapter.cleanOldParentNode(tree, request.getIds(), oldParentNode); node.getParent().refreshToRoot(); + + MoveTreeAdapter.doFinalSelect(request, tree, oldParentNode, node); } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/MoveTreeAdapter.java ===================================== @@ -22,8 +22,13 @@ 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.navigation.tree.root.RootNavigationNode; +import fr.ird.observe.dto.referential.common.ProgramReference; /** * To adapt navigation tree after the move operation. @@ -37,4 +42,54 @@ 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/ContentListUINavigationNode.java ===================================== @@ -102,4 +102,25 @@ public abstract class ContentListUINavigationNode extends NavigationNode { } } } + 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; + } + } + } + return result; + } } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/b4cc38f9f70524a924d4df25… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/b4cc38f9f70524a924d4df25… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] Mauvaise disposition de l'encadré des espèces et quelques améliorations sur...
by Tony CHEMIT 11 Feb '21

11 Feb '21
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: b4cc38f9 by Tony Chemit at 2021-02-11T17:42:58+01:00 Mauvaise disposition de l&#39;encadré des espèces et quelques améliorations sur les deux écrans - Closes #1781 - - - - - 5 changed files: - client/datasource/editor/api/src/main/resources/fr/ird/observe/client/datasource/editor/api/content/data/sample/CommonSample.jcss - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/DiscardedTargetSampleUI.jaxx - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/KeptTargetSampleUI.jaxx - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/NonTargetSampleUI.jaxx - services/i18n/src/main/i18n/translations/services_fr_FR.properties Changes: ===================================== client/datasource/editor/api/src/main/resources/fr/ird/observe/client/datasource/editor/api/content/data/sample/CommonSample.jcss ===================================== @@ -25,7 +25,7 @@ } #acquisitionModePanel { - border:{new TitledBorder(new javax.swing.border.EmptyBorder(0,0,0,0), t("observe.data.Data.acquisitionMode"))}; + border:{new TitledBorder(t("observe.data.Data.acquisitionMode"))}; } #acquisitionModeNumber { @@ -45,7 +45,7 @@ } #speciesAndMeasureTypesPanel { - border:{new TitledBorder(new javax.swing.border.EmptyBorder(0,0,0,0), t("observe.data.Data.speciesAndMeasureTypes"))}; + border:{new TitledBorder(t("observe.data.Data.speciesAndMeasureTypes"))}; } #sizeMeasureType { ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/DiscardedTargetSampleUI.jaxx ===================================== @@ -72,13 +72,13 @@ <!-- mode de saisie - espèce - type de mesures --> <row> - <cell> + <cell columns="2"> <JPanel id='acquisitionModePanel' layout="{new GridLayout(0, 1)}"> <JRadioButton id='acquisitionModeNumber'/> <JRadioButton id='acquisitionModeIndividual'/> </JPanel> </cell> - <cell weightx='1' anchor='east'> + <cell columns="2" weightx='1' anchor='east'> <Table id='speciesAndMeasureTypesPanel' fill='both' insets='1'> <row> <cell> @@ -119,6 +119,7 @@ </row> <!-- length --> + <!-- lengthMeasureMethod --> <row> <cell> <JLabel id='lengthLabel' styleClass="i18n"/> @@ -126,9 +127,6 @@ <cell weightx='1' anchor='east'> <NumberEditor id='length' styleClass="float1"/> </cell> - </row> - <!-- lengthMeasureMethod --> - <row> <cell> <JLabel id='lengthMeasureMethodLabel'/> </cell> @@ -138,6 +136,7 @@ </row> <!-- weight --> + <!-- weightMeasureMethod --> <row> <cell> <JLabel id='weightLabel' styleClass="i18n"/> @@ -145,9 +144,6 @@ <cell weightx='1' anchor='east'> <NumberEditor id='weight' styleClass="float2"/> </cell> - </row> - <!-- weightMeasureMethod --> - <row> <cell> <JLabel id='weightMeasureMethodLabel'/> </cell> @@ -157,6 +153,7 @@ </row> <!-- count --> + <!-- tagNumber --> <row> <cell> <JLabel id='countLabel' styleClass="i18n"/> @@ -164,10 +161,6 @@ <cell weightx='1' anchor='east'> <NumberEditor id='count' styleClass="int6"/> </cell> - </row> - - <!-- tagNumber --> - <row> <cell anchor='west'> <JLabel id='tagNumberLabel' styleClass="i18n"/> </cell> @@ -175,7 +168,6 @@ <NormalTextEditor id='tagNumber'/> </cell> </row> - </Table> <Table id='extraZone' fill='both' weightx='1' insets='0'> ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/KeptTargetSampleUI.jaxx ===================================== @@ -63,21 +63,18 @@ errorTableModel='{getErrorTableModel()}' context='update' parentValidator='{validator}'/> <ButtonGroup id='acquisitionModeGroup'/> - <JLabel id='hideFormInformation' styleClass='skipI18n' - text="observe.data.ps.observation.KeptTargetSample.message.cantAdd"/> - <Table id='editorPanel' fill='both' insets='1' beanScope="tableEditBean" _tableEditors='{newComponentArray(species,sex,sizeMeasureType,length,weight,count)}'> <!-- mode de saisie - espèce - type de mesures --> <row> - <cell> + <cell columns="2"> <JPanel id='acquisitionModePanel' layout="{new GridLayout(0, 1)}"> <JRadioButton id='acquisitionModeNumber'/> <JRadioButton id='acquisitionModeIndividual'/> </JPanel> </cell> - <cell weightx='1' anchor='east'> + <cell columns="2" weightx='1' anchor='east'> <Table id='speciesAndMeasureTypesPanel' fill='both' insets='1'> <row> <cell> @@ -118,6 +115,7 @@ </row> <!-- length --> + <!-- lengthMeasureMethod --> <row> <cell> <JLabel id='lengthLabel' styleClass="i18n"/> @@ -125,9 +123,6 @@ <cell weightx='1' anchor='east'> <NumberEditor id='length' styleClass="float1"/> </cell> - </row> - <!-- lengthMeasureMethod --> - <row> <cell> <JLabel id='lengthMeasureMethodLabel'/> </cell> @@ -137,6 +132,7 @@ </row> <!-- weight --> + <!-- weightMeasureMethod --> <row> <cell> <JLabel id='weightLabel' styleClass="i18n"/> @@ -144,9 +140,6 @@ <cell weightx='1' anchor='east'> <NumberEditor id='weight' styleClass="float2"/> </cell> - </row> - <!-- weightMeasureMethod --> - <row> <cell> <JLabel id='weightMeasureMethodLabel'/> </cell> @@ -156,6 +149,7 @@ </row> <!-- count --> + <!-- tagNumber --> <row> <cell> <JLabel id='countLabel' styleClass="i18n"/> @@ -163,10 +157,6 @@ <cell weightx='1' anchor='east'> <NumberEditor id='count' styleClass="int6"/> </cell> - </row> - - <!-- tagNumber --> - <row> <cell anchor='west'> <JLabel id='tagNumberLabel' styleClass="i18n"/> </cell> @@ -177,6 +167,9 @@ </Table> + <JLabel id='hideFormInformation' styleClass='skipI18n' + text="observe.data.ps.observation.KeptTargetSample.message.cantAdd"/> + <Table id='extraZone' fill='both' weightx='1' insets='0'> <row> <cell weighty='1'> ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/NonTargetSampleUI.jaxx ===================================== @@ -73,13 +73,13 @@ <!-- mode de saisie - espèce - type de mesures --> <row> - <cell> + <cell columns="2"> <JPanel id='acquisitionModePanel' layout="{new GridLayout(0, 1)}"> <JRadioButton id='acquisitionModeNumber'/> <JRadioButton id='acquisitionModeIndividual'/> </JPanel> </cell> - <cell weightx='1' anchor='east'> + <cell columns="2" weightx='1' anchor='east'> <Table id='speciesAndMeasureTypesPanel' fill='both' insets='1'> <row> <cell> @@ -110,6 +110,7 @@ </row> <!-- length --> + <!-- count --> <row> <cell> <JLabel id='lengthLabel'/> @@ -117,9 +118,16 @@ <cell weightx='1' anchor='east'> <NumberEditor id='length' styleClass="float1"/> </cell> + <cell> + <JLabel id='countLabel'/> + </cell> + <cell weightx='1' anchor='east'> + <NumberEditor id='count' styleClass="int6"/> + </cell> </row> <!-- weight --> + <!-- weightMeasureMethod --> <row> <cell> <JLabel id='weightLabel'/> @@ -127,9 +135,6 @@ <cell weightx='1' anchor='east'> <NumberEditor id='weight' styleClass="float2"/> </cell> - </row> - <!-- weightMeasureMethod --> - <row> <cell> <JLabel id='weightMeasureMethodLabel'/> </cell> @@ -138,17 +143,8 @@ </cell> </row> - <!-- count --> - <row> - <cell> - <JLabel id='countLabel'/> - </cell> - <cell weightx='1' anchor='east'> - <NumberEditor id='count' styleClass="int6"/> - </cell> - </row> - <!-- sex --> + <!-- speciesFate --> <row> <cell> <JLabel id='sexLabel'/> @@ -156,10 +152,6 @@ <cell weightx='1' anchor='east'> <JaxxComboBox id='sex' genericType='SexReference'/> </cell> - </row> - - <!-- speciesFate --> - <row> <cell> <JLabel id='speciesFateLabel'/> </cell> @@ -169,6 +161,7 @@ </row> <!-- reference pĥoto --> + <!-- tagNumber --> <row> <cell> <JLabel id='picturesReferencesLabel'/> @@ -176,10 +169,6 @@ <cell weightx='1' anchor='east'> <NormalTextEditor id='picturesReferences'/> </cell> - </row> - - <!-- tagNumber --> - <row> <cell anchor='west'> <JLabel id='tagNumberLabel'/> </cell> @@ -187,7 +176,6 @@ <NormalTextEditor id='tagNumber'/> </cell> </row> - </Table> <Table id='extraZone' fill='both' weightx='1' insets='0'> ===================================== services/i18n/src/main/i18n/translations/services_fr_FR.properties ===================================== @@ -13,7 +13,7 @@ observe.Id.sex=Sexe observe.Id.sizeMeasureType=Type de mensuration observe.Id.validation.required.latitude=La latitude doit être renseignée. observe.Id.validation.required.longitude=La longitude doit être renseignée. -observe.Id.weightMeasureType=Type de mesure de poids +observe.Id.weightMeasureType=Type de pesée observe.Id.whenArriving=À l'arrivée observe.Id.whenLeaving=Au départ observe.business.module.common.common.referential.title=Référentiel commun @@ -665,7 +665,7 @@ observe.referential.common.VesselSizeCategory.gaugeLabel=Libellé jauge observe.referential.common.VesselSizeCategory.type=Catégorie de bateau observe.referential.common.VesselType.type=Type de pêcherie observe.referential.common.WeightMeasureMethod.type=Méthode de mesure de poids -observe.referential.common.WeightMeasureType.type=Type de mesure de poids +observe.referential.common.WeightMeasureType.type=Type de pesée observe.referential.common.Wind.speedRange=Libellé vitesse vent observe.referential.common.Wind.type=Vent Beaufort observe.referential.common.Wind.waveHeight=Libellé Hauteur moyenne vagues View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/b4cc38f9f70524a924d4df25e… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/b4cc38f9f70524a924d4df25e… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] 9 commits: Review some start action accelerator (replace Alt+Q by Alt+S) (the first one...
by Tony CHEMIT 11 Feb '21

11 Feb '21
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 905a3a8f by Tony Chemit at 2021-02-11T09:09:38+01:00 Review some start action accelerator (replace Alt+Q by Alt+S) (the first one looks more than a quit command...) - - - - - e961cb3b by Tony Chemit at 2021-02-11T09:10:43+01:00 Improve data management messages - - - - - eb3f89cf by Tony Chemit at 2021-02-11T09:55:53+01:00 Déplacement de marées pas effectif - See #1786 Pouvoir appliquer l&#39;action sur une sélection multiple - - - - - db1c77ff by Tony Chemit at 2021-02-11T12:14:55+01:00 Add nice NavigationResult.getProgram method - - - - - 3a7b5612 by Tony Chemit at 2021-02-11T12:16:19+01:00 Déplacement de marées pas effectif - See #1786 Mauvais paramétrage des provider de nœuds - - - - - cbb69419 by Tony Chemit at 2021-02-11T12:16:43+01:00 Déplacement de marées pas effectif - See #1786 Suppression capability non utilisée - - - - - ae75ca80 by Tony Chemit at 2021-02-11T14:23:04+01:00 Déplacement de marées pas effectif - See #1786 Rendre effective le déplacement multiple depuis un nœud de type liste. - - - - - 5b9d1633 by Tony Chemit at 2021-02-11T15:02:24+01:00 On en voit plus les DCP! - Closes #1782 Déplacement de marées pas effectif - Closes #1786 - - - - - 31e9b8fe by Tony Chemit at 2021-02-11T17:24:33+01:00 On en voit plus les DCP! - Closes #1782 Déplacement de marées pas effectif - Closes #1786 Amélioration de la boite de dialogue de suppression - Closes #1787 - - - - - 24 changed files: - client/datasource/actions/src/main/i18n/getters/java.getter - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/actions/DataManager.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/actions/Apply.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/actions/Apply.java - client/datasource/editor/api/src/main/i18n/getters/java.getter - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/ObserveKeyStrokesEditorApi.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/id/ChangeId.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/MoveRequestBuilder.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/DefaultMultipleMoveTreeAdapter.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUI.jcss - 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/navigation/tree/NavigationNode.java - − client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/capability/ReferenceListContainerCapability.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationCapability.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationTreeNodeProvider.java - client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/LlRootNavigationTreeNodeProvider.java - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/PsRootNavigationTreeNodeProvider.java - client/i18n/src/main/i18n/translations/observe_en_GB.properties - client/i18n/src/main/i18n/translations/observe_es_ES.properties - client/i18n/src/main/i18n/translations/observe_fr_FR.properties - models/dto/java/src/main/java/fr/ird/observe/dto/referential/common/ProgramReference.java - pom.xml - services/api/src/main/java/fr/ird/observe/services/service/data/NavigationResult.java Changes: ===================================== client/datasource/actions/src/main/i18n/getters/java.getter ===================================== @@ -40,10 +40,16 @@ observe.ui.datasource.editor.actions.consolidate.message.trip observe.ui.datasource.editor.actions.consolidate.start.trip observe.ui.datasource.editor.actions.consolidate.title observe.ui.datasource.editor.actions.consolidate.title.tip +observe.ui.datasource.editor.actions.data.copy +observe.ui.datasource.editor.actions.data.delete +observe.ui.datasource.editor.actions.data.delete.result +observe.ui.datasource.editor.actions.data.export.result +observe.ui.datasource.editor.actions.data.import.add.missing.referential +observe.ui.datasource.editor.actions.data.import.add.missing.referential.for.type +observe.ui.datasource.editor.actions.data.import.result +observe.ui.datasource.editor.actions.data.import.title.require.add.missing.referential observe.ui.datasource.editor.actions.exportData observe.ui.datasource.editor.actions.exportData.description -observe.ui.datasource.editor.actions.exportData.message.add.missing.referential -observe.ui.datasource.editor.actions.exportData.message.add.missing.referentials2 observe.ui.datasource.editor.actions.exportData.message.not.possible observe.ui.datasource.editor.actions.exportData.message.operation.needFix observe.ui.datasource.editor.actions.exportData.message.prepare.data @@ -88,11 +94,6 @@ observe.ui.datasource.editor.actions.synchro.data.deleteFromRight.tip observe.ui.datasource.editor.actions.synchro.data.description observe.ui.datasource.editor.actions.synchro.data.launch.operation observe.ui.datasource.editor.actions.synchro.data.message.data.loaded -observe.ui.datasource.editor.actions.synchro.data.prepare.copyToTask -observe.ui.datasource.editor.actions.synchro.data.prepare.deleteTask -observe.ui.datasource.editor.actions.synchro.data.result.delete.trip -observe.ui.datasource.editor.actions.synchro.data.result.export.trip -observe.ui.datasource.editor.actions.synchro.data.result.import.trip observe.ui.datasource.editor.actions.synchro.data.task.copyToLeft observe.ui.datasource.editor.actions.synchro.data.task.copyToRight observe.ui.datasource.editor.actions.synchro.data.task.deleteFromLeft @@ -190,7 +191,6 @@ observe.ui.datasource.storage.config.source.storage observe.ui.datasource.storage.step.label observe.ui.message.no.report.selected observe.ui.message.select.report -observe.ui.title.can.not.export.data2 observe.ui.title.choose.db.dump.directory observe.ui.title.choose.reportFile observe.ui.title.storage.info ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/actions/DataManager.java ===================================== @@ -49,13 +49,14 @@ import io.ultreia.java4all.lang.Strings; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.runtime.swing.wizard.ext.WizardState; import javax.swing.JOptionPane; import java.util.Collection; import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static io.ultreia.java4all.i18n.I18n.n; import static io.ultreia.java4all.i18n.I18n.t; @@ -119,6 +120,7 @@ public class DataManager { return targetSourceLabel; } + @SuppressWarnings({"unchecked", "rawtypes"}) public WizardState insertMissingReferential(Collection<String> idsToCopy) { progressModel.increments(); @@ -141,7 +143,7 @@ public class DataManager { UsageForDisplayUI<ReferentialDtoReference> usagesUI = UsageForDisplayUIHandler.showMissingReferential(getMessage(), usages); int response = ClientUIContext.askUser(null, - t("observe.ui.title.can.not.export.data2", getTargetSourceLabel()), + t("observe.ui.datasource.editor.actions.data.import.title.require.add.missing.referential", getTargetSourceLabel()), usagesUI, JOptionPane.WARNING_MESSAGE, new Object[]{ @@ -154,18 +156,18 @@ public class DataManager { return WizardState.CANCELED; } - log.info(String.format("Base «%s» - Insertion des référentiels manquants.", getTargetSourceLabel())); - + StringBuilder parameters = new StringBuilder(); DecoratorService decoratorService = action.getDecoratorService(); for (Class<? extends ReferentialDtoReference> key : ReferentialDtoReference.filterReferentialReference(usages.types())) { Set<? extends ReferentialDtoReference> references = usages.get(key); String type = t(ContentReferentialUII18nHelper.getType(key)); - action.sendMessage(t("observe.ui.datasource.editor.actions.exportData.message.add.missing.referentials2", getTargetSourceLabel(), references.size(), type)); - Decorator<?> decorator = decoratorService.getReferenceDecorator(key); - for (DtoReference reference : references) { - action.sendMessage(t("observe.ui.datasource.editor.actions.exportData.message.add.missing.referential", reference)); - } + decoratorService.installDecorator(key, (Stream) references.stream()); + String labels = references.stream().map(Object::toString).collect(Collectors.joining("\n\t * ")); + parameters.append(t("observe.ui.datasource.editor.actions.data.import.add.missing.referential.for.type", getTargetSourceLabel(), references.size(), type, labels)); + parameters.append("\n"); } + action.sendMessage(t("observe.ui.datasource.editor.actions.data.import.add.missing.referential", getTargetSourceLabel(), parameters.toString())); + progressModel.increments(); targetReferentialService.insertMissingReferential(missingReferentialResult.getSqlCode()); return WizardState.SUCCESSED; @@ -178,11 +180,11 @@ public class DataManager { String tripId = trip.getId(); - action.sendMessage(t("observe.ui.datasource.editor.actions.synchro.data.prepare.deleteTask", getTargetSourceLabel(), program, trip)); + action.sendMessage(t("observe.ui.datasource.editor.actions.data.delete", getTargetSourceLabel(), program, trip)); progressModel.increments(); DeleteTripRequest deleteTripRequest = new DeleteTripRequest(programId, tripId); DeleteTripResult deleteTripResult = targetSource.getTripManagementService().deleteTrip(deleteTripRequest); - logDeleteResult(n("observe.ui.datasource.editor.actions.synchro.data.result.delete.trip"), + logDeleteResult(n("observe.ui.datasource.editor.actions.data.delete.result"), getTargetSourceLabel(), deleteTripResult, program, @@ -199,11 +201,11 @@ public class DataManager { decoratorService.registerDecoratorInReference(program); decoratorService.registerDecoratorInReference((DtoReference) trip); - action.sendMessage(t("observe.ui.datasource.editor.actions.synchro.data.prepare.copyToTask", targetSourceLabel, program, trip)); + action.sendMessage(t("observe.ui.datasource.editor.actions.data.copy", targetSourceLabel, program, trip)); progressModel.increments(); ExportTripRequest exportTripRequest = new ExportTripRequest(!targetSource.isLocal(), programId, tripId); ExportTripResult exportTripResult = incomingSource.getTripManagementService().exportTrip(exportTripRequest); - logExportResult(n("observe.ui.datasource.editor.actions.synchro.data.result.export.trip"), + logExportResult(n("observe.ui.datasource.editor.actions.data.export.result"), getIncomingSourceLabel(), exportTripResult, program, @@ -211,10 +213,10 @@ public class DataManager { progressModel.increments(); ImportTripRequest importTripRequest = new ImportTripRequest(exportTripResult); - log.info("Use import script: "+importTripRequest.getSqlContent().getLocation()); + log.info("Use import script: " + importTripRequest.getSqlContent().getLocation()); ImportTripResult importTripResult = targetSource.getTripManagementService().importTrip(importTripRequest); - logImportResult(n("observe.ui.datasource.editor.actions.synchro.data.result.import.trip"), - n("observe.ui.datasource.editor.actions.synchro.data.result.delete.trip"), + logImportResult(n("observe.ui.datasource.editor.actions.data.import.result"), + n("observe.ui.datasource.editor.actions.data.delete.result"), targetSourceLabel, importTripResult, program, ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/actions/Apply.java ===================================== @@ -52,7 +52,7 @@ import static io.ultreia.java4all.i18n.I18n.t; public class Apply extends DataSynchroUIActionSupport { public Apply() { - super(t("observe.ui.action.apply"), t("observe.ui.action.apply"), "accept", 'Q'); + super(t("observe.ui.action.apply"), t("observe.ui.action.apply"), "accept", 'S'); } @Override ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/actions/Apply.java ===================================== @@ -54,7 +54,7 @@ import static io.ultreia.java4all.i18n.I18n.t; public class Apply extends ReferentialSynchroUIActionSupport { public Apply() { - super(t("observe.ui.action.apply"), t("observe.ui.action.apply"), "accept", 'Q'); + super(t("observe.ui.action.apply"), t("observe.ui.action.apply"), "accept", 'S'); } @Override ===================================== client/datasource/editor/api/src/main/i18n/getters/java.getter ===================================== @@ -190,7 +190,9 @@ observe.ui.action.test.remote observe.ui.action.test.remote.tip observe.ui.action.test.server observe.ui.action.test.server.tip +observe.ui.choice.apply observe.ui.choice.cancel +observe.ui.choice.cancel.tip observe.ui.choice.confirm.delete observe.ui.choice.confirm.replace observe.ui.choice.continue @@ -293,6 +295,7 @@ observe.ui.message.show.usage.for.desactivated observe.ui.message.show.usages observe.ui.message.table.editBean.modified observe.ui.message.table.editBean.modified.but.invalid +observe.ui.move.selectTarget observe.ui.title.can.not.delete.referentiel observe.ui.title.can.not.export.obstuna observe.ui.title.choose.db.dump ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/ObserveKeyStrokesEditorApi.java ===================================== @@ -70,6 +70,8 @@ public class ObserveKeyStrokesEditorApi extends ObserveKeyStrokesSupport { public static final KeyStroke KEY_STROKE_COPY_VALUES_AND_SAVE = KeyStroke.getKeyStroke("ctrl pressed T"); + public static final KeyStroke KEY_STROKE_SELECT_TARGET = KeyStroke.getKeyStroke("pressed F2"); + public static final KeyStroke KEY_STROKE_GO_TO_OPEN = KeyStroke.getKeyStroke("alt pressed O"); public static final KeyStroke KEY_STROKE_TOGGLE_OBSERVATION_AVAILABILITY = KeyStroke.getKeyStroke("ctrl pressed F1"); public static final KeyStroke KEY_STROKE_TOGGLE_LOGBOOK_AVAILABILITY = KeyStroke.getKeyStroke("ctrl pressed F2"); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/id/ChangeId.java ===================================== @@ -72,6 +72,8 @@ public class ChangeId<U extends ContentUI> extends ContentUIActionSupport<U> imp ui.open(); NavigationTree tree = ui.getHandler().getDataSourceEditor().getNavigationUI().getTree(); NavigationNode selectedNode = tree.getSelectedNode(); + //FIXME:Tree No on a such referential node, there is no child! no no need to do this + //FIXME:Test use a less brutal node method selectedNode.updateNode(); selectedNode.nodeChanged(); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveRequest.java ===================================== @@ -58,14 +58,19 @@ public class MoveRequest { * Id of parent data where move. */ private final String newParentId; + /** + * to select target node after move operation. + */ + private final boolean selectTarget; - public MoveRequest(Class<? extends DataDtoReference> referenceType, Class<? extends DtoReference> parentReferenceType, Class<? extends DtoReference> parentTargetReferenceType, String oldParentId, ImmutableSet<String> ids, String newParentId) { + public MoveRequest(Class<? extends DataDtoReference> referenceType, Class<? extends DtoReference> parentReferenceType, Class<? extends DtoReference> parentTargetReferenceType, String oldParentId, ImmutableSet<String> ids, String newParentId, boolean selectTarget) { this.referenceType = referenceType; this.parentReferenceType = parentReferenceType; this.parentTargetReferenceType = parentTargetReferenceType; this.oldParentId = oldParentId; this.ids = ids; this.newParentId = newParentId; + this.selectTarget = selectTarget; } public Class<? extends DataDtoReference> getReferenceType() { @@ -96,6 +101,10 @@ public class MoveRequest { return ids.iterator().next(); } + public boolean isSelectTarget() { + return selectTarget; + } + public boolean isSingle() { return ids.size() == 1; } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/MoveRequestBuilder.java ===================================== @@ -24,6 +24,7 @@ package fr.ird.observe.client.datasource.editor.api.content.actions.move; import com.google.common.collect.ImmutableSet; import fr.ird.observe.client.ClientUIContextApplicationComponent; +import fr.ird.observe.client.datasource.editor.api.ObserveKeyStrokesEditorApi; import fr.ird.observe.client.datasource.editor.api.content.data.edit.ContentEditUIModel; import fr.ird.observe.client.datasource.editor.api.content.data.list.ContentListUIModel; import fr.ird.observe.client.datasource.editor.api.content.data.open.ContentOpenableUII18nHelper; @@ -38,11 +39,25 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.nuiton.decorator.JXPathDecorator; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.ActionMap; +import javax.swing.InputMap; import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComponent; import javax.swing.JLabel; +import javax.swing.JLayeredPane; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JSeparator; +import javax.swing.KeyStroke; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; import java.awt.BorderLayout; +import java.awt.Font; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -56,6 +71,7 @@ import static io.ultreia.java4all.i18n.I18n.t; * @author Tony Chemit - dev(a)tchemit.fr * @since 8.0.1 */ +@SuppressWarnings("UnusedReturnValue") public class MoveRequestBuilder { private static final Logger log = LogManager.getLogger(MoveRequestBuilder.class); @@ -75,6 +91,12 @@ public class MoveRequestBuilder { * Ids to move. */ private final ImmutableSet<String> ids; + /** + * To get selected target request value. + */ + private final JCheckBox selectTarget; + private final AbstractAction selectTargetAction; + private final AbstractAction applyAction; /** * To get parent candidates. */ @@ -91,6 +113,8 @@ public class MoveRequestBuilder { * Message of dialog to select new parent. */ private String askNewParentMessage; + private JButton jButton; + private JOptionPane optionPane; static class BuilderImpl implements StepSetParentCandidates, StepBuild { private final MoveRequestBuilder builder; @@ -151,6 +175,32 @@ public class MoveRequestBuilder { this.parentReferenceType = Objects.requireNonNull(parentReferenceType); this.oldParentId = Objects.requireNonNull(oldParentId); this.ids = Objects.requireNonNull(ids); + KeyStroke keyStroke = ObserveKeyStrokesEditorApi.KEY_STROKE_SELECT_TARGET; + String t = ObserveKeyStrokesEditorApi.suffixTextWithKeyStroke(t("observe.ui.move.selectTarget"), keyStroke); + this.selectTarget = new JCheckBox(t); + selectTargetAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + selectTarget.setSelected(!selectTarget.isSelected()); + log.info(String.format("select target? %s", selectTarget.isSelected())); + } + }; + selectTargetAction.putValue(Action.ACCELERATOR_KEY, keyStroke); + selectTargetAction.putValue(Action.NAME, t); + selectTarget.setFocusable(false); + keyStroke = ObserveKeyStrokesEditorApi.KEY_STROKE_APPLY; + t = ObserveKeyStrokesEditorApi.suffixTextWithKeyStroke(t("observe.ui.choice.apply"), keyStroke); + + applyAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + log.info("Apply :)"); + jButton.doClick(); + } + }; + applyAction.putValue(Action.ACCELERATOR_KEY, keyStroke); + applyAction.putValue(Action.NAME, t); +// selectTarget.setAction(selectTargetAction); } public MoveRequestBuilder setParentTargetReferenceType(Class<? extends DtoReference> parentTargetReferenceType) { @@ -189,7 +239,7 @@ public class MoveRequestBuilder { if (newParentId == null) { return Optional.empty(); } - return Optional.of(new MoveRequest(referenceType, parentReferenceType, parentTargetReferenceType, oldParentId, ids, newParentId)); + return Optional.of(new MoveRequest(referenceType, parentReferenceType, parentTargetReferenceType, oldParentId, ids, newParentId, selectTarget.isSelected())); } private Optional<String> askNewParent(List<? extends DtoReference> parentCandidates, String dialogTitle, String dialogMessage) { @@ -199,20 +249,66 @@ public class MoveRequestBuilder { (JXPathDecorator) ClientUIContextApplicationComponent.value().getDecoratorService().getReferenceDecorator(parentTargetReferenceType), parentCandidates); - String continueActionText = t("observe.ui.choice.continue"); - Object[] options = {continueActionText, t("observe.ui.choice.cancel")}; - JPanel panel = new JPanel(new BorderLayout()); - panel.add(BorderLayout.NORTH, new JLabel(t(dialogMessage))); - panel.add(BorderLayout.CENTER, editor); + String continueActionText = (String) applyAction.getValue(Action.NAME); + Object[] options = {continueActionText}; + JPanel panel = new JPanel(new BorderLayout(3, 3)); + + JPanel panel0 = new JPanel(new BorderLayout(3, 3)); + + JPanel panel2 = new JPanel(new GridLayout(0, 1)); + + panel0.add(BorderLayout.NORTH, new JLabel(t(dialogMessage))); + panel0.add(BorderLayout.CENTER, editor); + panel0.add(BorderLayout.SOUTH, panel2); + + //FIXME:Move Add a default client configuration option to set this value + selectTarget.setSelected(false); + + panel2.add(new JLabel()); + panel2.add(selectTarget); + + JLabel information = new JLabel(t("observe.ui.choice.cancel.tip"), UIHelper.getUIManagerActionIcon("information"), SwingConstants.LEFT); + information.setFont(information.getFont().deriveFont(Font.ITALIC).deriveFont(11f)); + + JPanel panel4 = new JPanel(new GridLayout(0, 1)); + JPanel panel5 = new JPanel(new BorderLayout()); + panel4.add(panel5); + panel4.add(BorderLayout.NORTH, new JSeparator(SwingConstants.HORIZONTAL)); + panel4.add(BorderLayout.CENTER, information); - JOptionPane pane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[0]); + panel.add(BorderLayout.NORTH, panel0); + panel.add(BorderLayout.SOUTH, panel4); - JButton jButton = UsageUIHandlerSupport.findButton(pane, continueActionText); + InputMap inputMap1 = panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + inputMap1.put((KeyStroke) selectTargetAction.getValue(Action.ACCELERATOR_KEY), "selectTarget"); + + InputMap inputMap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); + inputMap.put((KeyStroke) selectTargetAction.getValue(Action.ACCELERATOR_KEY), "selectTarget"); + inputMap.put((KeyStroke) applyAction.getValue(Action.ACCELERATOR_KEY), "apply"); + + ActionMap actionMap = panel.getActionMap(); + actionMap.put("selectTarget", selectTargetAction); + actionMap.put("apply", applyAction); + + optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[0]) { + @Override + public void selectInitialValue() { + + JLayeredPane parent = (JLayeredPane) optionPane.getParent().getParent(); + + InputMap inputMap = parent.getRootPane().getInputMap(2); + + inputMap.put(KeyStroke.getKeyStroke("pressed ENTER"), "none"); + inputMap.put(KeyStroke.getKeyStroke("ctrl pressed ENTER"), "none"); + + SwingUtilities.invokeLater(editor.getCombobox()::requestFocus); + } + }; + jButton = UsageUIHandlerSupport.findButton(optionPane, continueActionText); Objects.requireNonNull(jButton); jButton.setEnabled(false); editor.getModel().addPropertyChangeListener("selectedItem", evt -> jButton.setEnabled(evt.getNewValue() != null)); - - int response = UIHelper.askUser(ClientUIContextApplicationComponent.value().getMainUI(), pane, t(dialogTitle), options); + int response = UIHelper.askUser(ClientUIContextApplicationComponent.value().getMainUI(), optionPane, t(dialogTitle), options); DtoReference newParent = null; if (response == 0) { ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/actions/move/tree/DefaultMultipleMoveTreeAdapter.java ===================================== @@ -22,9 +22,13 @@ 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.navigation.tree.root.RootNavigationNode; +import fr.ird.observe.dto.referential.common.ProgramReference; /** * Created on 15/10/2020. @@ -36,15 +40,70 @@ public class DefaultMultipleMoveTreeAdapter implements MoveTreeAdapter { @Override public void adaptTree(MoveRequest request, NavigationTree tree) { + ImmutableSet<String> ids = request.getIds(); + // get old parent node + ContentListUINavigationNode oldParentNode = (ContentListUINavigationNode) tree.getSelectedNode().upToReferenceContainerNode(request.getReferenceType()); - NavigationNode selectedNode = tree.getSelectedNode(); - NavigationNode oldChildContainerNode = selectedNode.upToReferenceContainerNode(request.getParentReferenceType()); - oldChildContainerNode.updateNode(); + // get shared ancestor of tow parents + NavigationNode parentContainerNode = oldParentNode.upToReferenceContainerNode(request.getParentReferenceType()); - NavigationNode oldParentContainerReferenceNode = selectedNode.upToReferenceContainerNode(request.getParentReferenceType()); + // get new parent node + ContentListUINavigationNode newParentNode = getNewParentNode(request, parentContainerNode); - NavigationNode newParentNode = oldParentContainerReferenceNode.downToReferenceNode(request.getParentTargetReferenceType(), request.getNewParentId()); - newParentNode.updateNode(); + // update it + newParentNode.addChildren(ids); + + // clean old paren node + cleanOldParentNode(tree, ids, oldParentNode); + + 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(); + } + } + } + + protected 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); + } + + protected 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); } -} +} \ No newline at end of file ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUI.jcss ===================================== @@ -60,12 +60,8 @@ visible:{states.isEditable()}; } -/*#create { - enabled:{states.isEditable()}; -}*/ - #move { - enabled:{states.isUpdatingMode() && states.isOneOrMoreSelectedData()}; + enabled:{states.isEditable() && states.isOneOrMoreSelectedData()}; } #delete { ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/list/ContentListUINavigationNode.java ===================================== @@ -22,6 +22,7 @@ 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.reference.DataDtoReference; import fr.ird.observe.dto.reference.DtoReference; @@ -29,6 +30,7 @@ import fr.ird.observe.dto.reference.LazyDataDtoReferenceSet; import io.ultreia.java4all.lang.Objects2; import java.util.List; +import java.util.Set; /** * Created on 07/10/2020. @@ -79,4 +81,25 @@ public abstract class ContentListUINavigationNode extends NavigationNode { return getInitializer().getParentReference(); } + public void removeChildren(ImmutableSet<String> ids) { + for (String id : ids) { + NavigationNode childNode = findChildById(id); + childNode.removeFromParent(); + } + } + + public void addChildren(Set<String> ids) { + ContentListUINavigationInitializer initializer = getInitializer(); + boolean notLoaded = isNotLoaded(); + reloadNodeData(); + List<? extends DataDtoReference> references = initializer.getReferences(); + ContentListUINavigationCapability<?> capability = getCapability(); + for (DataDtoReference reference : references) { + if (notLoaded || ids.contains(reference.getId())) { + NavigationNode childNode = capability.createChildNode(reference); + int nodePosition = capability.getNodePosition(reference); + insert(childNode, nodePosition); + } + } + } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/NavigationNode.java ===================================== @@ -30,7 +30,6 @@ import fr.ird.observe.client.datasource.editor.api.navigation.tree.capability.Nu import fr.ird.observe.client.datasource.editor.api.navigation.tree.capability.ReferenceCapability; import fr.ird.observe.client.datasource.editor.api.navigation.tree.capability.ReferenceContainerCapability; import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationNode; -import fr.ird.observe.dto.reference.DataDtoReference; import fr.ird.observe.dto.reference.DtoReference; import fr.ird.observe.toolkit.dto.navigation.NavigationModelNode; import fr.ird.observe.toolkit.dto.navigation.edit.EditNode; @@ -276,7 +275,7 @@ public abstract class NavigationNode extends DefaultMutableTreeNode implements W // Update methods //-------------------------------------------------------------------------------------------- - public final <R extends DataDtoReference> int getChildrenPosition(R reference, Comparator<R> referenceComparator) { + public final <R extends DtoReference> int getChildrenPosition(R reference, Comparator<R> referenceComparator) { List<R> list = getChildrenReferences(reference); list.add(reference); list.sort(referenceComparator); ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/capability/ReferenceListContainerCapability.java deleted ===================================== @@ -1,35 +0,0 @@ -package fr.ird.observe.client.datasource.editor.api.navigation.tree.capability; - -/*- - * #%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 fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; - -/** - * Created on 08/11/2020. - * - * @author Tony Chemit - dev(a)tchemit.fr - * @since 8.0.1 - */ -public interface ReferenceListContainerCapability<N extends NavigationNode> extends ContainerCapability<N> { - -} ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationCapability.java ===================================== @@ -28,7 +28,6 @@ import fr.ird.observe.client.configuration.NavigationTreeConfig; import fr.ird.observe.client.datasource.editor.api.content.referential.ReferentialHomeUINavigationNode; import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; import fr.ird.observe.client.datasource.editor.api.navigation.tree.capability.ReferenceContainerCapability; -import fr.ird.observe.client.datasource.editor.api.navigation.tree.capability.ReferenceListContainerCapability; import fr.ird.observe.dto.reference.DtoReference; import fr.ird.observe.dto.referential.ReferentialDto; import fr.ird.observe.dto.referential.common.ProgramReference; @@ -45,7 +44,7 @@ import java.util.stream.Collectors; * @author Tony Chemit - dev(a)tchemit.fr * @since 8.0.1 */ -public class RootNavigationCapability implements ReferenceContainerCapability<RootNavigationNode>, ReferenceListContainerCapability<RootNavigationNode> { +public class RootNavigationCapability implements ReferenceContainerCapability<RootNavigationNode> { private final RootNavigationNode node; @@ -55,7 +54,7 @@ public class RootNavigationCapability implements ReferenceContainerCapability<Ro public RootNavigationCapability(RootNavigationNode node) { this.node = Objects.requireNonNull(node); this.acceptedNodeTypes = SingletonSupplier.of(() -> getNode().getInitializer().getRootNodeProviders().stream().flatMap(m -> m.getAcceptedNodeTypes().stream()).collect(ImmutableList.toImmutableList())); - this.acceptedTypes = SingletonSupplier.of(() -> getNode().getInitializer().getRootNodeProviders().stream().map(RootNavigationTreeNodeProvider::getAcceptedType).filter(Objects::nonNull).collect(ImmutableList.toImmutableList())); + this.acceptedTypes = SingletonSupplier.of(() -> getNode().getInitializer().getRootNodeProviders().stream().map(RootNavigationTreeNodeProvider::getAcceptedType).filter(Objects::nonNull).distinct().collect(ImmutableList.toImmutableList())); } @Override @@ -95,7 +94,7 @@ public class RootNavigationCapability implements ReferenceContainerCapability<Ro @Override public int getNodePosition(DtoReference reference) { - return 0; + return getNode().getChildrenPosition((ProgramReference) reference, ProgramReference.COMPARATOR_WITH_GEAR_PREFIX); } public RootNavigationTreeNodeProvider<?> getProvider(ProgramReference referenceType) { ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/tree/root/RootNavigationTreeNodeProvider.java ===================================== @@ -28,7 +28,7 @@ import fr.ird.observe.client.configuration.NavigationTreeConfig; import fr.ird.observe.client.datasource.editor.api.content.data.list.ContentListUINavigationNode; import fr.ird.observe.client.datasource.editor.api.content.referential.ReferentialHomeUINavigationNode; import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; -import fr.ird.observe.dto.reference.DataDtoReference; +import fr.ird.observe.dto.reference.DtoReference; import fr.ird.observe.dto.referential.ReferentialDto; import fr.ird.observe.dto.referential.common.ProgramReference; import fr.ird.observe.services.service.data.NavigationResult; @@ -53,7 +53,7 @@ public abstract class RootNavigationTreeNodeProvider<B extends fr.ird.observe.sp private final B module; private final int priority; private final ImmutableList<Class<? extends NavigationNode>> acceptedNodeTypes; - private final Class<? extends DataDtoReference> acceptedType; + private final Class<? extends DtoReference> acceptedType; public static synchronized List<RootNavigationTreeNodeProvider<?>> getProviders() { if (PROVIDERS == null) { @@ -66,7 +66,7 @@ public abstract class RootNavigationTreeNodeProvider<B extends fr.ird.observe.sp return PROVIDERS; } - protected RootNavigationTreeNodeProvider(BusinessProject project, B module, ImmutableList<Class<? extends NavigationNode>> acceptedNodeTypes, Class<? extends DataDtoReference> acceptedType) { + protected RootNavigationTreeNodeProvider(BusinessProject project, B module, ImmutableList<Class<? extends NavigationNode>> acceptedNodeTypes, Class<? extends DtoReference> acceptedType) { this.module = Objects.requireNonNull(module); this.acceptedNodeTypes = acceptedNodeTypes; this.acceptedType = acceptedType; @@ -112,7 +112,7 @@ public abstract class RootNavigationTreeNodeProvider<B extends fr.ird.observe.sp return acceptedNodeTypes; } - public Class<? extends DataDtoReference> getAcceptedType() { + public Class<? extends DtoReference> getAcceptedType() { return acceptedType; } ===================================== client/datasource/editor/ll/src/main/java/fr/ird/observe/client/datasource/editor/ll/LlRootNavigationTreeNodeProvider.java ===================================== @@ -27,7 +27,6 @@ import com.google.common.collect.ImmutableList; import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationNode; import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationTreeNodeProvider; import fr.ird.observe.client.datasource.editor.ll.data.common.TripListUINavigationNode; -import fr.ird.observe.dto.data.ll.common.TripReference; import fr.ird.observe.dto.referential.common.ProgramReference; import fr.ird.observe.spi.module.ObserveBusinessProject; import fr.ird.observe.spi.module.ll.BusinessModule; @@ -45,7 +44,7 @@ public class LlRootNavigationTreeNodeProvider extends RootNavigationTreeNodeProv fr.ird.observe.client.datasource.editor.ll.referential.common.ReferentialHomeUINavigationNode.class, fr.ird.observe.client.datasource.editor.ll.referential.landing.ReferentialHomeUINavigationNode.class, fr.ird.observe.client.datasource.editor.ll.referential.observation.ReferentialHomeUINavigationNode.class), - TripReference.class); + ProgramReference.class); } @Override ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/PsRootNavigationTreeNodeProvider.java ===================================== @@ -27,7 +27,6 @@ import com.google.common.collect.ImmutableList; import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationNode; import fr.ird.observe.client.datasource.editor.api.navigation.tree.root.RootNavigationTreeNodeProvider; import fr.ird.observe.client.datasource.editor.ps.data.common.TripListUINavigationNode; -import fr.ird.observe.dto.data.ll.common.TripReference; import fr.ird.observe.dto.referential.common.ProgramReference; import fr.ird.observe.spi.module.ObserveBusinessProject; import fr.ird.observe.spi.module.ps.BusinessModule; @@ -44,7 +43,7 @@ public class PsRootNavigationTreeNodeProvider extends RootNavigationTreeNodeProv ImmutableList.of(TripListUINavigationNode.class, fr.ird.observe.client.datasource.editor.ps.referential.common.ReferentialHomeUINavigationNode.class, fr.ird.observe.client.datasource.editor.ps.referential.observation.ReferentialHomeUINavigationNode.class), - TripReference.class); + ProgramReference.class); } @Override ===================================== client/i18n/src/main/i18n/translations/observe_en_GB.properties ===================================== @@ -1295,7 +1295,9 @@ observe.ui.action.test.server.tip=Click here to validate server connexion observe.ui.action.translate=Translate observe.ui.action.translate.tip=Translate application observe.ui.action.validate.config.generateReport=Generate validation report +observe.ui.choice.apply=Apply observe.ui.choice.cancel=Cancel +observe.ui.choice.cancel.tip=To cancel, press ESCAPE key. observe.ui.choice.confirm.delete=Confirm delete observe.ui.choice.confirm.insert=Confirm to insert observe.ui.choice.confirm.replace=Replace @@ -1326,10 +1328,16 @@ observe.ui.datasource.editor.actions.consolidate.message.trip=Data consolidate f observe.ui.datasource.editor.actions.consolidate.start.trip=Start consolidate data on trip %s / %s (%s) observe.ui.datasource.editor.actions.consolidate.title=Consolidate data observe.ui.datasource.editor.actions.consolidate.title.tip=Consolidate observed data +observe.ui.datasource.editor.actions.data.copy=Database «%s» - Register operation copy to database\: %s - %s +observe.ui.datasource.editor.actions.data.delete=Database «%s» - Register operation delete from database\: %s - %s +observe.ui.datasource.editor.actions.data.delete.result=Database «%s» - Trip %s - %s was removed from database. +observe.ui.datasource.editor.actions.data.export.result=Database «%s» - Trip %s - %s was exported from database. +observe.ui.datasource.editor.actions.data.import.add.missing.referential=Database «%s» - Insert all missing referentials\n%s +observe.ui.datasource.editor.actions.data.import.add.missing.referential.for.type=Database «%s» - Insert %s missing referentials of type «%s»\:%s +observe.ui.datasource.editor.actions.data.import.result=Database «%s» - Trip %s - %s was imported into database. +observe.ui.datasource.editor.actions.data.import.title.require.add.missing.referential=Need to confirm missing referential insertion observe.ui.datasource.editor.actions.exportData=Export data observe.ui.datasource.editor.actions.exportData.description=Export data -observe.ui.datasource.editor.actions.exportData.message.add.missing.referential=\t%s -observe.ui.datasource.editor.actions.exportData.message.add.missing.referentials2=Database «%s» - Insert %s missing referentials of type «%s» observe.ui.datasource.editor.actions.exportData.message.not.possible=Export is not possible (see above messages) observe.ui.datasource.editor.actions.exportData.message.operation.needFix=Select data to export. observe.ui.datasource.editor.actions.exportData.message.prepare.data=Prepare data to export... @@ -1392,11 +1400,6 @@ observe.ui.datasource.editor.actions.synchro.data.deleteFromRight.tip=Delete sel observe.ui.datasource.editor.actions.synchro.data.description=Advanced data management observe.ui.datasource.editor.actions.synchro.data.launch.operation=Get data fro databases observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Database «%s» - Data loaded -observe.ui.datasource.editor.actions.synchro.data.prepare.copyToTask=Database «%s» - Register operation copy to database\: %s - %s -observe.ui.datasource.editor.actions.synchro.data.prepare.deleteTask=Database «%s» - Register operation delete from database\: %s - %s -observe.ui.datasource.editor.actions.synchro.data.result.delete.trip=Database «%s» - Trip %s - %s was removed from database. -observe.ui.datasource.editor.actions.synchro.data.result.export.trip=Database «%s» - Trip %s - %s was exported from database. -observe.ui.datasource.editor.actions.synchro.data.result.import.trip=Database «%s» - Trip %s - %s was imported into database. observe.ui.datasource.editor.actions.synchro.data.task.copyToLeft=Copy to left database\: <i>%s</i> - «<b>%s</b>» observe.ui.datasource.editor.actions.synchro.data.task.copyToRight=Copy to right database\: <i>%s</i> - «<b>%s</b>» observe.ui.datasource.editor.actions.synchro.data.task.deleteFromLeft=Delete from left database\: <i>%s</i> - «<b>%s</b>» @@ -1672,22 +1675,20 @@ observe.ui.message.reload.i18n=You have modified i18n, application must be resta observe.ui.message.save.configuration=Save configuration in file %1$s observe.ui.message.select.report=Select a report  observe.ui.message.server.info=Local database %1$s is ready in server mode. -observe.ui.message.show.missing.referential=List of missing referential observe.ui.message.show.usage.for.delete=Referential %1$s "%2$s" can be deleted if you choose a replacement. observe.ui.message.show.usage.for.delete2=Some data are using this referential, see following references. observe.ui.message.show.usage.for.delete3=Choose a replacement reference to be able to delete. observe.ui.message.show.usage.for.desactivated=Referential %1$s "%2$s" will be disabled. observe.ui.message.show.usage.for.desactivated2=Some data are using this referential, see following reference observe.ui.message.show.usage.for.desactivated3=Those data need to use another enabled referential to be saved. -observe.ui.message.show.usage.for.missingReferentials2=There is some referentials present in «%s» source but not in the «%s» one. observe.ui.message.show.usages=List of usage of referential %1$s\: '%2$s' observe.ui.message.table.editBean.modified=Current entry is modifed and valid. observe.ui.message.table.editBean.modified.but.invalid=Current entry is modified but not valid. observe.ui.message.warning.will.be.delete=%1$s\n\nBe ware, export will replace existing data. +observe.ui.move.selectTarget=Select new parent node after move? observe.ui.textArea.tip=<html><body><ul><li>To focus on next widget, use accelerator <b>Ctrl + Tab</b></li><li>To focus on previous widget, use accelerator <b>Ctrl + Shift + Tab</b></body></html> observe.ui.title.about=About observe.ui.title.can.not.delete.referentiel=Impossible to delete a referentiel data... -observe.ui.title.can.not.export.data2=Could not export data to «%s» source observe.ui.title.can.not.export.obstuna=Could not export obstuna data... observe.ui.title.choose.db.dump=Choose a database backup observe.ui.title.choose.db.dump.directory=Chhose directory of backup ===================================== client/i18n/src/main/i18n/translations/observe_es_ES.properties ===================================== @@ -1295,7 +1295,9 @@ observe.ui.action.test.server.tip=Pulsar para comprobar la conexión con el serv observe.ui.action.translate=Traduire \#TODO observe.ui.action.translate.tip=Traduire l'application \#TODO observe.ui.action.validate.config.generateReport=Generar un informe de validación +observe.ui.choice.apply=Utilizar observe.ui.choice.cancel=Cancelar +observe.ui.choice.cancel.tip=To cancel, press ESCAPE key. \#TODO observe.ui.choice.confirm.delete=Eliminar observe.ui.choice.confirm.insert=Confirmer l'insertion \#TODO observe.ui.choice.confirm.replace=Reemplazar @@ -1326,10 +1328,16 @@ observe.ui.datasource.editor.actions.consolidate.message.trip=Datos calculados p observe.ui.datasource.editor.actions.consolidate.start.trip=Démarrage de la consolidation pour la marée %s / %s (%s) \#TODO observe.ui.datasource.editor.actions.consolidate.title=Consolidar los datos observados observe.ui.datasource.editor.actions.consolidate.title.tip=Consolidar los datos observados +observe.ui.datasource.editor.actions.data.copy=Base «%s» - Preparación de la copia \: %s - %s +observe.ui.datasource.editor.actions.data.delete=Base «%s» - Preparación de la eliminación de la base \: %s - %s +observe.ui.datasource.editor.actions.data.delete.result=Base «%s» - Eliminación de la marea %s - %s en la base. +observe.ui.datasource.editor.actions.data.export.result=Base «%s» - Exportación de la marea %s - %s desde la base. +observe.ui.datasource.editor.actions.data.import.add.missing.referential=Database «%s» - Insert all missing referentials\n%s +observe.ui.datasource.editor.actions.data.import.add.missing.referential.for.type=Base «%s» - Insertion de %s référentiels de type «%s»\:%s\#TODO +observe.ui.datasource.editor.actions.data.import.result=Base «%s» - Inserción de la marea %s - %s en la base. +observe.ui.datasource.editor.actions.data.import.title.require.add.missing.referential=Need to confirm missing referential insertion \#TODO observe.ui.datasource.editor.actions.exportData=Exportar los datos observados observe.ui.datasource.editor.actions.exportData.description=Exportar los datos observados en la base central -observe.ui.datasource.editor.actions.exportData.message.add.missing.referential=\t%s -observe.ui.datasource.editor.actions.exportData.message.add.missing.referentials2=Base «%s» - Insertion de %s référentiels de type «%s»\#TODO observe.ui.datasource.editor.actions.exportData.message.not.possible=La exportación no es posible (vea el mensaje anterior). observe.ui.datasource.editor.actions.exportData.message.operation.needFix=Seleccione las mareas a exportar. observe.ui.datasource.editor.actions.exportData.message.prepare.data=Preparación de los datos a exportar... @@ -1392,11 +1400,6 @@ observe.ui.datasource.editor.actions.synchro.data.deleteFromRight.tip=Eliminar l observe.ui.datasource.editor.actions.synchro.data.description=Gestión avanzada de los datos de los usuarios observe.ui.datasource.editor.actions.synchro.data.launch.operation=Recuperar los datos de las fuentes de datos observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Base «%s» - Datos recuperadas. -observe.ui.datasource.editor.actions.synchro.data.prepare.copyToTask=Base «%s» - Preparación de la copia \: %s - %s -observe.ui.datasource.editor.actions.synchro.data.prepare.deleteTask=Base «%s» - Preparación de la eliminación de la base \: %s - %s -observe.ui.datasource.editor.actions.synchro.data.result.delete.trip=Base «%s» - Eliminación de la marea %s - %s en la base. -observe.ui.datasource.editor.actions.synchro.data.result.export.trip=Base «%s» - Exportación de la marea %s - %s desde la base. -observe.ui.datasource.editor.actions.synchro.data.result.import.trip=Base «%s» - Inserción de la marea %s - %s en la base. observe.ui.datasource.editor.actions.synchro.data.task.copyToLeft=Copiar en la base de la izquierda \: <i>%s</i> - «<b>%s</b>» observe.ui.datasource.editor.actions.synchro.data.task.copyToRight=Copiar en la base de la derecha \: <i>%s</i> - «<b>%s</b>» observe.ui.datasource.editor.actions.synchro.data.task.deleteFromLeft=Eliminar en la base de la izquierda \: <i>%s</i> - «<b>%s</b>» @@ -1672,22 +1675,20 @@ observe.ui.message.reload.i18n=Vous avez modifié des traductions, le redémarra observe.ui.message.save.configuration=Guardar la configuración en el archivo %1$s observe.ui.message.select.report=Seleccione informe observe.ui.message.server.info=Información modo servidor -observe.ui.message.show.missing.referential=List of missing referential \#TODO observe.ui.message.show.usage.for.delete=El referencial %1$s "%2$s" no se puede eliminar sin hacer una sustitución antes. observe.ui.message.show.usage.for.delete2=Los objetos están usando actualmente las referencias que se enumeran a continuación. observe.ui.message.show.usage.for.delete3=Elija una referencia de reemplazo para poder borrar. observe.ui.message.show.usage.for.desactivated=El referencial %1$s "%2$s" se desactivará. observe.ui.message.show.usage.for.desactivated2=Los objetos están usando actualmente las referencias que se enumeran a continuación.. observe.ui.message.show.usage.for.desactivated3=Estos objetos deben usar otro referencial (no desactivado) para poder actualizarse. -observe.ui.message.show.usage.for.missingReferentials2=There is some referentials present in «%s» source but not in the «%s» one. observe.ui.message.show.usages=Listas de usos de referenciales %1$s \: '%2$s' observe.ui.message.table.editBean.modified=El registro actual se ha modificado y es válido. observe.ui.message.table.editBean.modified.but.invalid=El registro actual se ha modificado pero no es válido. observe.ui.message.warning.will.be.delete=%1$s\n\nAtención, la exportación reemplazará la marea existente. +observe.ui.move.selectTarget=Select new parent node after move? \#TODO observe.ui.textArea.tip=<html><body><ul><li>To focus on next widget, use accelerator <b>Ctrl + Tab</b></li><li>To focus on previous widget, use accelerator <b>Ctrl + Shift + Tab</b></body></html> \#TODO observe.ui.title.about=A proposito de ObServe... observe.ui.title.can.not.delete.referentiel=Impossible eliminar un referencial en proceso de utilización... -observe.ui.title.can.not.export.data2=Impossible d'exporter les données vers la base «%s»... \#TODO observe.ui.title.can.not.export.obstuna=Impossible exportar los datos de obstuna... observe.ui.title.choose.db.dump=Seleccionar una copia de seguridad de base local observe.ui.title.choose.db.dump.directory=Seleccionar e directorio de destinación de la copia de seguridad ===================================== client/i18n/src/main/i18n/translations/observe_fr_FR.properties ===================================== @@ -1295,7 +1295,9 @@ observe.ui.action.test.server.tip=Cliquer pour valider la connexion au serveur observe.ui.action.translate=Traduire observe.ui.action.translate.tip=Traduire l'application observe.ui.action.validate.config.generateReport=Générer un rapport de validation +observe.ui.choice.apply=Appliquer observe.ui.choice.cancel=Annuler +observe.ui.choice.cancel.tip=Pour annuler, presser la touche ÉCHAP. observe.ui.choice.confirm.delete=Supprimer observe.ui.choice.confirm.insert=Confirmer l'insertion observe.ui.choice.confirm.replace=Remplacer @@ -1326,10 +1328,16 @@ observe.ui.datasource.editor.actions.consolidate.message.trip=Données calculée observe.ui.datasource.editor.actions.consolidate.start.trip=Démarrage de la consolidation pour la marée %s / %s (%s) observe.ui.datasource.editor.actions.consolidate.title=Consolider les données observateur observe.ui.datasource.editor.actions.consolidate.title.tip=Consolider les données observateur +observe.ui.datasource.editor.actions.data.copy=Source «%s» - Préparation de la recopie \: %s - %s +observe.ui.datasource.editor.actions.data.delete=Source «%s» - Préparation de la suppression \: %s - %s +observe.ui.datasource.editor.actions.data.delete.result=Source «%s» - Suppression de la marée %s - %s effectuée. +observe.ui.datasource.editor.actions.data.export.result=Source «%s» - Export de la marée %s - %s effectuée. +observe.ui.datasource.editor.actions.data.import.add.missing.referential=Source «%s» - Insertion de %d référentiels manquants\n%s +observe.ui.datasource.editor.actions.data.import.add.missing.referential.for.type=Source «%s» - Insertion de %s référentiels de type «%s» \:%s +observe.ui.datasource.editor.actions.data.import.result=Source «%s» - Insertion de la marée %s - %s effectuée. +observe.ui.datasource.editor.actions.data.import.title.require.add.missing.referential=Confirmation requise pour insérer les référentiels manquants observe.ui.datasource.editor.actions.exportData=Exporter les données observateurs observe.ui.datasource.editor.actions.exportData.description=Exporter les données observateurs vers la base centrale -observe.ui.datasource.editor.actions.exportData.message.add.missing.referential=\t%s -observe.ui.datasource.editor.actions.exportData.message.add.missing.referentials2=Source «%s» - Insertion de %s référentiels de type «%s» observe.ui.datasource.editor.actions.exportData.message.not.possible=L'opération d'export n'est pas possible (voir les messages précédents). observe.ui.datasource.editor.actions.exportData.message.operation.needFix=Veuillez sélectionner les marées à exporter. observe.ui.datasource.editor.actions.exportData.message.prepare.data=Préparation des données à exporter... @@ -1392,11 +1400,6 @@ observe.ui.datasource.editor.actions.synchro.data.deleteFromRight.tip=Supprimer observe.ui.datasource.editor.actions.synchro.data.description=Gestion avancée des données utilisateurs observe.ui.datasource.editor.actions.synchro.data.launch.operation=Récupérer les données des sources de données observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Source «%s» - Données récupérées. -observe.ui.datasource.editor.actions.synchro.data.prepare.copyToTask=Source «%s» - Préparation de la recopie \: %s - %s -observe.ui.datasource.editor.actions.synchro.data.prepare.deleteTask=Source «%s» - Préparation de la suppression \: %s - %s -observe.ui.datasource.editor.actions.synchro.data.result.delete.trip=Source «%s» - Suppression de la marée %s - %s effectuée. -observe.ui.datasource.editor.actions.synchro.data.result.export.trip=Source «%s» - Export de la marée %s - %s effectuée. -observe.ui.datasource.editor.actions.synchro.data.result.import.trip=Source «%s» - Insertion de la marée %s - %s effectuée. observe.ui.datasource.editor.actions.synchro.data.task.copyToLeft=Copier vers la base de gauche \: <i>%s</i> - «<b>%s</b>» observe.ui.datasource.editor.actions.synchro.data.task.copyToRight=Copier vers la base de droite \: <i>%s</i> - «<b>%s</b>» observe.ui.datasource.editor.actions.synchro.data.task.deleteFromLeft=Supprimer de la base de gauche \: <i>%s</i> - «<b>%s</b>» @@ -1672,22 +1675,20 @@ observe.ui.message.reload.i18n=Vous avez modifié des traductions, le redémarra observe.ui.message.save.configuration=Sauvegarde de la configuration dans le fichier %1$s observe.ui.message.select.report=Choisissez une requête  observe.ui.message.server.info=La base locale %1$s est démarrée en mode serveur. -observe.ui.message.show.missing.referential=Liste des référentiels manquants observe.ui.message.show.usage.for.delete=Le référentiel %1$s "%2$s" ne peut pas être supprimé sans effectuer au préalable un remplacement. observe.ui.message.show.usage.for.delete2=Des objets utilisent actuellement cet entité dont les références sont citées plus bas. observe.ui.message.show.usage.for.delete3=Pour pouvoir supprimer l'objet, vous devez choisir une autre référence de remplacement. observe.ui.message.show.usage.for.desactivated=Le référentiel %1$s "%2$s" va être désactivé. observe.ui.message.show.usage.for.desactivated2=Des objets utilisent actuellement cet entité dont les références sont citées plus bas. observe.ui.message.show.usage.for.desactivated3=Ces objets devront utiliser un autre référentiel (non désactivé) pour pouvoir être mis à jour. -observe.ui.message.show.usage.for.missingReferentials2=Il existe des référentiels présents dans la base «%s» mais non présents dans la base «%s». observe.ui.message.show.usages=Listes des utilisations du référentiel %1$s \: '%2$s' observe.ui.message.table.editBean.modified=L'entrée en cours d'édition a été modifiée et est valide. observe.ui.message.table.editBean.modified.but.invalid=L'entrée en cours d'édition a été modifiée, mais n'est pas valide. observe.ui.message.warning.will.be.delete=%1$s\n\nAttention, l'export remplacera la marée existante. +observe.ui.move.selectTarget=Se positionner sur le nœud destination après le déplacement ? observe.ui.textArea.tip=<html><body><ul><li>Pour accéder au composant suivant, utilisez les raccourci clavier <b>Ctrl + Tab</b></li><li>Pour accéder au composant précédent, utilisez les raccourci clavier <b>Ctrl + Shift + Tab</b></body></html> observe.ui.title.about=A propos d'ObServe... observe.ui.title.can.not.delete.referentiel=Impossible de supprimer un référentiel en cours d'utilisation... -observe.ui.title.can.not.export.data2=Impossible d'exporter les données vers la base «%s»... observe.ui.title.can.not.export.obstuna=Impossible d'exporter des données d'obstuna... observe.ui.title.choose.db.dump=Choisir une sauvegarder de base locale observe.ui.title.choose.db.dump.directory=Choisir le répertoire de destination de la sauvegarde ===================================== models/dto/java/src/main/java/fr/ird/observe/dto/referential/common/ProgramReference.java ===================================== @@ -37,7 +37,7 @@ import static io.ultreia.java4all.i18n.I18n.t; @GenerateJavaBeanDefinition public class ProgramReference extends GeneratedProgramReference { - public static Comparator<ProgramReference> COMPARATOR_WITH_GEAR_PREFIX = Comparator.comparing(p -> p.getGearTypePrefix() + " " + p.getLabel()); + public static Comparator<ProgramReference> COMPARATOR_WITH_GEAR_PREFIX = Comparator.<ProgramReference>comparingInt(p->isProgramLongline(p) ? 0 : -1).thenComparing(p -> p.getGearTypePrefix() + " " + p.getLabel()); public static boolean isProgramLongline(ProgramReference programDtoRef) { boolean result = false; ===================================== pom.xml ===================================== @@ -147,7 +147,7 @@ <maven.build.timestamp.format>dd/MM/yyyy HH:mm z</maven.build.timestamp.format> <buildDate>${maven.build.timestamp}</buildDate> - <toolkit.version>5.0.2-SNAPSHOT</toolkit.version> + <toolkit.version>5.0.2</toolkit.version> <lib.version.ognl>3.1.28</lib.version.ognl> <!--can't use 1.4.197 (date has changed + blob also)--> ===================================== services/api/src/main/java/fr/ird/observe/services/service/data/NavigationResult.java ===================================== @@ -77,4 +77,8 @@ public class NavigationResult implements ObserveDto { public Date getTimestamp() { return timestamp; } + + public ProgramReference getProgram(String programId) { + return programs.stream().filter(p->programId.equals(p.getId())).findFirst().orElseThrow(); + } } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/c1620875650a55fab1e9ba07… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/c1620875650a55fab1e9ba07… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] Problème sur la gestion des référentiels manquant lors d'un import - Closes #1784
by Tony CHEMIT 10 Feb '21

10 Feb '21
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: c1620875 by Tony Chemit at 2021-02-10T18:23:08+01:00 Problème sur la gestion des référentiels manquant lors d&#39;un import - Closes #1784 - - - - - 1 changed file: - services/local-impl/src/main/java/fr/ird/observe/services/local/service/referential/ReferentialShellBuilder.java Changes: ===================================== services/local-impl/src/main/java/fr/ird/observe/services/local/service/referential/ReferentialShellBuilder.java ===================================== @@ -42,22 +42,6 @@ public class ReferentialShellBuilder { private final GetEntityReferentialShellVisitor visitor; - private ReferentialShellBuilder(ImmutableSetStringMap incomingReferentialIds) { - visitor = new GetEntityReferentialShellVisitor(incomingReferentialIds); - } - - public static ReferentialShellBuilder builder(ImmutableSetStringMap incomingReferentialIds) { - return new ReferentialShellBuilder(incomingReferentialIds); - } - - void scan(TopiaEntity entity) { - entity.accept(visitor); - } - - public ImmutableSetStringMap build() { - return visitor.missingReferentialIds.build(); - } - private static class GetEntityReferentialShellVisitor implements TopiaEntityVisitor { private final Set<String> hitIds; @@ -100,11 +84,11 @@ public class ReferentialShellBuilder { @Override public void visit(TopiaEntity entity, String propertyName, Class<?> collectionType, Class<?> type, Object value) { - if (TopiaEntity.class.isAssignableFrom(type)) - for (Object child : ((Collection<?>) value)) { - ((TopiaEntity) child).accept(this); + if (TopiaEntity.class.isAssignableFrom(type)) { + for (Object child : ((Collection<?>) value)) { + ((TopiaEntity) child).accept(this); + } } - } @Override @@ -120,4 +104,20 @@ public class ReferentialShellBuilder { } } + public static ReferentialShellBuilder builder(ImmutableSetStringMap incomingReferentialIds) { + return new ReferentialShellBuilder(incomingReferentialIds); + } + + private ReferentialShellBuilder(ImmutableSetStringMap incomingReferentialIds) { + visitor = new GetEntityReferentialShellVisitor(incomingReferentialIds); + } + + void scan(TopiaEntity entity) { + entity.accept(visitor); + } + + public ImmutableSetStringMap build() { + return visitor.missingReferentialIds.build(); + } + } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/c1620875650a55fab1e9ba07e… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/c1620875650a55fab1e9ba07e… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop-7.x] Problème sur la gestion des référentiels manquant lors d'un import - Closes #1784
by Tony CHEMIT 10 Feb '21

10 Feb '21
Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 87dd7e14 by Tony Chemit at 2021-02-10T18:11:16+01:00 Problème sur la gestion des référentiels manquant lors d&#39;un import - Closes #1784 - - - - - 1 changed file: - services-local/src/main/java/fr/ird/observe/services/local/service/referential/ReferentialShellBuilder.java Changes: ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/referential/ReferentialShellBuilder.java ===================================== @@ -28,6 +28,7 @@ import fr.ird.observe.spi.map.ImmutableSetStringMap; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaEntityVisitor; +import java.util.Collection; import java.util.Set; import java.util.TreeSet; @@ -99,7 +100,11 @@ public class ReferentialShellBuilder { @Override public void visit(TopiaEntity entity, String propertyName, Class<?> collectionType, Class<?> type, Object value) { - + if (TopiaEntity.class.isAssignableFrom(type)) { + for (Object child : ((Collection<?>) value)) { + ((TopiaEntity) child).accept(this); + } + } } @Override View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/87dd7e14da1f7ce7eb956809b… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/87dd7e14da1f7ce7eb956809b… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] fix application-assembly profiles: should be able to get a minimal assembly...
by Tony CHEMIT 10 Feb '21

10 Feb '21
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: bd51318e by Tony Chemit at 2021-02-10T17:32:01+01:00 fix application-assembly profiles: should be able to get a minimal assembly zip on not release build. - - - - - 2 changed files: - client/runner/pom.xml - pom.xml Changes: ===================================== client/runner/pom.xml ===================================== @@ -261,9 +261,20 @@ <goal>run</goal> </goals> </execution> + <execution> + <id>Prepare release files</id> + <phase>integration-test</phase> + <configuration> + <target> + <copy failonerror="true" overwrite="true" file="${project.build.directory}/${project.build.finalName}.jar" tofile="${project.build.directory}/${applicationJarName}.jar" /> + </target> + </configuration> + <goals> + <goal>run</goal> + </goals> + </execution> </executions> </plugin> - </plugins> </build> @@ -280,22 +291,17 @@ <properties> <devMode>false</devMode> </properties> - <build> - <plugins> - <plugin> <artifactId>maven-antrun-plugin</artifactId> <inherited>false</inherited> <executions> - <execution> <id>Prepare release files</id> <phase>integration-test</phase> <configuration> <target> - <copy failonerror="true" overwrite="true" file="${project.build.directory}/${project.build.finalName}.jar" tofile="${project.build.directory}/${applicationJarName}.jar" /> <copy failonerror="true" overwrite="true" file="${project.build.directory}/${project.build.finalName}.exe" tofile="${project.build.directory}/${applicationJarName}.exe" /> </target> </configuration> @@ -305,9 +311,9 @@ </execution> </executions> </plugin> - </plugins> </build> </profile> + </profiles> </project> ===================================== pom.xml ===================================== @@ -24,7 +24,7 @@ <parent> <groupId>io.ultreia.maven</groupId> <artifactId>pom</artifactId> - <version>2021.8</version> + <version>2021.9</version> </parent> <groupId>fr.ird.observe</groupId> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/bd51318e2eec8d0e117e07611… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/bd51318e2eec8d0e117e07611… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] fix application-assembly profiles: should be able to get a minimal assembly...
by Tony CHEMIT 10 Feb '21

10 Feb '21
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 1fd71dca by Tony Chemit at 2021-02-10T17:15:40+01:00 fix application-assembly profiles: should be able to get a minimal assembly zip on not release build. - - - - - 1 changed file: - pom.xml Changes: ===================================== pom.xml ===================================== @@ -24,7 +24,7 @@ <parent> <groupId>io.ultreia.maven</groupId> <artifactId>pom</artifactId> - <version>2021.8</version> + <version>2021.9</version> </parent> <groupId>fr.ird.observe</groupId> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/1fd71dcae9da83c749b6d0001… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/1fd71dcae9da83c749b6d0001… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] Fix simple gitlab build
by Tony CHEMIT 10 Feb '21

10 Feb '21
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: efc3fb98 by Tony Chemit at 2021-02-10T16:01:57+01:00 Fix simple gitlab build - - - - - 1 changed file: - client/runner/pom.xml Changes: ===================================== client/runner/pom.xml ===================================== @@ -261,9 +261,21 @@ <goal>run</goal> </goals> </execution> + <execution> + <id>Prepare release files</id> + <phase>integration-test</phase> + <configuration> + <target> + <copy failonerror="true" overwrite="true" file="${project.build.directory}/${project.build.finalName}.jar" tofile="${project.build.directory}/${applicationJarName}.jar" /> + <copy failonerror="true" overwrite="true" file="${project.build.directory}/${project.build.finalName}.exe" tofile="${project.build.directory}/${applicationJarName}.exe" /> + </target> + </configuration> + <goals> + <goal>run</goal> + </goals> + </execution> </executions> </plugin> - </plugins> </build> @@ -280,34 +292,6 @@ <properties> <devMode>false</devMode> </properties> - - <build> - - <plugins> - - <plugin> - <artifactId>maven-antrun-plugin</artifactId> - <inherited>false</inherited> - <executions> - - <execution> - <id>Prepare release files</id> - <phase>integration-test</phase> - <configuration> - <target> - <copy failonerror="true" overwrite="true" file="${project.build.directory}/${project.build.finalName}.jar" tofile="${project.build.directory}/${applicationJarName}.jar" /> - <copy failonerror="true" overwrite="true" file="${project.build.directory}/${project.build.finalName}.exe" tofile="${project.build.directory}/${applicationJarName}.exe" /> - </target> - </configuration> - <goals> - <goal>run</goal> - </goals> - </execution> - </executions> - </plugin> - - </plugins> - </build> </profile> </profiles> </project> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/efc3fb98912fe9034d6a877d1… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/efc3fb98912fe9034d6a877d1… You're receiving this email because of your account on gitlab.com.
1 0
0 0
  • ← Newer
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.