branch feature/7929_editeur_de_zone updated (0f29ae8 -> 38b5700)
This is an automated email from the git hooks/post-receive script. New change to branch feature/7929_editeur_de_zone in repository tutti. See http://git.codelutin.com/tutti.git from 0f29ae8 on pousse les zones dans le modele de protocole (peut etre faire l'inverse...) (refs #7929) new 38b5700 - ajout de la suppression de zone - probleme de rechargement de l'arbre quand on cache la racine - sélection de la zone créée (refs #7929) The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 38b5700dd45a62f7f04d121064d8d3ea053f2751 Author: Kevin Morin <morin@codelutin.com> Date: Mon Feb 1 19:09:05 2016 +0100 - ajout de la suppression de zone - probleme de rechargement de l'arbre quand on cache la racine - sélection de la zone créée (refs #7929) Summary of changes: .../content/protocol/EditProtocolUIHandler.java | 6 +++ .../swing/content/protocol/zones/ZoneEditorUI.jaxx | 1 + .../swing/content/protocol/zones/ZoneEditorUI.jcss | 7 ++- .../protocol/zones/ZoneEditorUIHandler.java | 30 ++++++++---- .../protocol/zones/actions/CreateZoneAction.java | 15 ++++++ .../protocol/zones/actions/DeleteZoneAction.java | 54 ++++++++++++++++++++++ .../protocol/zones/tree/StratasTreeModel.java | 14 ++++-- .../protocol/zones/tree/ZonesTreeModel.java | 14 +++--- .../resources/i18n/tutti-ui-swing_en_GB.properties | 1 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 1 + 10 files changed, 120 insertions(+), 23 deletions(-) create mode 100644 tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/DeleteZoneAction.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7929_editeur_de_zone in repository tutti. See http://git.codelutin.com/tutti.git commit 38b5700dd45a62f7f04d121064d8d3ea053f2751 Author: Kevin Morin <morin@codelutin.com> Date: Mon Feb 1 19:09:05 2016 +0100 - ajout de la suppression de zone - probleme de rechargement de l'arbre quand on cache la racine - sélection de la zone créée (refs #7929) --- .../content/protocol/EditProtocolUIHandler.java | 6 +++ .../swing/content/protocol/zones/ZoneEditorUI.jaxx | 1 + .../swing/content/protocol/zones/ZoneEditorUI.jcss | 7 ++- .../protocol/zones/ZoneEditorUIHandler.java | 30 ++++++++---- .../protocol/zones/actions/CreateZoneAction.java | 15 ++++++ .../protocol/zones/actions/DeleteZoneAction.java | 54 ++++++++++++++++++++++ .../protocol/zones/tree/StratasTreeModel.java | 14 ++++-- .../protocol/zones/tree/ZonesTreeModel.java | 14 +++--- .../resources/i18n/tutti-ui-swing_en_GB.properties | 1 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 1 + 10 files changed, 120 insertions(+), 23 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java index 7ccba13..970952d 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java @@ -53,6 +53,7 @@ import fr.ifremer.tutti.ui.swing.content.operation.catches.SpeciesAbleBatchRowHe import fr.ifremer.tutti.ui.swing.content.protocol.rtp.RtpCellEditor; import fr.ifremer.tutti.ui.swing.content.protocol.rtp.RtpCellRenderer; import fr.ifremer.tutti.ui.swing.content.protocol.zones.ZoneEditorUIModel; +import fr.ifremer.tutti.ui.swing.content.protocol.zones.models.StrataUIModel; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import jaxx.runtime.SwingUtil; @@ -639,6 +640,11 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI getModel().setZone(new HashSet<>(zoneEditorUIModel.getZones())); zoneEditorUIModel.addPropertyChangeListener(ZoneEditorUIModel.PROPERTY_ZONES, evt -> getModel().setZone(new HashSet<>((Collection<Zone>) evt.getNewValue()))); + zoneEditorUIModel.addPropertyChangeListener(ZoneEditorUIModel.PROPERTY_AVAILABLE_STRATAS, + evt -> { + Collection<StrataUIModel> newValue = (Collection<StrataUIModel>) evt.getNewValue(); + getModel().setValid(getModel().isValid() && newValue.isEmpty()); + }); //FIXME kmorin ecouter toutes les modifs sur le model d'editeur de zone // listenModelModifiy(zoneEditorUIModel); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUI.jaxx index bd4b528..e886452 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUI.jaxx @@ -25,6 +25,7 @@ <cell> <JToolBar id="zonesTreeToolBar"> <JButton id="createZone"/> + <JButton id="deleteZone"/> <JButton id="expandZonesTree"/> <JButton id="collapseZonesTree"/> </JToolBar> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUI.jcss b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUI.jcss index c322086..6cb7019 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUI.jcss +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUI.jcss @@ -2,7 +2,7 @@ JTree { autoscrolls: true; expandsSelectedPaths: true; scrollsOnExpand: true; - rootVisible: false; + //rootVisible: false; showsRootHandles: true; cellRenderer: {new ZoneEditorTreeCellRenderer()}; } @@ -16,6 +16,11 @@ JToolBar { _simpleAction: {fr.ifremer.tutti.ui.swing.content.protocol.zones.actions.CreateZoneAction.class}; } +#deleteZone { + actionIcon: delete; + _simpleAction: {fr.ifremer.tutti.ui.swing.content.protocol.zones.actions.DeleteZoneAction.class}; +} + #expandZonesTree { actionIcon: expand; _simpleAction: {fr.ifremer.tutti.ui.swing.content.protocol.zones.actions.ExpandZonesTreeAction.class}; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUIHandler.java index 7918284..b103d12 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUIHandler.java @@ -16,6 +16,7 @@ import fr.ifremer.tutti.ui.swing.content.protocol.zones.tree.StratasTreeModel; import fr.ifremer.tutti.ui.swing.content.protocol.zones.tree.ZonesTreeModel; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; import jaxx.runtime.SwingUtil; +import jaxx.runtime.swing.JAXXWidgetUtil; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -63,7 +64,7 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode ZonesTreeModel zonesTreeModel = (ZonesTreeModel) getUI().getZonesTree().getModel(); zonesTreeModel.updateStratas(zone, stratasToAdd, stratasToRemove); - zonesTreeModel.reload(); +// zonesTreeModel.reload(); } }; @@ -85,7 +86,6 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode ZonesTreeModel zonesTreeModel = (ZonesTreeModel) getUI().getZonesTree().getModel(); zonesTreeModel.updateSubStratas(strata, subStratasToAdd, subStratasToRemove); - zonesTreeModel.reload(); } }; @@ -112,7 +112,6 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode StratasTreeModel stratasTreeModel = (StratasTreeModel) getUI().getAvailableStratasTree().getModel(); stratasTreeModel.updateSubStratas(strata, subStratasToAdd, subStratasToRemove); - stratasTreeModel.reload(); } }; @@ -176,9 +175,13 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode // get data initModel(); + + JAXXWidgetUtil.expandTree(availableStratasTree); + JAXXWidgetUtil.expandTree(zonesTree); } - public static void collapseTree(final JTree tree) { + //FIXME move to jaxx + public void collapseTree(final JTree tree) { SwingUtilities.invokeLater(new Runnable() { public void run() { int i = 0; @@ -232,13 +235,14 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode Collection<Strata> protocolStratas = zones.stream() .map(zone -> zone.getStrata()) .flatMap(stratas -> stratas.stream()) - .collect(Collectors.toSet()); + .collect(Collectors.toList()); + + if (log.isInfoEnabled()) { + log.info("protocol strata " + protocolStratas); + } protocolStratas.forEach(strata -> { - if (log.isInfoEnabled()) { - log.info("protocol strata " + strata); - } TuttiLocation strataLocation = strata.getLocation(); Collection<TuttiLocation> subStrataLocations = strata.getSubstrata() @@ -246,6 +250,11 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode .map(subStrata -> subStrata.getLocation()) .collect(Collectors.toSet()); + + if (log.isInfoEnabled()) { + log.info("protocol strata " + strata.getLocation() + " " + subStrataLocations); + } + if (subStrataLocations.isEmpty()) { programStratasAndSubstratas.removeAll(strataLocation); @@ -290,6 +299,9 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode JTree zonesTree = getUI().getZonesTree(); ZonesTreeModel zonesTreeModel = (ZonesTreeModel) zonesTree.getModel(); + if (log.isInfoEnabled()) { + log.info("zones to remove" + zonesToRemove); + } zonesTreeModel.removeZones(zonesToRemove); zonesTreeModel.addZones(zonesToAdd); @@ -299,7 +311,6 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode zonesToAdd.forEach(zone -> zone.addPropertyChangeListener(ZoneUIModel.PROPERTY_STRATA, stratasChangeListener)); - zonesTreeModel.reload(); } protected void updateAvailableStratasTreeModel(Collection<StrataUIModel> stratasToAdd, @@ -321,7 +332,6 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode stratasToAdd.forEach(strata -> strata.addPropertyChangeListener(StrataUIModel.PROPERTY_SUBSTRATA, availableSubStratasChangeListener)); - availableStratasTreeModel.reload(); } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/CreateZoneAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/CreateZoneAction.java index 9be290a..d5780b8 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/CreateZoneAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/CreateZoneAction.java @@ -2,9 +2,15 @@ package fr.ifremer.tutti.ui.swing.content.protocol.zones.actions; import fr.ifremer.tutti.ui.swing.content.protocol.zones.ZoneEditorUI; import fr.ifremer.tutti.ui.swing.content.protocol.zones.models.ZoneUIModel; +import fr.ifremer.tutti.ui.swing.content.protocol.zones.tree.ZoneNode; +import fr.ifremer.tutti.ui.swing.content.protocol.zones.tree.ZonesTreeModel; import fr.ifremer.tutti.ui.swing.util.actions.SimpleActionSupport; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import javax.swing.JOptionPane; +import javax.swing.JTree; +import javax.swing.tree.TreePath; import static org.nuiton.i18n.I18n.t; @@ -14,6 +20,9 @@ import static org.nuiton.i18n.I18n.t; */ public class CreateZoneAction extends SimpleActionSupport<ZoneEditorUI> { + /** Logger. */ + private static final Log log = LogFactory.getLog(CreateZoneAction.class); + public CreateZoneAction(ZoneEditorUI zoneEditorUI) { super(zoneEditorUI); } @@ -27,6 +36,12 @@ public class CreateZoneAction extends SimpleActionSupport<ZoneEditorUI> { ZoneUIModel zone = new ZoneUIModel(); zone.setLabel(zoneLabel); zoneEditorUI.getModel().addZone(zone); + + //select newly created node + JTree zonesTree = zoneEditorUI.getZonesTree(); + ZoneNode zoneNode = ((ZonesTreeModel) zonesTree.getModel()).findZoneNode(zone); + TreePath path = new TreePath(zoneNode.getPath()); + zonesTree.setSelectionPath(path); } } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/DeleteZoneAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/DeleteZoneAction.java new file mode 100644 index 0000000..3ae5235 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/DeleteZoneAction.java @@ -0,0 +1,54 @@ +package fr.ifremer.tutti.ui.swing.content.protocol.zones.actions; + +import fr.ifremer.tutti.ui.swing.content.protocol.zones.ZoneEditorUI; +import fr.ifremer.tutti.ui.swing.content.protocol.zones.models.StrataUIModel; +import fr.ifremer.tutti.ui.swing.content.protocol.zones.models.ZoneUIModel; +import fr.ifremer.tutti.ui.swing.content.protocol.zones.tree.ZoneNode; +import fr.ifremer.tutti.ui.swing.util.actions.SimpleActionSupport; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.swing.JOptionPane; +import javax.swing.JTree; +import javax.swing.tree.TreePath; + +import java.util.stream.Collectors; + +import static org.nuiton.i18n.I18n.t; + +/** + * @author Kevin Morin (Code Lutin) + * @since 4.5 + */ +public class DeleteZoneAction extends SimpleActionSupport<ZoneEditorUI> { + + /** Logger. */ + private static final Log log = LogFactory.getLog(DeleteZoneAction.class); + + public DeleteZoneAction(ZoneEditorUI zoneEditorUI) { + super(zoneEditorUI); + } + + @Override + protected void onActionPerformed(ZoneEditorUI zoneEditorUI) { + + JTree zonesTree = zoneEditorUI.getZonesTree(); + + if (zonesTree.getSelectionCount() >= 1) { + + int confirmDeletion = JOptionPane.showConfirmDialog(zoneEditorUI, t("tutti.zoneEditor.deleteZone.message")); + + if (confirmDeletion == JOptionPane.YES_OPTION) { + + TreePath[] selectionPaths = zonesTree.getSelectionPaths(); + for (TreePath selectedPath : selectionPaths) { + ZoneUIModel zone = ((ZoneNode) selectedPath.getPathComponent(1)).getZone(); + zoneEditorUI.getModel().removeStratasFromZone(zone.getStrata().stream() + .map(strata -> (StrataUIModel) strata) + .collect(Collectors.toSet())); + } + + } + } + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/tree/StratasTreeModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/tree/StratasTreeModel.java index dc89aed..2e7de3e 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/tree/StratasTreeModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/tree/StratasTreeModel.java @@ -43,6 +43,7 @@ public class StratasTreeModel extends DefaultTreeModel { nodesToRemove.forEach(strataNode ->removeNodeFromParent(strataNode)); + nodeChanged(root); } public void addStratas(Collection<StrataUIModel> stratasToAdd) { @@ -52,13 +53,13 @@ public class StratasTreeModel extends DefaultTreeModel { stratasToAdd.forEach(strata -> { StrataNode strataNode = new StrataNode(strata); - insertNodeInto(strataNode, root, root.getChildCount()); + insertNodeInto(strataNode, root, 0); strata.getSubstrata().forEach(substrata -> { if (substrata != null) { SubStrataNode subStrataNode = new SubStrataNode((SubStrataUIModel) substrata); - insertNodeInto(subStrataNode, strataNode, strataNode.getChildCount()); + insertNodeInto(subStrataNode, strataNode, 0); } }); @@ -67,6 +68,7 @@ public class StratasTreeModel extends DefaultTreeModel { root.sortChildren(); + nodeChanged(root); } public void updateSubStratas(StrataUIModel strata, @@ -103,14 +105,16 @@ public class StratasTreeModel extends DefaultTreeModel { log.info("add strata " + subStrata.getLabel()); } - insertNodeInto(subStrataNode, strataNode, strataNode.getChildCount()); + insertNodeInto(subStrataNode, strataNode, 0); } strataNode.sortChildren(); + + nodeChanged(root); } - protected StrataNode findStrataNode(StrataUIModel strata) { + public StrataNode findStrataNode(StrataUIModel strata) { DefaultMutableTreeNode root = (DefaultMutableTreeNode) getRoot(); @@ -128,7 +132,7 @@ public class StratasTreeModel extends DefaultTreeModel { return strataNode; } - protected SubStrataNode findSubStrataNode(SubStrataUIModel subStrata, StrataNode strataNode) { + public SubStrataNode findSubStrataNode(SubStrataUIModel subStrata, StrataNode strataNode) { Enumeration strataChildren = strataNode.children(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/tree/ZonesTreeModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/tree/ZonesTreeModel.java index 158a167..5bdd816 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/tree/ZonesTreeModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/tree/ZonesTreeModel.java @@ -55,7 +55,7 @@ public class ZonesTreeModel extends DefaultTreeModel { zonesToAdd.forEach(zone -> { ZoneNode zoneNode = new ZoneNode(zone); - insertNodeInto(zoneNode, root, root.getChildCount()); + insertNodeInto(zoneNode, root, 0); Set<StrataUIModel> stratasToAdd = zone.getStrata() @@ -104,7 +104,7 @@ public class ZonesTreeModel extends DefaultTreeModel { log.info("add strata " + strata.getLabel()); } - insertNodeInto(strataNode, zoneNode, zoneNode.getChildCount()); + insertNodeInto(strataNode, zoneNode, 0); Set<SubStrataUIModel> subStratasToAdd = strata.getSubstrata() .stream() @@ -151,14 +151,14 @@ public class ZonesTreeModel extends DefaultTreeModel { log.info("add strata " + subStrata.getLabel()); } - insertNodeInto(subStrataNode, strataNode, strataNode.getChildCount()); + insertNodeInto(subStrataNode, strataNode, 0); } strataNode.sortChildren(); } - protected ZoneNode findZoneNode(ZoneUIModel zone) { + public ZoneNode findZoneNode(ZoneUIModel zone) { DefaultMutableTreeNode root = (DefaultMutableTreeNode) getRoot(); @@ -176,14 +176,14 @@ public class ZonesTreeModel extends DefaultTreeModel { return zoneNode; } - protected StrataNode findStrataNode(StrataUIModel strata, ZoneUIModel zone) { + public StrataNode findStrataNode(StrataUIModel strata, ZoneUIModel zone) { ZoneNode zoneNode = findZoneNode(zone); return findStrataNode(strata, zoneNode); } - protected StrataNode findStrataNode(StrataUIModel strata, ZoneNode zoneNode) { + public StrataNode findStrataNode(StrataUIModel strata, ZoneNode zoneNode) { Enumeration zoneChildren = zoneNode.children(); @@ -199,7 +199,7 @@ public class ZonesTreeModel extends DefaultTreeModel { return strataNode; } - protected SubStrataNode findSubStrataNode(SubStrataUIModel subStrata, StrataNode strataNode) { + public SubStrataNode findSubStrataNode(SubStrataUIModel subStrata, StrataNode strataNode) { Enumeration strataChildren = strataNode.children(); diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 046f523..4354fd8 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -2347,3 +2347,4 @@ tutti.vesselUseFeatureTable.table.header.key= tutti.vesselUseFeatureTable.table.header.value= tutti.vesselUseFeatureTable.title= tutti.zoneEditor.createZone.message= +tutti.zoneEditor.deleteZone.message= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index 5005fdc..4f7c100 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -2172,3 +2172,4 @@ tutti.vesselUseFeatureTable.table.header.key=Caractéristique tutti.vesselUseFeatureTable.table.header.value=Valeur tutti.vesselUseFeatureTable.title=Autres paramètres tutti.zoneEditor.createZone.message=Libellé de la nouvelle zone +tutti.zoneEditor.deleteZone.message= -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm