Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe

Commits:

9 changed files:

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;
    24 24
     
    
    25 25
     import fr.ird.observe.client.datasource.api.ObserveDataSourcesManagerApplicationComponent;
    
    26 26
     import fr.ird.observe.client.datasource.editor.content.ContentMode;
    
    27
    -import fr.ird.observe.client.datasource.editor.content.ContentUI;
    
    28 27
     import fr.ird.observe.client.datasource.editor.content.actions.ContentUIActionSupport;
    
    29 28
     import fr.ird.observe.client.datasource.editor.content.data.edit.ContentEditUI;
    
    30 29
     import fr.ird.observe.client.datasource.editor.content.data.edit.ContentEditUIModel;
    
    ... ... @@ -42,6 +41,8 @@ import fr.ird.observe.navigation.tree.MultipleReferenceContainerNode;
    42 41
     import fr.ird.observe.navigation.tree.ReferenceNode;
    
    43 42
     import fr.ird.observe.navigation.tree.SingleReferenceContainerNode;
    
    44 43
     import fr.ird.observe.spi.DtoModelHelper;
    
    44
    +import org.apache.logging.log4j.LogManager;
    
    45
    +import org.apache.logging.log4j.Logger;
    
    45 46
     import org.nuiton.jaxx.validator.swing.SwingValidatorUtil;
    
    46 47
     
    
    47 48
     import javax.swing.KeyStroke;
    
    ... ... @@ -58,6 +59,8 @@ import static io.ultreia.java4all.i18n.I18n.t;
    58 59
      */
    
    59 60
     public abstract class SaveActionSupport<D extends DataDto, R extends DataDtoReference<D, R>, U extends ContentEditUI<D, R, U>> extends ContentUIActionSupport<U> {
    
    60 61
     
    
    62
    +    private static final Logger log = LogManager.getLogger(SaveActionSupport.class);
    
    63
    +
    
    61 64
         protected SaveActionSupport(Class<D> dtoType) {
    
    62 65
             this(dtoType, ObserveKeyStrokesSupport.KEY_STROKE_SAVE_DATA);
    
    63 66
         }
    
    ... ... @@ -101,42 +104,82 @@ public abstract class SaveActionSupport<D extends DataDto, R extends DataDtoRefe
    101 104
     
    
    102 105
             R beanReference = DtoModelHelper.toReference(referentialLocale, bean);
    
    103 106
     
    
    107
    +        int oldPosition;
    
    108
    +        if (notPersisted) {
    
    109
    +            oldPosition = parent.getChildCount();
    
    110
    +        } else {
    
    111
    +            oldPosition = parent.getIndex(node);
    
    112
    +        }
    
    113
    +
    
    104 114
             if (notPersisted) {
    
    105 115
     
    
    106
    -            // on passe en mode mise à jour
    
    116
    +            // now model is updating
    
    107 117
                 model.setMode(ContentMode.UPDATE);
    
    108 118
     
    
    119
    +            // stop editing
    
    109 120
                 ui.stopEdit();
    
    110 121
     
    
    122
    +            // remove unsaved node (will close opened content)
    
    111 123
                 tree.removeNode(node);
    
    112 124
     
    
    125
    +            // create node
    
    113 126
                 node = nodeFactory.apply(beanReference);
    
    114 127
     
    
    115
    -            tree.insertNode(parent, node, 0);
    
    116
    -            tree.reloadNode(parent, false);
    
    128
    +            // compute correct position
    
    129
    +            int position = parent.getNewPosition(beanReference);
    
    130
    +
    
    131
    +            // insert new node
    
    132
    +            log.info(String.format("Insert node: %s at position: %d", node, position));
    
    133
    +            tree.insertNode(parent, node, position);
    
    117 134
     
    
    118
    -            // on sélectionne le nouveau noeud
    
    135
    +            // select back node
    
    119 136
                 tree.selectSafeNode(node);
    
    137
    +
    
    138
    +            // apply extra actions from previous opened content (go back to correct tab if any, ...)
    
    120 139
                 @SuppressWarnings({"RedundantExplicitVariableType", "unchecked"}) U newUi = (U) getDataSourceEditor().getContentUIManager().getSelectedContentUI();
    
    121 140
                 newUi.resetFromPreviousUi(ui);
    
    122 141
     
    
    142
    +            // reload from parent to root
    
    143
    +            tree.refreshToRoot(parent);
    
    144
    +
    
    123 145
             } else {
    
    124 146
     
    
    125
    -            // on repaint le noeud et ses enfants
    
    147
    +            // compute correct position
    
    148
    +            int position = parent.getNewPosition(beanReference);
    
    149
    +            log.info(String.format("Existing node: %s at position: %d (previous position: %d)", node, position, oldPosition));
    
    150
    +            if (oldPosition != position) {
    
    151
    +
    
    152
    +                // move node to correct position
    
    153
    +                tree.moveNode(parent, node, position);
    
    154
    +
    
    155
    +                // select it back
    
    156
    +                tree.selectSafeNode(node);
    
    157
    +
    
    158
    +                // apply extra actions from previous opened content (go back to correct tab if any, ...)
    
    159
    +                @SuppressWarnings({"RedundantExplicitVariableType", "unchecked"}) U newUi = (U) getDataSourceEditor().getContentUIManager().getSelectedContentUI();
    
    160
    +                newUi.resetFromPreviousUi(ui);
    
    161
    +
    
    162
    +            } else {
    
    163
    +
    
    164
    +                // do not move in tree, just restart edition
    
    165
    +                ui.resetEdit();
    
    166
    +            }
    
    167
    +
    
    168
    +            // repaint selected node and his children
    
    126 169
                 tree.reloadSelectedNode(false, true);
    
    127 170
     
    
    128
    -            ui.resetEdit();
    
    171
    +            // reload from parent to root
    
    172
    +            tree.refreshToRoot(parent);
    
    173
    +
    
    129 174
             }
    
    130
    -//        afterSave(ui, bean, node, notPersisted);
    
    131 175
         }
    
    132 176
     
    
    177
    +    @SuppressWarnings({"rawtypes", "unchecked"})
    
    133 178
         protected Function<R, ReferenceNode<D, R>> getNodeFactory(NavigationTreeNodeSupport<?> parent) {
    
    134 179
             Function<R, ReferenceNode<D, R>> nodeFactory;
    
    135 180
             if (parent instanceof SingleReferenceContainerNode) {
    
    136
    -            //noinspection unchecked,rawtypes
    
    137 181
                 nodeFactory = ((SingleReferenceContainerNode) parent)::newSingleChildNode;
    
    138 182
             } else {
    
    139
    -            //noinspection unchecked,rawtypes
    
    140 183
                 nodeFactory = ((MultipleReferenceContainerNode) parent)::newChildNode;
    
    141 184
             }
    
    142 185
             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
    176 176
             MultipleReferenceContainerNode<ChildDto, Child> newChildContainerNode = MultipleReferenceContainerNode.down(getReferenceType(), newParentNode);
    
    177 177
     
    
    178 178
             for (ReferenceNode<ChildDto, Child> node : nodeToMove) {
    
    179
    -            tree.insertNode(newChildContainerNode, node);
    
    179
    +            tree.insertNode((NavigationTreeNodeSupport<?>) newChildContainerNode, node);
    
    180 180
             }
    
    181 181
             tree.selectSafeNode(newChildContainerNode);
    
    182 182
     
    

  • 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;
    23 23
      */
    
    24 24
     
    
    25 25
     import fr.ird.observe.client.datasource.editor.tree.navigation.NavigationTree;
    
    26
    +import fr.ird.observe.client.datasource.editor.tree.navigation.nodes.NavigationTreeNodeSupport;
    
    26 27
     import fr.ird.observe.dto.IdDto;
    
    27 28
     import fr.ird.observe.dto.reference.DtoReference;
    
    28 29
     import fr.ird.observe.navigation.tree.MultipleReferenceContainerNode;
    
    ... ... @@ -70,7 +71,7 @@ public class DefaultMoveSingleDataRequest<ChildDto extends IdDto, Child extends
    70 71
             MultipleReferenceContainerNode<ChildDto, Child> newChildContainerNode = MultipleReferenceContainerNode.down(getReferenceType(), newParentNode);
    
    71 72
     
    
    72 73
             // insert node into new child container node
    
    73
    -        tree.insertNode(newChildContainerNode, node);
    
    74
    +        tree.insertNode((NavigationTreeNodeSupport<?>) newChildContainerNode, node);
    
    74 75
     
    
    75 76
             // reload new child container node
    
    76 77
             tree.reloadNode(newChildContainerNode, false);
    
    ... ... @@ -83,6 +84,8 @@ public class DefaultMoveSingleDataRequest<ChildDto extends IdDto, Child extends
    83 84
     
    
    84 85
             // select final node
    
    85 86
             tree.selectSafeNode(node);
    
    87
    +
    
    88
    +        tree.refreshToRoot((NavigationTreeNodeSupport<?>) node.getParent());
    
    86 89
         }
    
    87 90
     
    
    88 91
     }

  • 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;
    38 38
     import fr.ird.observe.navigation.tree.MultipleReferenceContainerNode;
    
    39 39
     import fr.ird.observe.navigation.tree.ReferenceNode;
    
    40 40
     import fr.ird.observe.spi.DtoModelHelper;
    
    41
    +import org.apache.logging.log4j.LogManager;
    
    42
    +import org.apache.logging.log4j.Logger;
    
    41 43
     import org.nuiton.jaxx.validator.swing.SwingValidatorUtil;
    
    42 44
     
    
    43 45
     import java.awt.event.ActionEvent;
    
    44
    -import java.util.Objects;
    
    45 46
     
    
    46 47
     import static io.ultreia.java4all.i18n.I18n.n;
    
    47 48
     import static io.ultreia.java4all.i18n.I18n.t;
    
    ... ... @@ -53,6 +54,8 @@ import static io.ultreia.java4all.i18n.I18n.t;
    53 54
      */
    
    54 55
     public abstract class SaveActionSupport<D extends DataDto, R extends DataDtoReference<D, R>, U extends ContentOpenableUI<D, R, U>> extends ContentUIActionSupport<U> {
    
    55 56
     
    
    57
    +    private static final Logger log = LogManager.getLogger(SaveActionSupport.class);
    
    58
    +
    
    56 59
         protected SaveActionSupport(Class<D> dtoType) {
    
    57 60
             super(n("observe.action.save"), null, "save", ObserveKeyStrokesSupport.KEY_STROKE_SAVE_DATA);
    
    58 61
             setTooltipText(t("observe.action.save.data.tip", ObserveI18nDecoratorHelper.getTypeI18nKey(dtoType)));
    
    ... ... @@ -93,9 +96,7 @@ public abstract class SaveActionSupport<D extends DataDto, R extends DataDtoRefe
    93 96
     
    
    94 97
             MultipleReferenceContainerNode<D, R> referenceContainerNode = model.getReferenceContainerNode(tree);
    
    95 98
     
    
    96
    -        ReferenceNode<?, ?> parentReferenceNode = model.getParentReferenceNode(tree);
    
    97
    -
    
    98
    -        boolean containerNodeAreNotTheSame = !Objects.equals(referenceContainerNode, parentReferenceNode);
    
    99
    +        NavigationTreeNodeSupport<?> parent = (NavigationTreeNodeSupport<?>) node.getParent();
    
    99 100
     
    
    100 101
             ReferentialLocale referentialLocale = getDecoratorService().getReferentialLocale();
    
    101 102
     
    
    ... ... @@ -110,48 +111,70 @@ public abstract class SaveActionSupport<D extends DataDto, R extends DataDtoRefe
    110 111
     
    
    111 112
             if (notPersisted) {
    
    112 113
     
    
    113
    -            // on passe en mode mise à jour
    
    114
    +            // now model is updating
    
    114 115
                 model.setMode(ContentMode.UPDATE);
    
    115 116
     
    
    117
    +            // stop editing
    
    116 118
                 ui.stopEdit();
    
    117 119
     
    
    120
    +            // remove unsaved node (will close opened content)
    
    118 121
                 tree.removeNode(node);
    
    122
    +
    
    123
    +            // reload container node (to get correct data inside)
    
    119 124
                 tree.reloadNode(referenceContainerNode, false);
    
    120 125
     
    
    126
    +            // create node
    
    121 127
                 node = referenceContainerNode.newChildNode(beanReference);
    
    122 128
     
    
    123
    -            tree.insertNode(referenceContainerNode, node);
    
    129
    +            // compute correct position
    
    130
    +            int position = ((NavigationTreeNodeSupport<?>) referenceContainerNode).getNewPosition(beanReference);
    
    124 131
     
    
    125
    -            if (containerNodeAreNotTheSame) {
    
    126
    -//                ((NavigationTreeNodeSupport) referenceContainerNode).reload();
    
    127
    -                tree.reloadNode(parentReferenceNode, false);
    
    128
    -            }
    
    132
    +            // insert new node
    
    133
    +            log.info(String.format("Insert node: %s at position: %d", node, position));
    
    134
    +            tree.insertNode(referenceContainerNode, node, position);
    
    129 135
     
    
    130
    -            // on sélectionne le nouveau noeud
    
    136
    +            // select back node
    
    131 137
                 tree.selectSafeNode(node);
    
    138
    +
    
    139
    +            // apply extra actions from previous opened content (go back to correct tab if any, ...)
    
    140
    +            @SuppressWarnings({"RedundantExplicitVariableType", "unchecked"}) U newUi = (U) getDataSourceEditor().getContentUIManager().getSelectedContentUI();
    
    141
    +            newUi.resetFromPreviousUi(ui);
    
    142
    +
    
    143
    +            // reload from parent to root
    
    144
    +            tree.refreshToRoot(parent);
    
    145
    +
    
    132 146
             } else {
    
    133 147
     
    
    134
    -            int position = referenceContainerNode.getChildrenPosition(beanReference);
    
    148
    +            // compute correct position
    
    149
    +            int position = ((NavigationTreeNodeSupport<?>) referenceContainerNode).getNewPosition(beanReference);
    
    150
    +            log.info(String.format("Existing node: %s at position: %d (previous position: %d)", node, position, oldPosition));
    
    135 151
                 if (oldPosition != position) {
    
    136 152
     
    
    137
    -                // on doit repositionner le noeud
    
    153
    +                // move node to correct position
    
    138 154
                     tree.moveNode(referenceContainerNode, node, position);
    
    139 155
     
    
    140
    -                // et le selectionner
    
    156
    +                // select it back
    
    141 157
                     tree.selectSafeNode(node);
    
    158
    +
    
    159
    +                // apply extra actions from previous opened content (go back to correct tab if any, ...)
    
    160
    +                @SuppressWarnings({"RedundantExplicitVariableType", "unchecked"}) U newUi = (U) getDataSourceEditor().getContentUIManager().getSelectedContentUI();
    
    161
    +                newUi.resetFromPreviousUi(ui);
    
    162
    +
    
    142 163
                 } else {
    
    164
    +
    
    165
    +                // do not move in tree, just restart edition
    
    143 166
                     ui.resetEdit();
    
    144 167
                 }
    
    145 168
     
    
    146
    -//            tree.reloadNode(referenceContainerNode, false);
    
    147
    -
    
    169
    +            // reload node data
    
    148 170
                 ((NavigationTreeNodeSupport<?>) node).reload();
    
    149
    -            if (containerNodeAreNotTheSame) {
    
    150
    -//                ((NavigationTreeNodeSupport) parentReferenceNode).reload();
    
    151
    -                tree.reloadNode(parentReferenceNode, false);
    
    152
    -            }
    
    153
    -            // on repaint le noeud et ses enfants
    
    171
    +
    
    172
    +            // repaint selected node and his children
    
    154 173
                 tree.reloadSelectedNode(false, true);
    
    174
    +
    
    175
    +            // reload from parent to root
    
    176
    +            tree.refreshToRoot(parent);
    
    177
    +
    
    155 178
             }
    
    156 179
             afterSave(ui, bean, node, notPersisted);
    
    157 180
         }
    
    ... ... @@ -160,18 +183,5 @@ public abstract class SaveActionSupport<D extends DataDto, R extends DataDtoRefe
    160 183
             // Extra code
    
    161 184
         }
    
    162 185
     
    
    163
    -//    protected void repaintTripNode(U ui) {
    
    164
    -//
    
    165
    -//        NavigationTree tree = getNavigationTree();
    
    166
    -//
    
    167
    -//        NavigationTreeNodeSupport tripNode = tree.getSelectedNode();
    
    168
    -//        while (!(tripNode instanceof ProgramSeineNavigationTreeNode || tripNode instanceof ProgramLonglineNavigationTreeNode)) {
    
    169
    -//            tripNode = tripNode.getParent();
    
    170
    -//        }
    
    171
    -//        log.info("Refresh trip node : " + tripNode);
    
    172
    -//        tree.reloadNode(tripNode, false);
    
    173
    -//
    
    174
    -//    }
    
    175
    -
    
    176 186
     }
    
    177 187
     

  • 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;
    24 24
     import fr.ird.observe.client.datasource.api.ObserveDataSourcesManagerApplicationComponent;
    
    25 25
     import fr.ird.observe.client.datasource.editor.content.ContentUI;
    
    26 26
     import fr.ird.observe.client.datasource.editor.tree.navigation.NavigationTree;
    
    27
    +import fr.ird.observe.client.datasource.editor.tree.navigation.nodes.NavigationTreeNodeSupport;
    
    27 28
     import fr.ird.observe.client.datasource.editor.tree.navigation.nodes.RootNavigationTreeNode;
    
    28 29
     import fr.ird.observe.dto.data.DataDto;
    
    29 30
     import fr.ird.observe.dto.reference.DataDtoReference;
    
    ... ... @@ -62,7 +63,7 @@ public abstract class TripUIMoveSingleActionSupport<ChildDto extends DataDto, Ch
    62 63
             if (!parentContainerReferenceNode.getChildrenReferences().contains(newParentReference)) {
    
    63 64
                 // Need to create this node
    
    64 65
                 ReferenceNode<ProgramDto, ProgramReference> programNode = parentContainerReferenceNode.newChildNode(newParentReference);
    
    65
    -            tree.insertNode(parentContainerReferenceNode, programNode);
    
    66
    +            tree.insertNode((NavigationTreeNodeSupport<?>)parentContainerReferenceNode, programNode);
    
    66 67
             }
    
    67 68
         }
    
    68 69
     
    

  • 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,
    89 89
             }
    
    90 90
         }
    
    91 91
     
    
    92
    +    @SuppressWarnings({"rawtypes", "unchecked"})
    
    92 93
         protected boolean doSave(U ui, D bean, boolean notPersisted) {
    
    93 94
     
    
    94 95
             ContentReferenceUIModel<D, R> model = ui.getModel();
    
    ... ... @@ -131,15 +132,13 @@ public class Save<D extends ReferentialDto, R extends ReferentialDtoReference<D,
    131 132
                             .collect(Collectors.toList());
    
    132 133
     
    
    133 134
                     if (ProgramDto.class.equals(beanType)) {
    
    134
    -                    //noinspection unchecked
    
    135 135
                         referenceList = (List) ProgramReference.filterGearType((List) referenceList, ((ProgramDto) bean).getGearType());
    
    136 136
                     }
    
    137 137
     
    
    138 138
                     Pair<Boolean, R> result = UsageForDesactivateUIHandler.showUsages(bean, usages, referenceList);
    
    139
    -                boolean willsave = result.getLeft();
    
    140
    -
    
    139
    +                boolean willSave = result.getLeft();
    
    141 140
                     replaceReference = result.getRight();
    
    142
    -                if (!willsave) {
    
    141
    +                if (!willSave) {
    
    143 142
                         log.debug("User refuses to continue, skip saving...");
    
    144 143
                         return false;
    
    145 144
                     }
    
    ... ... @@ -170,7 +169,8 @@ public class Save<D extends ReferentialDto, R extends ReferentialDtoReference<D,
    170 169
                     // add the program in tree
    
    171 170
                     if (tree.getModel().getConfig().isShowEmptyProgram()) {
    
    172 171
                         RootNavigationTreeNode rootNode = tree.getRootNode();
    
    173
    -                    tree.insertNode(rootNode, getDecoratorService().getReferentialLocale(), (ProgramDto) bean);
    
    172
    +                    ReferenceNode<ProgramDto, ProgramReference> newNode = rootNode.newChildNode(((ProgramDto) bean).toReference(getDecoratorService().getReferentialLocale()));
    
    173
    +                    tree.insertNode(rootNode, newNode);
    
    174 174
                     }
    
    175 175
                 } else {
    
    176 176
                     // 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
    29 29
     import fr.ird.observe.client.datasource.editor.tree.navigation.nodes.RootNavigationTreeNode;
    
    30 30
     import fr.ird.observe.dto.IdDto;
    
    31 31
     import fr.ird.observe.dto.reference.DtoReference;
    
    32
    -import fr.ird.observe.dto.referential.ReferentialLocale;
    
    33 32
     import fr.ird.observe.navigation.model.DtoModelNavigationModel;
    
    34 33
     import fr.ird.observe.navigation.model.ObserveNavigationNode;
    
    35 34
     import fr.ird.observe.navigation.model.edit.ObserveEditModel;
    
    ... ... @@ -185,16 +184,10 @@ public class NavigationTree extends JXTree {
    185 184
             getModel().insertNodeInto(node, parentNode, position);
    
    186 185
         }
    
    187 186
     
    
    188
    -    public <ChildDto extends IdDto, Child extends DtoReference<ChildDto, Child>> void insertNode(MultipleReferenceContainerNode<ChildDto, Child> parentNode, ReferentialLocale referentialLocale, ChildDto dto) {
    
    189
    -        Child reference = DtoModelHelper.toReference(referentialLocale, dto);
    
    190
    -        ReferenceNode<ChildDto, Child> referenceNode = parentNode.newChildNode(reference);
    
    191
    -        insertNode(parentNode, referenceNode);
    
    192
    -    }
    
    193
    -
    
    194
    -    public <ChildDto extends IdDto, Child extends DtoReference<ChildDto, Child>> void insertNode(MultipleReferenceContainerNode<ChildDto, Child> parentNode, ReferenceNode<ChildDto, Child> node) {
    
    195
    -        Child reference = node.getReference();
    
    196
    -        int position = reference.isPersisted() ? parentNode.getNodePosition(reference) : parentNode.getChildCount();
    
    197
    -        insertNode(parentNode, node, position);
    
    187
    +    public <ChildDto extends IdDto, Child extends DtoReference<ChildDto, Child>> void insertNode(NavigationTreeNodeSupport<?> parentNode, ReferenceNode<ChildDto, Child> referenceNode) {
    
    188
    +        Child reference = referenceNode.getReference();
    
    189
    +        int position = parentNode.getNewPosition(reference);
    
    190
    +        insertNode(parentNode, referenceNode, position);
    
    198 191
         }
    
    199 192
     
    
    200 193
         /**
    
    ... ... @@ -246,7 +239,8 @@ public class NavigationTree extends JXTree {
    246 239
     
    
    247 240
         public <D extends IdDto, R extends DtoReference<D, R>> void addUnsavedNode(MultipleReferenceContainerNode<D, R> parentNode) {
    
    248 241
             ReferenceNode<D, R> result = parentNode.newChildNode(((NavigationTreeNodeSupport<?>) parentNode).getId());
    
    249
    -        insertNode(parentNode, result);
    
    242
    +        int childCount = parentNode.getChildCount();
    
    243
    +        insertNode(parentNode, result, childCount);
    
    250 244
             afterAddUnsavedNode(parentNode, result);
    
    251 245
         }
    
    252 246
     
    

  • 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;
    22 22
      * #L%
    
    23 23
      */
    
    24 24
     
    
    25
    +import fr.ird.observe.dto.reference.DtoReference;
    
    25 26
     import fr.ird.observe.navigation.model.ObserveNavigationNode;
    
    26 27
     import fr.ird.observe.navigation.model.edit.ObserveEditModelApplicationComponent;
    
    27 28
     import fr.ird.observe.navigation.model.select.ObserveSelectModelApplicationComponent;
    
    29
    +import fr.ird.observe.navigation.tree.MultipleReferenceContainerNode;
    
    28 30
     
    
    29 31
     import javax.swing.JComponent;
    
    30 32
     import java.awt.Color;
    
    ... ... @@ -268,4 +270,24 @@ public abstract class NavigationTreeNodeSupport<O> extends ObserveTreeNodeSuppor
    268 270
         public int hashCode() {
    
    269 271
             return Objects.hash(getData());
    
    270 272
         }
    
    273
    +
    
    274
    +    /**
    
    275
    +     * Compute new node position from his given bean reference
    
    276
    +     *
    
    277
    +     * @param beanReference bean we want to insert from this parent
    
    278
    +     * @return position where to insert a node with the given bean reference
    
    279
    +     */
    
    280
    +    @SuppressWarnings({"rawtypes", "unchecked"})
    
    281
    +    public int getNewPosition(DtoReference beanReference) {
    
    282
    +        if (beanReference.isNotPersisted()) {
    
    283
    +            // not persisted data is always on bottom
    
    284
    +            return getChildCount();
    
    285
    +        }
    
    286
    +        if (this instanceof MultipleReferenceContainerNode) {
    
    287
    +            // when multiple container, let's ask him the correction position
    
    288
    +            return ((MultipleReferenceContainerNode) this).getNodePosition(beanReference);
    
    289
    +        }
    
    290
    +        // in other cases, always on bottom (if not, do override this method)
    
    291
    +        return getChildCount();
    
    292
    +    }
    
    271 293
     }

  • 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;
    32 32
     import fr.ird.observe.dto.data.ps.observation.SetDto;
    
    33 33
     import fr.ird.observe.dto.data.ps.observation.SetReference;
    
    34 34
     import fr.ird.observe.dto.reference.DataDtoReferenceSet;
    
    35
    +import fr.ird.observe.dto.reference.DtoReference;
    
    35 36
     import fr.ird.observe.navigation.model.edit.seine.node.ObserveSeineActivityEditNode;
    
    36 37
     import fr.ird.observe.navigation.model.select.seine.node.ObserveSeineActivitySelectNode;
    
    37 38
     import fr.ird.observe.navigation.tree.MultipleReferenceContainerNode;
    
    ... ... @@ -133,5 +134,21 @@ public class ActivitySeineNavigationTreeNode extends ReferenceNavigationTreeNode
    133 134
         public SetSeineNavigationTreeNode newSingleChildNode(String parentId) {
    
    134 135
             return newSingleChildNode(new SetReference(new SetDto(), null));
    
    135 136
         }
    
    137
    +
    
    138
    +    @SuppressWarnings("rawtypes")
    
    139
    +    @Override
    
    140
    +    public int getNewPosition(DtoReference beanReference) {
    
    141
    +        if (beanReference.isNotPersisted()) {
    
    142
    +            // not persisted, always at bottom
    
    143
    +            return getChildCount();
    
    144
    +        }
    
    145
    +        if (beanReference instanceof SetReference) {
    
    146
    +            // when is a persisted set, then always on top
    
    147
    +            return 0;
    
    148
    +        }
    
    149
    +
    
    150
    +        return super.getNewPosition(beanReference);
    
    151
    +
    
    152
    +    }
    
    136 153
     }
    
    137 154