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 e7fd65aa77e3448775ccc6348b28452bdd0241cc Author: Kevin Morin <morin@codelutin.com> Date: Tue Feb 2 19:10:52 2016 +0100 - utilisation directement du modele du protocol - ajout d'une popup de menu pour surrpimer et renommer les zones (refs #7929) --- .../content/protocol/EditProtocolUIHandler.java | 30 +-- .../content/protocol/EditProtocolUIModel.java | 179 +++++++++++++++++- .../protocol/actions/SaveProtocolAction.java | 7 + .../swing/content/protocol/zones/ZoneEditorUI.jaxx | 18 +- .../swing/content/protocol/zones/ZoneEditorUI.jcss | 16 +- .../protocol/zones/ZoneEditorUIHandler.java | 207 +++++++++++---------- .../content/protocol/zones/ZoneEditorUIModel.java | 194 ------------------- .../protocol/zones/actions/AddStratasAction.java | 55 +++--- .../CollapseAvailableStratasTreeAction.java | 3 +- .../zones/actions/CollapseZonesTreeAction.java | 3 +- .../protocol/zones/actions/DeleteZoneAction.java | 21 +-- .../protocol/zones/actions/RenameZoneAction.java | 54 ++++++ .../protocol/zones/models/SubStrataUIModel.java | 6 +- .../protocol/zones/tree/ZonesTreeModel.java | 4 + .../ifremer/tutti/ui/swing/util/TuttiUIUtil.java | 15 ++ .../EditProtocolUIModel-error-validation.xml | 40 ++++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 9 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 11 +- 18 files changed, 502 insertions(+), 370 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 1082106..0b0f601 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 @@ -40,7 +40,6 @@ import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; -import fr.ifremer.tutti.persistence.entities.protocol.Zone; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.entities.referential.Speciess; @@ -52,8 +51,6 @@ import fr.ifremer.tutti.ui.swing.content.home.actions.ImportProtocolAction; import fr.ifremer.tutti.ui.swing.content.operation.catches.SpeciesAbleBatchRowHelper; 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; @@ -97,7 +94,6 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -246,7 +242,7 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI model.setCleaned(true); this.ui.getSaveWarning().setText(t("tutti.editProtocol.warn.clean")); } - model.fromBean(protocol); + model.fromEntity(protocol); } else if ((protocol = ImportProtocolAction.IMPORT_PROTOCOL_ENTRY.getContextValue(this.ui)) != null) { @@ -256,7 +252,7 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI ImportProtocolAction.IMPORT_PROTOCOL_ENTRY.removeContextValue(this.ui); - model.fromBean(protocol); + model.fromEntity(protocol); model.setImported(true); this.ui.getSaveWarning().setText(t("tutti.editProtocol.warn.import")); @@ -268,7 +264,7 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI CloneProtocolAction.CLONE_PROTOCOL_ENTRY.removeContextValue(this.ui); - model.fromBean(protocol); + model.fromEntity(protocol); model.setCloned(true); this.ui.getSaveWarning().setText(t("tutti.editProtocol.warn.clone")); @@ -636,22 +632,6 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI model.setVersion(TuttiProtocols.CURRENT_PROTOCOL_VERSION); - ZoneEditorUIModel zoneEditorUIModel = this.ui.getZoneEditor().getModel(); - 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(); - if (log.isInfoEnabled()) { - log.info("newValue " + newValue); - } - getModel().setValid(getModel().isValid() && newValue.isEmpty()); - }); - getModel().setValid(getModel().isValid() && zoneEditorUIModel.getAvailableStratas().isEmpty()); - - //FIXME kmorin ecouter toutes les modifs sur le model d'editeur de zone -// listenModelModifiy(zoneEditorUIModel); } @Override @@ -709,7 +689,7 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI lengthClassesPmfmId.add(lengthStepPmfm); } row.setLengthStepPmfm(lengthStepPmfm); - row.fromBean(speciesProtocol); + row.fromEntity(speciesProtocol); // make sure to get a clean copy of the list row.setMandatorySampleCategoryId(Lists.newArrayList(speciesProtocol.getMandatorySampleCategoryId())); @@ -755,7 +735,7 @@ public class EditProtocolUIHandler extends AbstractTuttiUIHandler<EditProtocolUI caracteristicSet.add(model.getAllCaracteristic().get(pmfmId)); EditProtocolCaracteristicsRowModel row = createEditProtocolCaracteristicsRowModel(); - row.fromBean(caracteristicMappingRow); + row.fromEntity(caracteristicMappingRow); row.setValid(row.getType() != null); result.add(row); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java index 2873164..fea45e0 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java @@ -31,21 +31,29 @@ import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; +import fr.ifremer.tutti.persistence.entities.protocol.Strata; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols; import fr.ifremer.tutti.persistence.entities.protocol.Zone; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.ui.swing.content.protocol.zones.models.StrataUIModel; +import fr.ifremer.tutti.ui.swing.content.protocol.zones.models.SubStrataUIModel; +import fr.ifremer.tutti.ui.swing.content.protocol.zones.models.ZoneUIModel; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel; import org.apache.commons.lang3.mutable.MutableInt; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * @author Tony Chemit - chemit@codelutin.com @@ -53,6 +61,9 @@ import java.util.Map; */ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, EditProtocolUIModel> implements TuttiProtocol { + /** Logger. */ + private static final Log log = LogFactory.getLog(EditProtocolUIModel.class); + private static final long serialVersionUID = 1L; public static final String PROPERTY_CARACTERISTIC_MAPPING_ROWS = "caracteristicMappingRows"; @@ -79,6 +90,8 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, public static final String PROPERTY_CLEANED = "cleaned"; + public static final String PROPERTY_AVAILABLE_STRATAS = "availableStratas"; + /** * Delegate edit object. * @@ -156,6 +169,8 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, protected List<EditProtocolSpeciesRowModel> benthosRow; + protected final Collection<StrataUIModel> availableStratas = new HashSet<>(); + protected static Binder<EditProtocolUIModel, TuttiProtocol> toBeanBinder = BinderFactory.newBinder(EditProtocolUIModel.class, TuttiProtocol.class); @@ -172,6 +187,37 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, return TuttiProtocols.newTuttiProtocol(); } + @Override + public void fromEntity(TuttiProtocol entity) { + fromBeanBinder.copyExcluding(entity, this, PROPERTY_ZONE); + + Collection<Zone> zoneModels = entity.getZone() + .stream() + .map(zone -> { + ZoneUIModel zoneUIModel = new ZoneUIModel(); + zoneUIModel.fromEntity(zone); + return zoneUIModel; + }) + .collect(Collectors.toList()); + + setZone(zoneModels); + } + + @Override + public TuttiProtocol toEntity() { + TuttiProtocol result = newEntity(); + toBeanBinder.copyExcluding(this, result, PROPERTY_ZONE); + Collection<Zone> zoneModels = getZone().stream() + .map(zone -> { + ZoneUIModel zoneUIModel = (ZoneUIModel) zone; + return zoneUIModel.toEntity(); + }) + .collect(Collectors.toList()); + + result.setZone(zoneModels); + return result; + } + public void setLengthClassesPmfm(List<Caracteristic> lengthClassesPmfm) { List<String> ids = Lists.newArrayList(TuttiEntities.collecIds(lengthClassesPmfm)); setLengthClassesPmfmId(ids); @@ -786,8 +832,9 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, @Override public void setZone(Collection<Zone> zones) { + Object oldZones = new ArrayList<>(getZone()); editObject.setZone(zones); - firePropertyChanged(TuttiProtocol.PROPERTY_ZONE, null, getZone()); + firePropertyChanged(TuttiProtocol.PROPERTY_ZONE, oldZones, getZone()); } @Override @@ -807,27 +854,31 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, @Override public void addZone(Zone zone) { + Object oldZones = new ArrayList<>(getZone()); editObject.addZone(zone); - firePropertyChanged(TuttiProtocol.PROPERTY_ZONE, null, getZone()); + firePropertyChanged(TuttiProtocol.PROPERTY_ZONE, oldZones, getZone()); } @Override public void addAllZone(Collection<Zone> zones) { + Object oldZones = new ArrayList<>(getZone()); editObject.addAllZone(zones); - firePropertyChanged(TuttiProtocol.PROPERTY_ZONE, null, getZone()); + firePropertyChanged(TuttiProtocol.PROPERTY_ZONE, oldZones, getZone()); } @Override public boolean removeZone(Zone zone) { + Object oldZones = new ArrayList<>(getZone()); boolean result = editObject.removeZone(zone); - firePropertyChanged(TuttiProtocol.PROPERTY_ZONE, null, getZone()); + firePropertyChanged(TuttiProtocol.PROPERTY_ZONE, oldZones, getZone()); return result; } @Override public boolean removeAllZone(Collection<Zone> zones) { + Object oldZones = new ArrayList<>(getZone()); boolean result = editObject.removeAllZone(zones); - firePropertyChanged(TuttiProtocol.PROPERTY_ZONE, null, getZone()); + firePropertyChanged(TuttiProtocol.PROPERTY_ZONE, oldZones, getZone()); return result; } @@ -930,4 +981,122 @@ public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, return mutableInt.intValue(); } + public Collection<StrataUIModel> getAvailableStratas() { + return availableStratas; + } + + public void setAvailableStratas(Collection<StrataUIModel> availableStratas) { + this.availableStratas.clear(); + addAllAvailableStratas(availableStratas); + } + + public void addAllAvailableStratas(Collection<StrataUIModel> availableStratas) { + Object oldValue = copyAvailableStratas(); + this.availableStratas.addAll(availableStratas); + firePropertyChange(PROPERTY_AVAILABLE_STRATAS, oldValue, getAvailableStratas()); + } + + public void addAvailableStrata(StrataUIModel availableStrata) { + Object oldValue = copyAvailableStratas(); + this.availableStratas.add(availableStrata); + firePropertyChange(PROPERTY_AVAILABLE_STRATAS, oldValue, getAvailableStratas()); + } + + public void removeAllAvailableStratas(Collection<StrataUIModel> stratas) { + + Object oldValue = copyAvailableStratas(); + + availableStratas.removeAll(stratas); + + firePropertyChange(PROPERTY_AVAILABLE_STRATAS, oldValue, getAvailableStratas()); + + } + + public void removeAvailableStrata(StrataUIModel strata) { + + Object oldValue = copyAvailableStratas(); + + availableStratas.remove(strata); + + firePropertyChange(PROPERTY_AVAILABLE_STRATAS, oldValue, getAvailableStratas()); + + } + + public void moveStratasToZone(Collection<StrataUIModel> stratas, ZoneUIModel zone) { + if (log.isInfoEnabled()) { + log.info("stratas " + stratas); + } + + zone.addAllStrata(new ArrayList<>(stratas)); + removeAllAvailableStratas(stratas); + } + + public void removeStratasFromZone(Collection<StrataUIModel> stratas) { + if (log.isInfoEnabled()) { + log.info("stratas " + stratas); + } + + stratas.forEach(strata -> strata.getZone().removeStrata(strata)); + addAllAvailableStratas(stratas); + } + + public void moveSubStratasToZone(Collection<SubStrataUIModel> subStratas, ZoneUIModel zone) { + if (log.isInfoEnabled()) { + log.info("substrats " + subStratas); + } + + subStratas.forEach(subStrata -> { + StrataUIModel strata = subStrata.getStrata(); + strata.removeSubstrata(subStrata); + + Strata zoneStrata = zone.getStrata(strata); + + if (zoneStrata == null) { + zoneStrata = new StrataUIModel(strata.getLocation()); + zone.addStrata(zoneStrata); + } + + zoneStrata.addSubstrata(subStrata); + + if (strata.isSubstrataEmpty()) { + removeAvailableStrata(strata); + } + }); + + } + + public void removeSubStratasFromZone(Collection<SubStrataUIModel> subStratas) { + if (log.isInfoEnabled()) { + log.info("subStratas " + subStratas); + } + + subStratas.forEach(subStrata -> { + StrataUIModel strata = subStrata.getStrata(); + strata.removeSubstrata(subStrata); + + StrataUIModel availableStrata = getStrata(strata); + if (availableStrata == null) { + availableStrata = new StrataUIModel(strata.getLocation()); + addAvailableStrata(availableStrata); + } + availableStrata.addSubstrata(subStrata); + + if (strata.isSubstrataEmpty()) { + strata.getZone().removeStrata(strata); + } + + }); + } + + /** + * @param strata + * @return the strata from the available stratas which equals the strata in parameters + */ + public StrataUIModel getStrata(StrataUIModel strata) { + return availableStratas.stream().filter(s -> s != null && s.equals(strata)).findFirst().orElse(null); + } + + protected List<StrataUIModel> copyAvailableStratas() { + return new ArrayList<>(availableStratas); + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/actions/SaveProtocolAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/actions/SaveProtocolAction.java index 6f45997..70c9409 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/actions/SaveProtocolAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/actions/SaveProtocolAction.java @@ -115,6 +115,13 @@ public class SaveProtocolAction extends LongActionSupport<EditProtocolUIModel, E } bean.setBenthos(benthosProtocols); + + + if (log.isInfoEnabled()) { + log.info("bean zones " + bean.getZone()); + log.info("bean zones " + bean.getZone()); + } + if (log.isDebugEnabled()) { log.debug("protocol id to save: " + bean.getId()); } 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 e886452..e4b989c 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 @@ -1,10 +1,11 @@ <Table id='editProtocolTopPanel' fill="both" - implements='fr.ifremer.tutti.ui.swing.util.TuttiUI<ZoneEditorUIModel, ZoneEditorUIHandler>'> + implements='fr.ifremer.tutti.ui.swing.util.TuttiUI<EditProtocolUIModel, ZoneEditorUIHandler>'> <import> fr.ifremer.tutti.ui.swing.content.protocol.zones.tree.ZoneEditorTreeCellRenderer + fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIModel fr.ifremer.tutti.ui.swing.util.TuttiUI fr.ifremer.tutti.ui.swing.util.TuttiUIUtil jaxx.runtime.SwingUtil @@ -19,13 +20,22 @@ </script> <!-- model --> - <ZoneEditorUIModel id='model' javaBean='new ZoneEditorUIModel()'/> + <EditProtocolUIModel id='model' javaBean='getContextValue(EditProtocolUIModel.class)'/> + + <BeanValidator id='validator' bean='model' + uiClass='jaxx.runtime.validator.swing.ui.ImageValidationUI'> + <field name='availableStratas' component='editProtocolTopPanel'/> + </BeanValidator> + + <JPopupMenu id='zonePopupMenu'> + <JMenuItem id='deleteZoneMenuItem'/> + <JMenuItem id='renameZoneMenuItem'/> + </JPopupMenu> <row> <cell> <JToolBar id="zonesTreeToolBar"> <JButton id="createZone"/> - <JButton id="deleteZone"/> <JButton id="expandZonesTree"/> <JButton id="collapseZonesTree"/> </JToolBar> @@ -44,7 +54,7 @@ <cell weightx='0.5' weighty='1' fill='both'> <JScrollPane onFocusGained='zonesTree.requestFocus()'> <!-- List of the zones --> - <JTree id='zonesTree'/> + <JTree id='zonesTree' onMouseClicked="handler.autoSelectNodeInTree(event, zonePopupMenu)"/> <!--onFocusGained='handler.selectFirstRowIfNoSelection(event)'--> <!--onMouseClicked='handler.onUniverseListClicked(event)'--> <!--onKeyPressed='handler.onKeyPressedOnUniverseList(event)'--> 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 6cb7019..6a83608 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 @@ -16,11 +16,25 @@ JToolBar { _simpleAction: {fr.ifremer.tutti.ui.swing.content.protocol.zones.actions.CreateZoneAction.class}; } -#deleteZone { +#deleteZoneMenuItem { actionIcon: delete; + text: "tutti.zoneEditor.action.delete"; + toolTipText: "tutti.zoneEditor.action.delete.tip"; + i18nMnemonic: "tutti.zoneEditor.action.delete.mnemonic"; _simpleAction: {fr.ifremer.tutti.ui.swing.content.protocol.zones.actions.DeleteZoneAction.class}; + _help: {"tutti.zoneEditor.action.delete.help"}; } +#renameZoneMenuItem { + actionIcon: edit; + text: "tutti.zoneEditor.action.rename"; + toolTipText: "tutti.zoneEditor.action.rename.tip"; + i18nMnemonic: "tutti.zoneEditor.action.rename.mnemonic"; + _simpleAction: {fr.ifremer.tutti.ui.swing.content.protocol.zones.actions.RenameZoneAction.class}; + _help: {"tutti.zoneEditor.action.rename.help"}; +} + + #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 b103d12..f541124 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 @@ -2,17 +2,16 @@ package fr.ifremer.tutti.ui.swing.content.protocol.zones; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import fr.ifremer.tutti.persistence.entities.protocol.Strata; import fr.ifremer.tutti.persistence.entities.protocol.SubStrata; -import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; -import fr.ifremer.tutti.persistence.entities.protocol.Zone; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocations; import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUIModel; import fr.ifremer.tutti.ui.swing.content.protocol.zones.models.StrataUIModel; import fr.ifremer.tutti.ui.swing.content.protocol.zones.models.SubStrataUIModel; import fr.ifremer.tutti.ui.swing.content.protocol.zones.models.ZoneUIModel; import fr.ifremer.tutti.ui.swing.content.protocol.zones.tree.StratasTreeModel; +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.AbstractTuttiUIHandler; import jaxx.runtime.SwingUtil; @@ -22,9 +21,13 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.swing.JComponent; +import javax.swing.JPopupMenu; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.tree.TreeModel; +import javax.swing.tree.TreePath; +import java.awt.Point; +import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; @@ -36,11 +39,22 @@ import java.util.stream.Collectors; * @author Kevin Morin (Code Lutin) * @since 4.5 */ -public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIModel, ZoneEditorUI> { +public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<EditProtocolUIModel, ZoneEditorUI> { /** Logger. */ private static final Log log = LogFactory.getLog(ZoneEditorUIHandler.class); + protected final PropertyChangeListener labelChangeListener = new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + + ZoneUIModel zone = (ZoneUIModel) evt.getSource(); + ZonesTreeModel zonesTreeModel = (ZonesTreeModel) getUI().getZonesTree().getModel(); + zonesTreeModel.zoneLabelChanged(zone); + } + }; + protected final PropertyChangeListener stratasChangeListener = new PropertyChangeListener() { @Override @@ -64,7 +78,6 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode ZonesTreeModel zonesTreeModel = (ZonesTreeModel) getUI().getZonesTree().getModel(); zonesTreeModel.updateStratas(zone, stratasToAdd, stratasToRemove); -// zonesTreeModel.reload(); } }; @@ -100,6 +113,11 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode Collection<SubStrataUIModel> newSubStratas = (Collection<SubStrataUIModel>) evt.getNewValue(); Collection<SubStrataUIModel> oldSubStratas = (Collection<SubStrataUIModel>) evt.getOldValue(); + if (log.isInfoEnabled()) { + log.info(oldSubStratas); + log.info(newSubStratas); + } + Collection<SubStrataUIModel> subStratasToAdd = new ArrayList<>(newSubStratas); subStratasToAdd.removeAll(oldSubStratas); @@ -123,7 +141,7 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode // init models - getModel().addPropertyChangeListener(ZoneEditorUIModel.PROPERTY_ZONES, + getModel().addPropertyChangeListener(EditProtocolUIModel.PROPERTY_ZONE, evt -> { Collection<ZoneUIModel> newZones = (Collection<ZoneUIModel>) evt.getNewValue(); @@ -137,19 +155,17 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode updateZonesTreeModel(zonesToAdd, zonesToRemove); + // si pas de zones avant, c'est soit que le modele etait vide, soit qu'on a initialisé l'arbre + if (oldZones.isEmpty()) { + SwingUtil.expandTree(zoneEditorUI.getZonesTree()); + } + }); - getModel().addPropertyChangeListener(ZoneEditorUIModel.PROPERTY_AVAILABLE_STRATAS, evt -> { + getModel().addPropertyChangeListener(EditProtocolUIModel.PROPERTY_AVAILABLE_STRATAS, evt -> { Collection<StrataUIModel> oldAvailableStratas = (Collection<StrataUIModel>) evt.getOldValue(); - if (log.isInfoEnabled()) { - log.info("oldAvailableStratas " + oldAvailableStratas); - } - Collection<StrataUIModel> newAvailableStratas = (Collection<StrataUIModel> ) evt.getNewValue(); - if (log.isInfoEnabled()) { - log.info("newAvailableStratas " + newAvailableStratas); - } Collection<StrataUIModel> stratasToAdd = new ArrayList<>(newAvailableStratas); stratasToAdd.removeAll(oldAvailableStratas); @@ -168,10 +184,16 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode SwingUtil.addExpandOnClickListener(availableStratasTree); TreeModel zonesTreeModel = new ZonesTreeModel(); - JTree zonesTree = ui.getZonesTree(); + final JTree zonesTree = ui.getZonesTree(); zonesTree.setModel(zonesTreeModel); SwingUtil.addExpandOnClickListener(zonesTree); + zonesTree.addTreeSelectionListener(event -> { + boolean zoneSelected = event.getPath().getLastPathComponent() instanceof ZoneNode; + getUI().getDeleteZoneMenuItem().setEnabled(zoneSelected); + getUI().getRenameZoneMenuItem().setEnabled(zoneSelected); + }); + // get data initModel(); @@ -180,22 +202,8 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode JAXXWidgetUtil.expandTree(zonesTree); } - //FIXME move to jaxx - public void collapseTree(final JTree tree) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - int i = 0; - - while(i < tree.getRowCount()) { - tree.collapseRow(i++); - } - - } - }); - } - @Override - public SwingValidator<ZoneEditorUIModel> getValidator() { + public SwingValidator<EditProtocolUIModel> getValidator() { return null; } @@ -206,68 +214,64 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode @Override public void onCloseUI() { - getModel().getZones().forEach(zone -> zone.removePropertyChangeListener(ZoneUIModel.PROPERTY_STRATA, + getModel().getZone().forEach(zone -> ((ZoneUIModel) zone).removePropertyChangeListener(ZoneUIModel.PROPERTY_STRATA, stratasChangeListener)); } - protected void initModel() { - PersistenceService persistenceService = getPersistenceService(); + public void autoSelectNodeInTree(MouseEvent e, JPopupMenu popup) { - TuttiLocation programZone = getDataContext().getProgram().getZone(); + boolean rightClick = SwingUtilities.isRightMouseButton(e); - Multimap<TuttiLocation, TuttiLocation> programStratasAndSubstratas = - HashMultimap.create(persistenceService.getAllFishingOperationStratasAndSubstratas(programZone.getId())); - //FIXME only for tests - TuttiLocation test = programStratasAndSubstratas.keySet().iterator().next(); - for (int i = 0 ; i < 5 ; i++) { - TuttiLocation location = TuttiLocations.newTuttiLocation(); - location.setId(i); - location.setLabel("substrata" + i); - programStratasAndSubstratas.put(test, location); - } + if (rightClick || SwingUtilities.isLeftMouseButton(e)) { - Collection<Zone> zones; + // get the coordinates of the mouse click + Point p = e.getPoint(); - TuttiProtocol protocol = getDataContext().getProtocol(); - if (protocol != null) { + JTree source = (JTree) e.getSource(); - zones = protocol.getZone(); - Collection<Strata> protocolStratas = zones.stream() - .map(zone -> zone.getStrata()) - .flatMap(stratas -> stratas.stream()) - .collect(Collectors.toList()); + // get the row index at this point + int rowIndex = source.getRowForLocation(p.x, p.y); - if (log.isInfoEnabled()) { - log.info("protocol strata " + protocolStratas); + if (log.isDebugEnabled()) { + log.debug("At point [" + p + "] found Row " + rowIndex); } - protocolStratas.forEach(strata -> { + // select row (could empty selection) + if (rowIndex == -1) { + source.clearSelection(); - TuttiLocation strataLocation = strata.getLocation(); + } else { + // set selection + source.setSelectionRow(rowIndex); + } - Collection<TuttiLocation> subStrataLocations = strata.getSubstrata() - .stream() - .map(subStrata -> subStrata.getLocation()) - .collect(Collectors.toSet()); + if (rightClick) { + TreePath path = source.getPathForRow(rowIndex); - if (log.isInfoEnabled()) { - log.info("protocol strata " + strata.getLocation() + " " + subStrataLocations); - } + // on right click show popup + popup.show(source, e.getX(), e.getY()); + } + } + } - if (subStrataLocations.isEmpty()) { - programStratasAndSubstratas.removeAll(strataLocation); + protected void initModel() { + PersistenceService persistenceService = getPersistenceService(); - } else { - subStrataLocations.forEach(subStrataLocation -> - programStratasAndSubstratas.remove(strataLocation, subStrataLocation)); - } - }); + TuttiLocation programZone = getDataContext().getProgram().getZone(); - } else { - zones = new HashSet<>(); + Multimap<TuttiLocation, TuttiLocation> programStratasAndSubstratas = + HashMultimap.create(persistenceService.getAllFishingOperationStratasAndSubstratas(programZone.getId())); + //FIXME only for tests + TuttiLocation test = programStratasAndSubstratas.keySet().iterator().next(); + for (int i = 0 ; i < 5 ; i++) { + TuttiLocation location = TuttiLocations.newTuttiLocation(); + location.setId(i); + location.setLabel("substrata" + i); + programStratasAndSubstratas.put(test, location); } + // on transforme les données du service en modele d'ui Collection<StrataUIModel> availableStratas = new HashSet<>(); programStratasAndSubstratas.keySet().forEach(strataLocation -> { @@ -276,40 +280,59 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode Collection<TuttiLocation> subStrataLocations = new HashSet<>(programStratasAndSubstratas.get(strataLocation)); subStrataLocations.remove(null); Collection<SubStrata> subStratas = subStrataLocations.stream() - .map(subStrataLocation -> new SubStrataUIModel(subStrataLocation)) - .collect(Collectors.toSet()); + .map(subStrataLocation -> new SubStrataUIModel(subStrataLocation)) + .collect(Collectors.toList()); strata.setSubstrata(subStratas); availableStratas.add(strata); }); getModel().setAvailableStratas(availableStratas); - - Collection<ZoneUIModel> zoneModels = zones.stream() - .map(zone -> { - ZoneUIModel zoneUIModel = new ZoneUIModel(); - zoneUIModel.fromEntity(zone); - return zoneUIModel; - }) - .collect(Collectors.toSet()); - getModel().setZones(zoneModels); } protected void updateZonesTreeModel(Collection<ZoneUIModel> zonesToAdd, Collection<ZoneUIModel> zonesToRemove) { JTree zonesTree = getUI().getZonesTree(); ZonesTreeModel zonesTreeModel = (ZonesTreeModel) zonesTree.getModel(); - if (log.isInfoEnabled()) { - log.info("zones to remove" + zonesToRemove); - } + getModel().removeStratasFromZone(zonesToRemove.stream() + .map(zone -> zone.getStrata()) + .flatMap(s -> s.stream()) + .map(strata -> (StrataUIModel) strata) + .collect(Collectors.toSet())); + + zonesToAdd.stream() + .map(zone -> zone.getStrata()) + .flatMap(s -> s.stream()) + .map(strata -> (StrataUIModel) strata) + .forEach(strata -> { + if (strata.getSubstrata().isEmpty()) { + getModel().removeAvailableStrata(strata); + + } else { + StrataUIModel availableStrata = getModel().getStrata(strata); + availableStrata.removeAllSubstrata(strata.getSubstrata() + .stream() + .map(subStrata -> (SubStrataUIModel) subStrata) + .collect(Collectors.toSet())); + + if (availableStrata.isSubstrataEmpty()) { + getModel().removeAvailableStrata(availableStrata); + } + } + }); + zonesTreeModel.removeZones(zonesToRemove); zonesTreeModel.addZones(zonesToAdd); - zonesToRemove.forEach(zone -> zone.removePropertyChangeListener(ZoneUIModel.PROPERTY_STRATA, - stratasChangeListener)); - zonesToAdd.forEach(zone -> zone.addPropertyChangeListener(ZoneUIModel.PROPERTY_STRATA, - stratasChangeListener)); + zonesToRemove.forEach(zone -> { + zone.removePropertyChangeListener(ZoneUIModel.PROPERTY_STRATA, stratasChangeListener); + zone.removePropertyChangeListener(ZoneUIModel.PROPERTY_LABEL, labelChangeListener); + }); + zonesToAdd.forEach(zone -> { + zone.addPropertyChangeListener(ZoneUIModel.PROPERTY_STRATA, stratasChangeListener); + zone.addPropertyChangeListener(ZoneUIModel.PROPERTY_LABEL, labelChangeListener); + }); } @@ -323,10 +346,6 @@ public class ZoneEditorUIHandler extends AbstractTuttiUIHandler<ZoneEditorUIMode availableStratasTreeModel.addStratas(stratasToAdd); - if (log.isInfoEnabled()) { - log.info("add ppcl to " + stratasToAdd); - } - stratasToRemove.forEach(strata -> strata.removePropertyChangeListener(StrataUIModel.PROPERTY_SUBSTRATA, availableSubStratasChangeListener)); stratasToAdd.forEach(strata -> strata.addPropertyChangeListener(StrataUIModel.PROPERTY_SUBSTRATA, diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUIModel.java deleted file mode 100644 index a2069e4..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/ZoneEditorUIModel.java +++ /dev/null @@ -1,194 +0,0 @@ -package fr.ifremer.tutti.ui.swing.content.protocol.zones; - -import fr.ifremer.tutti.persistence.entities.protocol.Strata; -import fr.ifremer.tutti.ui.swing.content.protocol.zones.models.StrataUIModel; -import fr.ifremer.tutti.ui.swing.content.protocol.zones.models.SubStrataUIModel; -import fr.ifremer.tutti.ui.swing.content.protocol.zones.models.ZoneUIModel; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.jdesktop.beans.AbstractSerializableBean; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @author Kevin Morin (Code Lutin) - * @since 4.5 - */ -public class ZoneEditorUIModel extends AbstractSerializableBean { - - /** Logger. */ - private static final Log log = LogFactory.getLog(ZoneEditorUIModel.class); - - public static final String PROPERTY_AVAILABLE_STRATAS = "availableStratas"; - - public static final String PROPERTY_ZONES = "zones"; - - protected final Collection<StrataUIModel> availableStratas = new HashSet<>(); - - protected final Collection<ZoneUIModel> zones = new HashSet<>(); - - public Collection<StrataUIModel> getAvailableStratas() { - return availableStratas; - } - - public void setAvailableStratas(Collection<StrataUIModel> availableStratas) { - this.availableStratas.clear(); - addAllAvailableStratas(availableStratas); - } - - public void addAllAvailableStratas(Collection<StrataUIModel> availableStratas) { - Object oldValue = copyAvailableStratas(); - this.availableStratas.addAll(availableStratas); - firePropertyChange(PROPERTY_AVAILABLE_STRATAS, oldValue, getAvailableStratas()); - } - - public void addAvailableStrata(StrataUIModel availableStrata) { - Object oldValue = copyAvailableStratas(); - this.availableStratas.add(availableStrata); - firePropertyChange(PROPERTY_AVAILABLE_STRATAS, oldValue, getAvailableStratas()); - } - - public void removeAllAvailableStratas(Collection<StrataUIModel> stratas) { - - Object oldValue = copyAvailableStratas(); - - availableStratas.removeAll(stratas); - - firePropertyChange(PROPERTY_AVAILABLE_STRATAS, oldValue, getAvailableStratas()); - - } - - public void removeAvailableStrata(StrataUIModel strata) { - - Object oldValue = copyAvailableStratas(); - - availableStratas.remove(strata); - - firePropertyChange(PROPERTY_AVAILABLE_STRATAS, oldValue, getAvailableStratas()); - - } - - public Collection<ZoneUIModel> getZones() { - return zones; - } - - public void setZones(Collection<ZoneUIModel> zones) { - Object oldValue = new HashSet<>(getZones()); - this.zones.clear(); - this.zones.addAll(zones); - firePropertyChange(PROPERTY_ZONES, oldValue, getZones()); - } - - public void addZone(ZoneUIModel zone) { - Object oldValue = new HashSet<>(getZones()); - zones.add(zone); - firePropertyChange(PROPERTY_ZONES, oldValue, getZones()); - } - - public void removeZone(ZoneUIModel zone) { - Object oldValue = new ArrayList<>(getZones()); - - removeStratasFromZone(zone.getStrata().stream() - .map(strata -> (StrataUIModel) strata) - .collect(Collectors.toSet())); - zones.remove(zone); - - firePropertyChange(PROPERTY_ZONES, oldValue, getZones()); - } - - public void removeAllZones(Collection<ZoneUIModel> zones) { - Object oldValue = new ArrayList<>(getZones()); - - removeStratasFromZone(zones.stream() - .map(zone -> zone.getStrata()) - .flatMap(s -> s.stream()) - .map(strata -> (StrataUIModel) strata) - .collect(Collectors.toSet())); - this.zones.removeAll(zones); - - firePropertyChange(PROPERTY_ZONES, oldValue, getZones()); - } - - public void moveStratasToZone(Collection<StrataUIModel> stratas, ZoneUIModel zone) { - if (log.isInfoEnabled()) { - log.info("stratas " + stratas); - } - - zone.addAllStrata(new ArrayList<>(stratas)); - removeAllAvailableStratas(stratas); - } - - public void removeStratasFromZone(Collection<StrataUIModel> stratas) { - if (log.isInfoEnabled()) { - log.info("stratas " + stratas); - } - - stratas.forEach(strata -> strata.getZone().removeStrata(strata)); - addAllAvailableStratas(stratas); - } - - public void moveSubStratasToZone(Collection<SubStrataUIModel> subStratas, ZoneUIModel zone) { - if (log.isInfoEnabled()) { - log.info("substrats " + subStratas); - } - - subStratas.forEach(subStrata -> { - StrataUIModel strata = subStrata.getStrata(); - strata.removeSubstrata(subStrata); - - Strata zoneStrata = zone.getStrata(strata); - - if (zoneStrata == null) { - zoneStrata = new StrataUIModel(strata.getLocation()); - zone.addStrata(zoneStrata); - } - - zoneStrata.addSubstrata(subStrata); - - if (strata.isSubstrataEmpty()) { - removeAvailableStrata(strata); - } - }); - - } - - public void removeSubStratasFromZone(Collection<SubStrataUIModel> subStratas) { - if (log.isInfoEnabled()) { - log.info("subStratas " + subStratas); - } - - subStratas.forEach(subStrata -> { - StrataUIModel strata = subStrata.getStrata(); - strata.removeSubstrata(subStrata); - - StrataUIModel availableStrata = getStrata(strata); - if (availableStrata == null) { - availableStrata = new StrataUIModel(strata.getLocation()); - addAvailableStrata(availableStrata); - } - availableStrata.addSubstrata(subStrata); - - if (strata.isSubstrataEmpty()) { - strata.getZone().removeStrata(strata); - } - - }); - } - - /** - * @param strata - * @return the strata from the available stratas which equals the strata in parameters - */ - protected StrataUIModel getStrata(StrataUIModel strata) { - return availableStratas.stream().filter(s -> s != null && s.equals(strata)).findFirst().orElse(null); - } - - protected List<StrataUIModel> copyAvailableStratas() { - return new ArrayList<>(availableStratas); - } - -} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/AddStratasAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/AddStratasAction.java index 4782588..615562d 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/AddStratasAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/AddStratasAction.java @@ -40,43 +40,46 @@ public class AddStratasAction extends SimpleActionSupport<ZoneEditorUI> { JTree zonesTree = zoneEditorUI.getZonesTree(); TreePath selectedZonePath = zonesTree.getSelectionPath(); - ZoneNode zoneNode = (ZoneNode) selectedZonePath.getPathComponent(1); - ZoneUIModel selectedZone = zoneNode.getZone(); - Set<StrataUIModel> stratasToAdd = new HashSet<>(); - Set<SubStrataUIModel> subStratasToAdd = new HashSet<>(); + if (selectedZonePath != null) { + ZoneNode zoneNode = (ZoneNode) selectedZonePath.getPathComponent(1); + ZoneUIModel selectedZone = zoneNode.getZone(); - for (TreePath treePath : selectedStratas) { + Set<StrataUIModel> stratasToAdd = new HashSet<>(); + Set<SubStrataUIModel> subStratasToAdd = new HashSet<>(); - Object node = treePath.getLastPathComponent(); + for (TreePath treePath : selectedStratas) { - if (node instanceof StrataNode) { + Object node = treePath.getLastPathComponent(); - StrataUIModel strata = ((StrataNode) node).getStrata(); - if (log.isInfoEnabled()) { - log.info("add strata " + strata.getLabel()); - } - stratasToAdd.add(strata); + if (node instanceof StrataNode) { + + StrataUIModel strata = ((StrataNode) node).getStrata(); + if (log.isInfoEnabled()) { + log.info("add strata " + strata.getLabel()); + } + stratasToAdd.add(strata); - } else if (node instanceof SubStrataNode) { - SubStrataUIModel subStrata = ((SubStrataNode) node).getSubstrata(); - if (log.isInfoEnabled()) { - log.info("add subtrata " + subStrata.getLabel()); + } else if (node instanceof SubStrataNode) { + SubStrataUIModel subStrata = ((SubStrataNode) node).getSubstrata(); + if (log.isInfoEnabled()) { + log.info("add subtrata " + subStrata.getLabel()); + } + subStratasToAdd.add(subStrata); } - subStratasToAdd.add(subStrata); - } - } + } - Collection<SubStrata> alreadyAddedSubStratas = stratasToAdd.stream() - .map(strata->strata.getSubstrata()) - .flatMap(c -> c.stream()) - .collect(Collectors.toSet()); + Collection<SubStrata> alreadyAddedSubStratas = stratasToAdd.stream() + .map(strata -> strata.getSubstrata()) + .flatMap(c -> c.stream()) + .collect(Collectors.toSet()); - subStratasToAdd.removeAll(alreadyAddedSubStratas); + subStratasToAdd.removeAll(alreadyAddedSubStratas); - zoneEditorUI.getModel().moveStratasToZone(stratasToAdd, selectedZone); - zoneEditorUI.getModel().moveSubStratasToZone(subStratasToAdd, selectedZone); + zoneEditorUI.getModel().moveStratasToZone(stratasToAdd, selectedZone); + zoneEditorUI.getModel().moveSubStratasToZone(subStratasToAdd, selectedZone); + } } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/CollapseAvailableStratasTreeAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/CollapseAvailableStratasTreeAction.java index 940f29f..ab905e5 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/CollapseAvailableStratasTreeAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/CollapseAvailableStratasTreeAction.java @@ -1,6 +1,7 @@ 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.util.TuttiUIUtil; import fr.ifremer.tutti.ui.swing.util.actions.SimpleActionSupport; /** @@ -15,6 +16,6 @@ public class CollapseAvailableStratasTreeAction extends SimpleActionSupport<Zone @Override protected void onActionPerformed(ZoneEditorUI zoneEditorUI) { - zoneEditorUI.getHandler().collapseTree(zoneEditorUI.getAvailableStratasTree()); + TuttiUIUtil.collapseTree(zoneEditorUI.getAvailableStratasTree()); } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/CollapseZonesTreeAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/CollapseZonesTreeAction.java index 8d2823e..b933796 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/CollapseZonesTreeAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/CollapseZonesTreeAction.java @@ -1,6 +1,7 @@ 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.util.TuttiUIUtil; import fr.ifremer.tutti.ui.swing.util.actions.SimpleActionSupport; /** @@ -15,6 +16,6 @@ public class CollapseZonesTreeAction extends SimpleActionSupport<ZoneEditorUI> { @Override protected void onActionPerformed(ZoneEditorUI zoneEditorUI) { - zoneEditorUI.getHandler().collapseTree(zoneEditorUI.getZonesTree()); + TuttiUIUtil.collapseTree(zoneEditorUI.getZonesTree()); } } 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 index 68c6d03..66acabd 100644 --- 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 @@ -1,18 +1,15 @@ package fr.ifremer.tutti.ui.swing.content.protocol.zones.actions; +import fr.ifremer.tutti.persistence.entities.protocol.Zone; 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.util.actions.SimpleActionSupport; -import org.apache.commons.lang3.StringUtils; 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.HashSet; -import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -34,25 +31,19 @@ public class DeleteZoneAction extends SimpleActionSupport<ZoneEditorUI> { JTree zonesTree = zoneEditorUI.getZonesTree(); - if (zonesTree.getSelectionCount() >= 1) { + if (zonesTree.getSelectionCount() == 1) { - Set<ZoneUIModel> zonesToDelete = new HashSet<>(); - TreePath[] selectionPaths = zonesTree.getSelectionPaths(); - for (TreePath selectedPath : selectionPaths) { - ZoneUIModel zone = ((ZoneNode) selectedPath.getPathComponent(1)).getZone(); - zonesToDelete.add(zone); - } - - String zonesToDeleteListItems = "<li>" + StringUtils.join(zonesToDelete, "</li><li>") + "</li>"; + TreePath selectedPath = zonesTree.getSelectionPath(); + Zone zone = ((ZoneNode) selectedPath.getPathComponent(1)).getZone(); int confirmDeletion = JOptionPane.showConfirmDialog(zoneEditorUI, - t("tutti.zoneEditor.deleteZone.message", zonesToDeleteListItems), + t("tutti.zoneEditor.deleteZone.message", zone), t("tutti.zoneEditor.deleteZone.title"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (confirmDeletion == JOptionPane.YES_OPTION) { - zoneEditorUI.getModel().removeAllZones(zonesToDelete); + zoneEditorUI.getModel().removeZone(zone); } } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/RenameZoneAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/RenameZoneAction.java new file mode 100644 index 0000000..ae67260 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/actions/RenameZoneAction.java @@ -0,0 +1,54 @@ +package fr.ifremer.tutti.ui.swing.content.protocol.zones.actions; + +import fr.ifremer.tutti.persistence.entities.protocol.Zone; +import fr.ifremer.tutti.ui.swing.content.protocol.zones.ZoneEditorUI; +import fr.ifremer.tutti.ui.swing.content.protocol.zones.tree.ZoneNode; +import fr.ifremer.tutti.ui.swing.util.actions.SimpleActionSupport; +import org.apache.commons.lang3.StringUtils; +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; + +/** + * @author Kevin Morin (Code Lutin) + * @since 4.5 + */ +public class RenameZoneAction extends SimpleActionSupport<ZoneEditorUI> { + + /** Logger. */ + private static final Log log = LogFactory.getLog(RenameZoneAction.class); + + public RenameZoneAction(ZoneEditorUI zoneEditorUI) { + super(zoneEditorUI); + } + + @Override + protected void onActionPerformed(ZoneEditorUI zoneEditorUI) { + + JTree zonesTree = zoneEditorUI.getZonesTree(); + + if (zonesTree.getSelectionCount() == 1) { + + TreePath selectedPath = zonesTree.getSelectionPath(); + ZoneNode zoneNode = (ZoneNode) selectedPath.getPathComponent(1); + Zone zone = zoneNode.getZone(); + + String zoneLabel = (String) JOptionPane.showInputDialog(zoneEditorUI, + t("tutti.zoneEditor.renameZone.message", zone.getLabel()), + t("tutti.zoneEditor.renameZone.title", zone.getLabel()), + JOptionPane.QUESTION_MESSAGE, + null, + null, + zone.getLabel()); + + if (StringUtils.isNotEmpty(zoneLabel)) { + zone.setLabel(zoneLabel); + } + } + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/models/SubStrataUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/models/SubStrataUIModel.java index 8dcbd8a..cdf6487 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/models/SubStrataUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/zones/models/SubStrataUIModel.java @@ -92,14 +92,14 @@ public class SubStrataUIModel extends AbstractTuttiBeanUIModel<SubStrata, SubStr if (obj == this) { return true; } - if (!StrataUIModel.class.equals(obj.getClass())) { + if (!SubStrataUIModel.class.equals(obj.getClass())) { return false; } if (getId() != null) { - return getId().equals(((StrataUIModel) obj).getId()); + return getId().equals(((SubStrataUIModel) obj).getId()); } if (getLocation() != null) { - return getLocation().equals(((StrataUIModel) obj).getLocation()); + return getLocation().equals(((SubStrataUIModel) obj).getLocation()); } return false; } 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 2072ed3..047e183 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 @@ -192,4 +192,8 @@ public class ZonesTreeModel extends AbstractZoneEditorTreeModel { return subStrataNode; } + + public void zoneLabelChanged(ZoneUIModel zone) { + nodeChanged(findZoneNode(zone)); + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java index 701137b..d8df4f1 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/TuttiUIUtil.java @@ -42,7 +42,9 @@ import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JMenuItem; import javax.swing.JRadioButton; +import javax.swing.JTree; import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; import java.awt.Color; import java.awt.Desktop; import java.awt.event.KeyEvent; @@ -229,5 +231,18 @@ public final class TuttiUIUtil extends ApplicationUIUtil { } } + //FIXME move to jaxx + public static void collapseTree(final JTree tree) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + int i = 0; + + while(i < tree.getRowCount()) { + tree.collapseRow(i++); + } + + } + }); + } } diff --git a/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel-error-validation.xml b/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel-error-validation.xml new file mode 100644 index 0000000..62a6e21 --- /dev/null +++ b/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel-error-validation.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + #%L + Tutti :: UI + %% + Copyright (C) 2012 - 2014 Ifremer + %% + 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% + --> + +<!DOCTYPE validators PUBLIC + "-//Apache Struts//XWork Validator 1.0.3//EN" + "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> +<validators> + + <field name="availableStratas"> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ availableStratas.isEmpty() ]]> + </param> + <message> + tutti.validator.error.zoneEditor.availableStratas.remaining + </message> + </field-validator> + </field> + +</validators> 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 7979ac0..509c298 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 @@ -2336,6 +2336,7 @@ tutti.validator.error.splitSpeciesBatch.sampleWeight.sampleBatchGreaterThanBatch tutti.validator.error.splitSpeciesBatch.sampleWeight.sampleWeightGreaterThanBatchSampleWeight= tutti.validator.error.splitSpeciesBatch.selectedCategory.required= tutti.validator.error.splitSpeciesBatch.weight.weightGreaterThanBatchSampleWeight= +tutti.validator.error.zoneEditor.availableStratas.remaining= tutti.validator.info.cruise.noError= tutti.validator.info.operation.noError= tutti.validator.warning.benthosFrequency.redundantTotalWeight= @@ -2346,7 +2347,15 @@ tutti.vesselUseFeatureTable.action.removeCaracteristic.tip= tutti.vesselUseFeatureTable.table.header.key= tutti.vesselUseFeatureTable.table.header.value= tutti.vesselUseFeatureTable.title= +tutti.zoneEditor.action.delete= +tutti.zoneEditor.action.delete.mnemonic= +tutti.zoneEditor.action.delete.tip= +tutti.zoneEditor.action.rename= +tutti.zoneEditor.action.rename.mnemonic= +tutti.zoneEditor.action.rename.tip= tutti.zoneEditor.createZone.message= tutti.zoneEditor.createZone.title= tutti.zoneEditor.deleteZone.message= tutti.zoneEditor.deleteZone.title= +tutti.zoneEditor.renameZone.message= +tutti.zoneEditor.renameZone.title= 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 146154c..176e77f 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 @@ -2161,6 +2161,7 @@ tutti.validator.error.speciesFrequency.step.positiveValue=Le pas de la classe de tutti.validator.error.splitSpeciesBatch.sampleWeight.invalidValue=La somme des poids ventilés doit être strictement positive tutti.validator.error.splitSpeciesBatch.sampleWeight.sampleBatchGreaterThanBatchWeight=La somme des poids ventilés doit être inférieur ou égale à celle du poids du lot tutti.validator.error.splitSpeciesBatch.selectedCategory.required=La catégorie est obligatoire +tutti.validator.error.zoneEditor.availableStratas.remaining= tutti.validator.info.cruise.noError=Campagne sans erreur tutti.validator.info.operation.noError=Trait sans erreur tutti.validator.warning.benthosFrequency.redundantTotalWeight=Le poids total est redondant (égal au poids calculé à partir des poids observés) @@ -2171,7 +2172,15 @@ tutti.vesselUseFeatureTable.action.removeCaracteristic.tip=Supprimer la caracté tutti.vesselUseFeatureTable.table.header.key=Caractéristique tutti.vesselUseFeatureTable.table.header.value=Valeur tutti.vesselUseFeatureTable.title=Autres paramètres +tutti.zoneEditor.action.delete=Supprimer la zone +tutti.zoneEditor.action.delete.mnemonic=Supprimer la zone sélectionnée +tutti.zoneEditor.action.delete.tip=S +tutti.zoneEditor.action.rename=Renommer la zone +tutti.zoneEditor.action.rename.mnemonic=Renommer la zone sélectionnée +tutti.zoneEditor.action.rename.tip=R tutti.zoneEditor.createZone.message=Libellé de la nouvelle zone tutti.zoneEditor.createZone.title=Nouvelle zone -tutti.zoneEditor.deleteZone.message=<html><div>Vous êtes sur le point de supprimer les zones suivantes \:</div><ul>%s</ul><div>Êtes-vous sûr de vouloir les supprimer ?</div></html> +tutti.zoneEditor.deleteZone.message=Vous êtes sur le point de supprimer la zone %s. Êtes-vous sûr de vouloir la supprimer ? tutti.zoneEditor.deleteZone.title=Suppression de zone +tutti.zoneEditor.renameZone.message=Nouveau libellé de la zone +tutti.zoneEditor.renameZone.title=Renommer la zone %s -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.