Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: db511b17 by Tony Chemit at 2020-06-26T12:57:58+02:00 Classement Calée / FOBs dans l'arbre - Closes #1506 - - - - - 9 changed files: - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/edit/actions/SaveActionSupport.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/list/actions/MoveMultipleDataRequestSupport.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/open/actions/DefaultMoveSingleDataRequest.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/open/actions/SaveActionSupport.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/open/actions/TripUIMoveSingleActionSupport.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ref/actions/Save.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/tree/navigation/NavigationTree.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/tree/navigation/nodes/NavigationTreeNodeSupport.java - client-datasource-editor-ps/src/main/java/fr/ird/observe/client/datasource/editor/tree/navigation/nodes/data/ps/obs/ActivitySeineNavigationTreeNode.java Changes: ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/edit/actions/SaveActionSupport.java ===================================== @@ -24,7 +24,6 @@ package fr.ird.observe.client.datasource.editor.content.data.edit.actions; import fr.ird.observe.client.datasource.api.ObserveDataSourcesManagerApplicationComponent; import fr.ird.observe.client.datasource.editor.content.ContentMode; -import fr.ird.observe.client.datasource.editor.content.ContentUI; import fr.ird.observe.client.datasource.editor.content.actions.ContentUIActionSupport; import fr.ird.observe.client.datasource.editor.content.data.edit.ContentEditUI; import fr.ird.observe.client.datasource.editor.content.data.edit.ContentEditUIModel; @@ -42,6 +41,8 @@ import fr.ird.observe.navigation.tree.MultipleReferenceContainerNode; import fr.ird.observe.navigation.tree.ReferenceNode; import fr.ird.observe.navigation.tree.SingleReferenceContainerNode; import fr.ird.observe.spi.DtoModelHelper; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.nuiton.jaxx.validator.swing.SwingValidatorUtil; import javax.swing.KeyStroke; @@ -58,6 +59,8 @@ import static io.ultreia.java4all.i18n.I18n.t; */ public abstract class SaveActionSupport<D extends DataDto, R extends DataDtoReference<D, R>, U extends ContentEditUI<D, R, U>> extends ContentUIActionSupport<U> { + private static final Logger log = LogManager.getLogger(SaveActionSupport.class); + protected SaveActionSupport(Class<D> dtoType) { this(dtoType, ObserveKeyStrokesSupport.KEY_STROKE_SAVE_DATA); } @@ -101,42 +104,82 @@ public abstract class SaveActionSupport<D extends DataDto, R extends DataDtoRefe R beanReference = DtoModelHelper.toReference(referentialLocale, bean); + int oldPosition; + if (notPersisted) { + oldPosition = parent.getChildCount(); + } else { + oldPosition = parent.getIndex(node); + } + if (notPersisted) { - // on passe en mode mise à jour + // now model is updating model.setMode(ContentMode.UPDATE); + // stop editing ui.stopEdit(); + // remove unsaved node (will close opened content) tree.removeNode(node); + // create node node = nodeFactory.apply(beanReference); - tree.insertNode(parent, node, 0); - tree.reloadNode(parent, false); + // compute correct position + int position = parent.getNewPosition(beanReference); + + // insert new node + log.info(String.format("Insert node: %s at position: %d", node, position)); + tree.insertNode(parent, node, position); - // on sélectionne le nouveau noeud + // select back node tree.selectSafeNode(node); + + // apply extra actions from previous opened content (go back to correct tab if any, ...) @SuppressWarnings({"RedundantExplicitVariableType", "unchecked"}) U newUi = (U) getDataSourceEditor().getContentUIManager().getSelectedContentUI(); newUi.resetFromPreviousUi(ui); + // reload from parent to root + tree.refreshToRoot(parent); + } else { - // on repaint le noeud et ses enfants + // compute correct position + int position = parent.getNewPosition(beanReference); + log.info(String.format("Existing node: %s at position: %d (previous position: %d)", node, position, oldPosition)); + if (oldPosition != position) { + + // move node to correct position + tree.moveNode(parent, node, position); + + // select it back + tree.selectSafeNode(node); + + // apply extra actions from previous opened content (go back to correct tab if any, ...) + @SuppressWarnings({"RedundantExplicitVariableType", "unchecked"}) U newUi = (U) getDataSourceEditor().getContentUIManager().getSelectedContentUI(); + newUi.resetFromPreviousUi(ui); + + } else { + + // do not move in tree, just restart edition + ui.resetEdit(); + } + + // repaint selected node and his children tree.reloadSelectedNode(false, true); - ui.resetEdit(); + // reload from parent to root + tree.refreshToRoot(parent); + } -// afterSave(ui, bean, node, notPersisted); } + @SuppressWarnings({"rawtypes", "unchecked"}) protected Function<R, ReferenceNode<D, R>> getNodeFactory(NavigationTreeNodeSupport<?> parent) { Function<R, ReferenceNode<D, R>> nodeFactory; if (parent instanceof SingleReferenceContainerNode) { - //noinspection unchecked,rawtypes nodeFactory = ((SingleReferenceContainerNode) parent)::newSingleChildNode; } else { - //noinspection unchecked,rawtypes nodeFactory = ((MultipleReferenceContainerNode) parent)::newChildNode; } return nodeFactory; ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/list/actions/MoveMultipleDataRequestSupport.java ===================================== @@ -176,7 +176,7 @@ public abstract class MoveMultipleDataRequestSupport<ChildDto extends IdDto, Chi MultipleReferenceContainerNode<ChildDto, Child> newChildContainerNode = MultipleReferenceContainerNode.down(getReferenceType(), newParentNode); for (ReferenceNode<ChildDto, Child> node : nodeToMove) { - tree.insertNode(newChildContainerNode, node); + tree.insertNode((NavigationTreeNodeSupport<?>) newChildContainerNode, node); } tree.selectSafeNode(newChildContainerNode); ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/open/actions/DefaultMoveSingleDataRequest.java ===================================== @@ -23,6 +23,7 @@ package fr.ird.observe.client.datasource.editor.content.data.open.actions; */ import fr.ird.observe.client.datasource.editor.tree.navigation.NavigationTree; +import fr.ird.observe.client.datasource.editor.tree.navigation.nodes.NavigationTreeNodeSupport; import fr.ird.observe.dto.IdDto; import fr.ird.observe.dto.reference.DtoReference; import fr.ird.observe.navigation.tree.MultipleReferenceContainerNode; @@ -70,7 +71,7 @@ public class DefaultMoveSingleDataRequest<ChildDto extends IdDto, Child extends MultipleReferenceContainerNode<ChildDto, Child> newChildContainerNode = MultipleReferenceContainerNode.down(getReferenceType(), newParentNode); // insert node into new child container node - tree.insertNode(newChildContainerNode, node); + tree.insertNode((NavigationTreeNodeSupport<?>) newChildContainerNode, node); // reload new child container node tree.reloadNode(newChildContainerNode, false); @@ -83,6 +84,8 @@ public class DefaultMoveSingleDataRequest<ChildDto extends IdDto, Child extends // select final node tree.selectSafeNode(node); + + tree.refreshToRoot((NavigationTreeNodeSupport<?>) node.getParent()); } } ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/open/actions/SaveActionSupport.java ===================================== @@ -38,10 +38,11 @@ import fr.ird.observe.navigation.model.edit.ObserveEditNode; import fr.ird.observe.navigation.tree.MultipleReferenceContainerNode; import fr.ird.observe.navigation.tree.ReferenceNode; import fr.ird.observe.spi.DtoModelHelper; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.nuiton.jaxx.validator.swing.SwingValidatorUtil; import java.awt.event.ActionEvent; -import java.util.Objects; import static io.ultreia.java4all.i18n.I18n.n; import static io.ultreia.java4all.i18n.I18n.t; @@ -53,6 +54,8 @@ import static io.ultreia.java4all.i18n.I18n.t; */ public abstract class SaveActionSupport<D extends DataDto, R extends DataDtoReference<D, R>, U extends ContentOpenableUI<D, R, U>> extends ContentUIActionSupport<U> { + private static final Logger log = LogManager.getLogger(SaveActionSupport.class); + protected SaveActionSupport(Class<D> dtoType) { super(n("observe.action.save"), null, "save", ObserveKeyStrokesSupport.KEY_STROKE_SAVE_DATA); setTooltipText(t("observe.action.save.data.tip", ObserveI18nDecoratorHelper.getTypeI18nKey(dtoType))); @@ -93,9 +96,7 @@ public abstract class SaveActionSupport<D extends DataDto, R extends DataDtoRefe MultipleReferenceContainerNode<D, R> referenceContainerNode = model.getReferenceContainerNode(tree); - ReferenceNode<?, ?> parentReferenceNode = model.getParentReferenceNode(tree); - - boolean containerNodeAreNotTheSame = !Objects.equals(referenceContainerNode, parentReferenceNode); + NavigationTreeNodeSupport<?> parent = (NavigationTreeNodeSupport<?>) node.getParent(); ReferentialLocale referentialLocale = getDecoratorService().getReferentialLocale(); @@ -110,48 +111,70 @@ public abstract class SaveActionSupport<D extends DataDto, R extends DataDtoRefe if (notPersisted) { - // on passe en mode mise à jour + // now model is updating model.setMode(ContentMode.UPDATE); + // stop editing ui.stopEdit(); + // remove unsaved node (will close opened content) tree.removeNode(node); + + // reload container node (to get correct data inside) tree.reloadNode(referenceContainerNode, false); + // create node node = referenceContainerNode.newChildNode(beanReference); - tree.insertNode(referenceContainerNode, node); + // compute correct position + int position = ((NavigationTreeNodeSupport<?>) referenceContainerNode).getNewPosition(beanReference); - if (containerNodeAreNotTheSame) { -// ((NavigationTreeNodeSupport) referenceContainerNode).reload(); - tree.reloadNode(parentReferenceNode, false); - } + // insert new node + log.info(String.format("Insert node: %s at position: %d", node, position)); + tree.insertNode(referenceContainerNode, node, position); - // on sélectionne le nouveau noeud + // select back node tree.selectSafeNode(node); + + // apply extra actions from previous opened content (go back to correct tab if any, ...) + @SuppressWarnings({"RedundantExplicitVariableType", "unchecked"}) U newUi = (U) getDataSourceEditor().getContentUIManager().getSelectedContentUI(); + newUi.resetFromPreviousUi(ui); + + // reload from parent to root + tree.refreshToRoot(parent); + } else { - int position = referenceContainerNode.getChildrenPosition(beanReference); + // compute correct position + int position = ((NavigationTreeNodeSupport<?>) referenceContainerNode).getNewPosition(beanReference); + log.info(String.format("Existing node: %s at position: %d (previous position: %d)", node, position, oldPosition)); if (oldPosition != position) { - // on doit repositionner le noeud + // move node to correct position tree.moveNode(referenceContainerNode, node, position); - // et le selectionner + // select it back tree.selectSafeNode(node); + + // apply extra actions from previous opened content (go back to correct tab if any, ...) + @SuppressWarnings({"RedundantExplicitVariableType", "unchecked"}) U newUi = (U) getDataSourceEditor().getContentUIManager().getSelectedContentUI(); + newUi.resetFromPreviousUi(ui); + } else { + + // do not move in tree, just restart edition ui.resetEdit(); } -// tree.reloadNode(referenceContainerNode, false); - + // reload node data ((NavigationTreeNodeSupport<?>) node).reload(); - if (containerNodeAreNotTheSame) { -// ((NavigationTreeNodeSupport) parentReferenceNode).reload(); - tree.reloadNode(parentReferenceNode, false); - } - // on repaint le noeud et ses enfants + + // repaint selected node and his children tree.reloadSelectedNode(false, true); + + // reload from parent to root + tree.refreshToRoot(parent); + } afterSave(ui, bean, node, notPersisted); } @@ -160,18 +183,5 @@ public abstract class SaveActionSupport<D extends DataDto, R extends DataDtoRefe // Extra code } -// protected void repaintTripNode(U ui) { -// -// NavigationTree tree = getNavigationTree(); -// -// NavigationTreeNodeSupport tripNode = tree.getSelectedNode(); -// while (!(tripNode instanceof ProgramSeineNavigationTreeNode || tripNode instanceof ProgramLonglineNavigationTreeNode)) { -// tripNode = tripNode.getParent(); -// } -// log.info("Refresh trip node : " + tripNode); -// tree.reloadNode(tripNode, false); -// -// } - } ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/data/open/actions/TripUIMoveSingleActionSupport.java ===================================== @@ -24,6 +24,7 @@ package fr.ird.observe.client.datasource.editor.content.data.open.actions; import fr.ird.observe.client.datasource.api.ObserveDataSourcesManagerApplicationComponent; import fr.ird.observe.client.datasource.editor.content.ContentUI; import fr.ird.observe.client.datasource.editor.tree.navigation.NavigationTree; +import fr.ird.observe.client.datasource.editor.tree.navigation.nodes.NavigationTreeNodeSupport; import fr.ird.observe.client.datasource.editor.tree.navigation.nodes.RootNavigationTreeNode; import fr.ird.observe.dto.data.DataDto; import fr.ird.observe.dto.reference.DataDtoReference; @@ -62,7 +63,7 @@ public abstract class TripUIMoveSingleActionSupport<ChildDto extends DataDto, Ch if (!parentContainerReferenceNode.getChildrenReferences().contains(newParentReference)) { // Need to create this node ReferenceNode<ProgramDto, ProgramReference> programNode = parentContainerReferenceNode.newChildNode(newParentReference); - tree.insertNode(parentContainerReferenceNode, programNode); + tree.insertNode((NavigationTreeNodeSupport<?>)parentContainerReferenceNode, programNode); } } ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ref/actions/Save.java ===================================== @@ -89,6 +89,7 @@ public class Save<D extends ReferentialDto, R extends ReferentialDtoReference<D, } } + @SuppressWarnings({"rawtypes", "unchecked"}) protected boolean doSave(U ui, D bean, boolean notPersisted) { ContentReferenceUIModel<D, R> model = ui.getModel(); @@ -131,15 +132,13 @@ public class Save<D extends ReferentialDto, R extends ReferentialDtoReference<D, .collect(Collectors.toList()); if (ProgramDto.class.equals(beanType)) { - //noinspection unchecked referenceList = (List) ProgramReference.filterGearType((List) referenceList, ((ProgramDto) bean).getGearType()); } Pair<Boolean, R> result = UsageForDesactivateUIHandler.showUsages(bean, usages, referenceList); - boolean willsave = result.getLeft(); - + boolean willSave = result.getLeft(); replaceReference = result.getRight(); - if (!willsave) { + if (!willSave) { log.debug("User refuses to continue, skip saving..."); return false; } @@ -170,7 +169,8 @@ public class Save<D extends ReferentialDto, R extends ReferentialDtoReference<D, // add the program in tree if (tree.getModel().getConfig().isShowEmptyProgram()) { RootNavigationTreeNode rootNode = tree.getRootNode(); - tree.insertNode(rootNode, getDecoratorService().getReferentialLocale(), (ProgramDto) bean); + ReferenceNode<ProgramDto, ProgramReference> newNode = rootNode.newChildNode(((ProgramDto) bean).toReference(getDecoratorService().getReferentialLocale())); + tree.insertNode(rootNode, newNode); } } else { // update the program in tree ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/tree/navigation/NavigationTree.java ===================================== @@ -29,7 +29,6 @@ import fr.ird.observe.client.datasource.editor.tree.navigation.nodes.NavigationT import fr.ird.observe.client.datasource.editor.tree.navigation.nodes.RootNavigationTreeNode; import fr.ird.observe.dto.IdDto; import fr.ird.observe.dto.reference.DtoReference; -import fr.ird.observe.dto.referential.ReferentialLocale; import fr.ird.observe.navigation.model.DtoModelNavigationModel; import fr.ird.observe.navigation.model.ObserveNavigationNode; import fr.ird.observe.navigation.model.edit.ObserveEditModel; @@ -185,16 +184,10 @@ public class NavigationTree extends JXTree { getModel().insertNodeInto(node, parentNode, position); } - public <ChildDto extends IdDto, Child extends DtoReference<ChildDto, Child>> void insertNode(MultipleReferenceContainerNode<ChildDto, Child> parentNode, ReferentialLocale referentialLocale, ChildDto dto) { - Child reference = DtoModelHelper.toReference(referentialLocale, dto); - ReferenceNode<ChildDto, Child> referenceNode = parentNode.newChildNode(reference); - insertNode(parentNode, referenceNode); - } - - public <ChildDto extends IdDto, Child extends DtoReference<ChildDto, Child>> void insertNode(MultipleReferenceContainerNode<ChildDto, Child> parentNode, ReferenceNode<ChildDto, Child> node) { - Child reference = node.getReference(); - int position = reference.isPersisted() ? parentNode.getNodePosition(reference) : parentNode.getChildCount(); - insertNode(parentNode, node, position); + public <ChildDto extends IdDto, Child extends DtoReference<ChildDto, Child>> void insertNode(NavigationTreeNodeSupport<?> parentNode, ReferenceNode<ChildDto, Child> referenceNode) { + Child reference = referenceNode.getReference(); + int position = parentNode.getNewPosition(reference); + insertNode(parentNode, referenceNode, position); } /** @@ -246,7 +239,8 @@ public class NavigationTree extends JXTree { public <D extends IdDto, R extends DtoReference<D, R>> void addUnsavedNode(MultipleReferenceContainerNode<D, R> parentNode) { ReferenceNode<D, R> result = parentNode.newChildNode(((NavigationTreeNodeSupport<?>) parentNode).getId()); - insertNode(parentNode, result); + int childCount = parentNode.getChildCount(); + insertNode(parentNode, result, childCount); afterAddUnsavedNode(parentNode, result); } ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/tree/navigation/nodes/NavigationTreeNodeSupport.java ===================================== @@ -22,9 +22,11 @@ package fr.ird.observe.client.datasource.editor.tree.navigation.nodes; * #L% */ +import fr.ird.observe.dto.reference.DtoReference; import fr.ird.observe.navigation.model.ObserveNavigationNode; import fr.ird.observe.navigation.model.edit.ObserveEditModelApplicationComponent; import fr.ird.observe.navigation.model.select.ObserveSelectModelApplicationComponent; +import fr.ird.observe.navigation.tree.MultipleReferenceContainerNode; import javax.swing.JComponent; import java.awt.Color; @@ -268,4 +270,24 @@ public abstract class NavigationTreeNodeSupport<O> extends ObserveTreeNodeSuppor public int hashCode() { return Objects.hash(getData()); } + + /** + * Compute new node position from his given bean reference + * + * @param beanReference bean we want to insert from this parent + * @return position where to insert a node with the given bean reference + */ + @SuppressWarnings({"rawtypes", "unchecked"}) + public int getNewPosition(DtoReference beanReference) { + if (beanReference.isNotPersisted()) { + // not persisted data is always on bottom + return getChildCount(); + } + if (this instanceof MultipleReferenceContainerNode) { + // when multiple container, let's ask him the correction position + return ((MultipleReferenceContainerNode) this).getNodePosition(beanReference); + } + // in other cases, always on bottom (if not, do override this method) + return getChildCount(); + } } ===================================== client-datasource-editor-ps/src/main/java/fr/ird/observe/client/datasource/editor/tree/navigation/nodes/data/ps/obs/ActivitySeineNavigationTreeNode.java ===================================== @@ -32,6 +32,7 @@ import fr.ird.observe.dto.data.ps.observation.FloatingObjectReference; import fr.ird.observe.dto.data.ps.observation.SetDto; import fr.ird.observe.dto.data.ps.observation.SetReference; import fr.ird.observe.dto.reference.DataDtoReferenceSet; +import fr.ird.observe.dto.reference.DtoReference; import fr.ird.observe.navigation.model.edit.seine.node.ObserveSeineActivityEditNode; import fr.ird.observe.navigation.model.select.seine.node.ObserveSeineActivitySelectNode; import fr.ird.observe.navigation.tree.MultipleReferenceContainerNode; @@ -133,5 +134,21 @@ public class ActivitySeineNavigationTreeNode extends ReferenceNavigationTreeNode public SetSeineNavigationTreeNode newSingleChildNode(String parentId) { return newSingleChildNode(new SetReference(new SetDto(), null)); } + + @SuppressWarnings("rawtypes") + @Override + public int getNewPosition(DtoReference beanReference) { + if (beanReference.isNotPersisted()) { + // not persisted, always at bottom + return getChildCount(); + } + if (beanReference instanceof SetReference) { + // when is a persisted set, then always on top + return 0; + } + + return super.getNewPosition(beanReference); + + } } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/db511b177a0ed6d5fc29763412... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/db511b177a0ed6d5fc29763412... You're receiving this email because of your account on gitlab.com.