Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: c2abb164 by Tony CHEMIT at 2018-10-16T14:37:04Z Correction sur l'API d'ouverture et fermeture (l'id est supprimé trop tôt... plus bien repaindre l'abre de navigation) - - - - - d0ac7447 by Tony CHEMIT at 2018-10-16T14:37:33Z Calcul de l'activité d'observation sur l'écran de l'activité logbook - Closes #1150 - - - - - 19 changed files: - client/src/main/java/fr/ird/observe/client/navigation/RouteCloseCallback.java - client/src/main/java/fr/ird/observe/client/ui/ObserveKeyStrokes.java - client/src/main/java/fr/ird/observe/client/ui/actions/content/api/data/open/CloseOpenDataUIAction.java - client/src/main/java/fr/ird/observe/client/ui/actions/content/api/data/open/CreateOpenDataUIAction.java - client/src/main/java/fr/ird/observe/client/ui/actions/content/api/data/open/MoveSingleDataUIActionSupport.java - + client/src/main/java/fr/ird/observe/client/ui/actions/content/data/longline/ChooseRelatedObservedActivityUIAction.java - client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUI.jaxx - client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUI.jcss - client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUIHandler.java - client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUIModel.java - client/src/main/resources/i18n/client_en_GB.properties - client/src/main/resources/i18n/client_es_ES.properties - client/src/main/resources/i18n/client_fr_FR.properties - dto/src/main/java/fr/ird/observe/dto/data/longline/ActivityLonglineAware.java - dto/src/main/java/fr/ird/observe/dto/data/longline/ActivityLonglineLogbookDto.java - dto/src/main/java/fr/ird/observe/dto/data/longline/ActivityLonglineObsDto.java - dto/src/main/java/fr/ird/observe/navigation/model/edit/ObserveEditModelManager.java - services/src/main/java/fr/ird/observe/services/service/actions/pairing/ActivityLonglinePairingEngine.java - services/src/main/java/fr/ird/observe/services/service/actions/pairing/TripLonglinePairingContext.java Changes: ===================================== client/src/main/java/fr/ird/observe/client/navigation/RouteCloseCallback.java ===================================== @@ -43,6 +43,7 @@ import org.nuiton.util.DateUtil; import javax.swing.JOptionPane; import javax.swing.tree.MutableTreeNode; +import java.util.Objects; import static fr.ird.observe.client.ui.content.api.ContentUIHandler.getNavigationTree; import static org.nuiton.i18n.I18n.t; @@ -75,7 +76,7 @@ public class RouteCloseCallback implements ObserveEditNodeCloseCallback { return; } - boolean activityFinDeVeilleFound = mainDataSource.getRouteService().isActivityFinDeVeilleFound(node.getId()); + boolean activityFinDeVeilleFound = mainDataSource.getRouteService().isActivityFinDeVeilleFound(Objects.requireNonNull(node.getId())); // on doit vérifier qu'il existe une activité de fin de veille (type activity vessel == 16) ===================================== client/src/main/java/fr/ird/observe/client/ui/ObserveKeyStrokes.java ===================================== @@ -75,6 +75,7 @@ public abstract class ObserveKeyStrokes { public static final KeyStroke KEY_STROKE_CONFIGURE_SYNCHRO_FROM_BOTH = KeyStroke.getKeyStroke("ctrl pressed C"); public static final KeyStroke KEY_STROKE_COPY_VALUES_AND_SAVE = KeyStroke.getKeyStroke("ctrl pressed T"); + public static final KeyStroke KEY_STROKE_CHOOSE_RELATED_OBSERVATION_ACTIVITY = KeyStroke.getKeyStroke("ctrl pressed T"); public static final KeyStroke KEY_STROKE_SELECT_TRANSSHIPMENT = KeyStroke.getKeyStroke("ctrl pressed T"); public static final KeyStroke KEY_STROKE_SAVE_TABLE_ENTRY = KeyStroke.getKeyStroke("ctrl pressed S"); public static final KeyStroke KEY_STROKE_PRESSED_ENTER = KeyStroke.getKeyStroke("pressed ENTER"); ===================================== client/src/main/java/fr/ird/observe/client/ui/actions/content/api/data/open/CloseOpenDataUIAction.java ===================================== @@ -33,16 +33,18 @@ import fr.ird.observe.client.ui.content.api.data.open.ContentOpenableUIModel; import fr.ird.observe.client.ui.tree.navigation.NavigationTree; import fr.ird.observe.client.ui.util.UIHelper; import fr.ird.observe.dto.data.DataDto; -import fr.ird.observe.dto.data.longline.TripLonglineDto; -import fr.ird.observe.dto.data.seine.TripSeineDto; import fr.ird.observe.dto.reference.DataDtoReference; import fr.ird.observe.navigation.model.edit.CloseEditNodeRequest; import fr.ird.observe.navigation.model.edit.CloseEditNodeVetoException; import fr.ird.observe.navigation.model.edit.ObserveEditModelManager; import fr.ird.observe.navigation.model.edit.ObserveEditNode; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.nuiton.validator.NuitonValidatorScope; -import static fr.ird.observe.client.ui.content.api.ContentUIHandler.getNavigationTree; +import javax.swing.tree.MutableTreeNode; +import javax.swing.tree.TreeNode; + import static fr.ird.observe.client.ui.content.api.ContentUIHandler.removeAllMessages; import static fr.ird.observe.dto.decoration.ObserveI18nDecoratorHelper.getTypeI18nKey; import static org.nuiton.i18n.I18n.n; @@ -58,6 +60,7 @@ public class CloseOpenDataUIAction extends AbstractContentUIAction { public static final String ACTION_NAME = CloseOpenDataUIAction.class.getName(); private static final long serialVersionUID = 1L; + private static final Logger log = LogManager.getLogger(CloseOpenDataUIAction.class); public CloseOpenDataUIAction(ObserveMainUI mainUI) { super(mainUI, ACTION_NAME, @@ -75,7 +78,12 @@ public class CloseOpenDataUIAction extends AbstractContentUIAction { ObserveEditModelManager navigationEditManager = applicationContext.getNavigationEditManager(); CloseEditNodeRequest closeRequest = navigationEditManager.createCloseEditNodeRequest(nodeToClose); navigationEditManager.applyCloseEditNodeRequest(closeRequest); - ObserveSwingApplicationContext.get().saveNavigationToConfig(false); + applicationContext.saveNavigationToConfig(false); + NavigationTree tree = applicationContext.getMainUI().getNavigationUI().getTree(); + TreeNode[] path = tree.getSelectedNode().getPath(); + MutableTreeNode nodeToReload = (MutableTreeNode) path[path.length - 1]; + log.info("Will reload node and all his children: " + nodeToReload); + tree.reloadNode(nodeToReload, true); } @SuppressWarnings("unchecked") @@ -110,8 +118,8 @@ public class CloseOpenDataUIAction extends AbstractContentUIAction { removeAllMessages(ui); ContentUIHandler.addMessage(ui, NuitonValidatorScope.INFO, getTypeI18nKey(bean.getClass()), t(model.getCloseMessage())); - NavigationTree treeHelper = getNavigationTree(); - treeHelper.reloadSelectedNode(bean instanceof TripSeineDto || bean instanceof TripLonglineDto, true); +// NavigationTree treeHelper = getNavigationTree(); +// treeHelper.reloadSelectedNode(bean instanceof TripSeineDto || bean instanceof TripLonglineDto, true); ui.getHandler().updateActions(); ui.getHandler().grabFocusOnForm(); ===================================== client/src/main/java/fr/ird/observe/client/ui/actions/content/api/data/open/CreateOpenDataUIAction.java ===================================== @@ -49,17 +49,14 @@ public class CreateOpenDataUIAction extends AbstractContentUIAction { public static void closeAndCreate(MultipleReferenceContainerNode<?, ?> parentNode, NavigationTree tree, ContentEditUIModel<?, ?> model) { try { CloseOpenDataUIAction.closeData(model.getEditNode()); + tree.addUnsavedNode(parentNode); } catch (CloseEditNodeVetoException e1) { UIHelper.handlingError(e1); - return; } - - tree.addUnsavedNode(parentNode); } @Override protected void actionPerformed(ContentUI contentUI) { - MultipleReferenceContainerNode<?, ?> parentNode; NavigationTree tree = getMainUI().getNavigationUI().getTree(); ContentEditUIModel<?, ?> model; ===================================== client/src/main/java/fr/ird/observe/client/ui/actions/content/api/data/open/MoveSingleDataUIActionSupport.java ===================================== @@ -137,10 +137,6 @@ public abstract class MoveSingleDataUIActionSupport<ChildDto extends IdDto, Chil protected void closeNode(ObserveEditNode<?> editNode) throws CloseEditNodeVetoException { CloseOpenDataUIAction.closeData(editNode); -// String id = editNode.getId(); -// if (dataId.equals(id)) { -// editNode.setId(null); -// } } protected void adaptNavigationTree(NavigationTree tree, R request, DtoReference newParentReference) { ===================================== client/src/main/java/fr/ird/observe/client/ui/actions/content/data/longline/ChooseRelatedObservedActivityUIAction.java ===================================== @@ -0,0 +1,140 @@ +package fr.ird.observe.client.ui.actions.content.data.longline; + +/*- + * #%L + * ObServe :: Client + * %% + * Copyright (C) 2008 - 2018 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.client.ObserveSwingApplicationContext; +import fr.ird.observe.client.ui.ObserveKeyStrokes; +import fr.ird.observe.client.ui.ObserveMainUI; +import fr.ird.observe.client.ui.actions.content.api.AbstractContentUIAction; +import fr.ird.observe.client.ui.content.api.ContentUI; +import fr.ird.observe.client.ui.content.data.longline.logbook.ActivityLonglineLogbookUI; +import fr.ird.observe.client.ui.content.data.longline.logbook.ActivityLonglineLogbookUIModel; +import fr.ird.observe.client.ui.content.ref.usage.UsageUIHandlerSupport; +import fr.ird.observe.client.ui.util.UIHelper; +import fr.ird.observe.dto.data.longline.ActivityLonglineLogbookDto; +import fr.ird.observe.dto.data.longline.ActivityLonglineObsDto; +import fr.ird.observe.dto.data.longline.ActivityLonglineObsReference; +import fr.ird.observe.dto.data.pairing.ActivityLonglinePairingResult; +import fr.ird.observe.dto.data.pairing.ActivityLonglinePairingResultItem; +import fr.ird.observe.dto.decoration.ObserveI18nLabelsBuilder; +import fr.ird.observe.services.service.actions.pairing.ActivityLonglinePairingConfig; +import fr.ird.observe.services.service.actions.pairing.ActivityLonglinePairingEngine; +import fr.ird.observe.services.service.actions.pairing.TripLonglinePairingContext; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.nuiton.decorator.JXPathDecorator; +import org.nuiton.jaxx.widgets.select.BeanFilterableComboBox; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import static org.nuiton.i18n.I18n.n; +import static org.nuiton.i18n.I18n.t; + +/** + * Created by tchemit on 16/10/2018. + * + * @author Tony Chemit - dev@tchemit.fr + */ +public class ChooseRelatedObservedActivityUIAction extends AbstractContentUIAction { + + public static final String ACTION_NAME = ChooseRelatedObservedActivityUIAction.class.getName(); + private static final Logger log = LogManager.getLogger(ChooseRelatedObservedActivityUIAction.class); + + public ChooseRelatedObservedActivityUIAction(ObserveMainUI mainUI) { + super(mainUI, ACTION_NAME, n("observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity"), n("observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity"), "data-calcule", ObserveKeyStrokes.KEY_STROKE_CHOOSE_RELATED_OBSERVATION_ACTIVITY); + } + + @Override + protected void actionPerformed(ContentUI contentUI) { + + ActivityLonglineLogbookUI ui = (ActivityLonglineLogbookUI) contentUI; + ActivityLonglineLogbookUIModel model = ui.getModel(); + + ActivityLonglinePairingEngine pairingEngine = new ActivityLonglinePairingEngine(getServicesProvider(), ui.getConfig()); + + ActivityLonglineLogbookDto bean = model.getBean(); + + TripLonglinePairingContext pairingContext = pairingEngine.newTripContext(model.getSelectedParentId(), model.getAllActivityObs()); + + ActivityLonglinePairingResult activityLonglinePairingResult = pairingEngine.computeForActivityLogbook(pairingContext, bean); + + Optional<ActivityLonglineObsReference> optionalActivityLonglineObs = askNewParent(activityLonglinePairingResult.getItems(), pairingEngine.getConfig()); + + if (optionalActivityLonglineObs.isPresent()) { + ActivityLonglineObsReference activityLonglineObs = optionalActivityLonglineObs.get(); + log.info("will use new related activity obs: " + activityLonglineObs); + bean.setRelatedObservedActivity(activityLonglineObs); + } + + } + + private Optional<ActivityLonglineObsReference> askNewParent(List<ActivityLonglinePairingResultItem> pairingResult, ActivityLonglinePairingConfig pairingConfig) { + + BeanFilterableComboBox<ActivityLonglinePairingResultItem> editor = new BeanFilterableComboBox<>(); + editor.setI18nPrefix("observe.common."); + editor.setBeanType(ActivityLonglinePairingResultItem.class); + editor.setI18nLabelBuilder(ObserveI18nLabelsBuilder.createFromReferenceType(ActivityLonglineObsDto.class)); + + editor.init((JXPathDecorator<ActivityLonglinePairingResultItem>) ObserveSwingApplicationContext.get().getDecoratorService().getDecoratorByType(ActivityLonglinePairingResultItem.class), pairingResult); + +// JComboBox combobox = editor.getCombobox(); +// @SuppressWarnings("unchecked") ListCellRenderer toolTipRenderer = new ComboBoxListCellRenderer(combobox.getRenderer()); +// combobox.setRenderer(toolTipRenderer); + + String continueActionText = t("observe.choice.continue"); + Object[] options = {continueActionText, t("observe.choice.cancel")}; + JPanel panel = new JPanel(new BorderLayout()); + panel.add(BorderLayout.NORTH, new JLabel(t("observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.message", + pairingConfig.getLonglineActivityPairingMaxTime(), pairingConfig.getLonglineActivityPairingMaxDistance()))); + panel.add(BorderLayout.CENTER, editor); + + JOptionPane pane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[0]); + + JButton jButton = UsageUIHandlerSupport.findButton(pane, continueActionText); + Objects.requireNonNull(jButton); + jButton.setEnabled(false); + editor.addPropertyChangeListener("selectedItem", evt -> jButton.setEnabled(evt.getNewValue() != null)); + + int response = UIHelper.askUser(ObserveSwingApplicationContext.get().getMainUI(), pane, t("observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.title"), options); + + ActivityLonglinePairingResultItem newActivityLonglineObs = null; + switch (response) { + case 0: + newActivityLonglineObs = editor.getComboBoxModel().getSelectedItem(); + log.info(String.format("Selected new related observed activity id: %s", newActivityLonglineObs)); + break; + default: + log.info("Use cancel choice of related observed activity"); + } + return Optional.ofNullable(newActivityLonglineObs).map(ActivityLonglinePairingResultItem::getObservationActivity); + } + +} + ===================================== client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUI.jaxx ===================================== @@ -41,6 +41,7 @@ fr.ird.observe.client.ui.actions.content.data.longline.delete.DeleteActivityLonglineLogbookUIAction fr.ird.observe.client.ui.actions.content.data.longline.move.MoveSingleActivityLonglineLogbookUIAction fr.ird.observe.client.ui.actions.content.data.longline.save.SaveActivityLonglineLogbookUIAction + fr.ird.observe.client.ui.actions.content.data.longline.ChooseRelatedObservedActivityUIAction fr.ird.observe.dto.data.pairing.ActivityLonglinePairingResultItem @@ -190,7 +191,10 @@ <JLabel id='relatedObservedActivityLabel'/> </cell> <cell anchor='east' fill="both"> - <BeanFilterableComboBox id='relatedObservedActivity' genericType='ActivityLonglinePairingResultItem' constructorParams='this'/> + <JPanel layout="{new BorderLayout()}"> + <BeanFilterableComboBox id='relatedObservedActivity' genericType='ActivityLonglineObsReference' constructorParams='this' constraints='BorderLayout.CENTER'/> + <JButton id='chooseRelatedObservedActivity' constraints='BorderLayout.EAST'/> + </JPanel> </cell> </row> ===================================== client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUI.jcss ===================================== @@ -84,10 +84,8 @@ #relatedObservedActivity { _listNoLoad:true; - bean:{model}; - property:activityObs; - data:{model.getActivityObsCandidates()}; - selectedItem:{model.getActivityObs()}; + data:{model.getActivityObs()}; + selectedItem:{bean.getRelatedObservedActivity()}; } #reopen { @@ -119,3 +117,9 @@ enabled:{!model.isModified() && model.isValid() && model.isSetOperation() && ! bean.isHasSetLongline()}; _observeAction:{AddActivityLonglineLogbookSetUIAction.ACTION_NAME}; } + +#chooseRelatedObservedActivity { + visible:{!model.isReadingMode()}; + enabled:{model.isValid()}; + _observeAction:{ChooseRelatedObservedActivityUIAction.ACTION_NAME}; +} \ No newline at end of file ===================================== client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUIHandler.java ===================================== @@ -22,44 +22,19 @@ package fr.ird.observe.client.ui.content.data.longline.logbook; * #L% */ -import com.google.common.collect.ImmutableSet; import fr.ird.observe.client.ui.content.api.data.open.ContentOpenableUIHandler; -import fr.ird.observe.client.ui.content.api.data.open.ContentOpenableUIInitializer; import fr.ird.observe.client.ui.content.api.ui.ObserveLayoutFocusTraversalPolicy; import fr.ird.observe.dto.data.longline.ActivityLonglineLogbookDto; import fr.ird.observe.dto.data.longline.ActivityLonglineLogbookReference; -import fr.ird.observe.dto.data.longline.ActivityLonglineObsDto; import fr.ird.observe.dto.data.longline.ActivityLonglineObsReference; -import fr.ird.observe.dto.data.pairing.ActivityLonglinePairingResult; -import fr.ird.observe.dto.data.pairing.ActivityLonglinePairingResultItem; -import fr.ird.observe.dto.decoration.ObserveI18nDecoratorHelper; -import fr.ird.observe.dto.decoration.ObserveI18nLabelsBuilder; import fr.ird.observe.dto.form.Form; -import fr.ird.observe.services.service.actions.pairing.ActivityLonglinePairingEngine; -import fr.ird.observe.services.service.actions.pairing.TripLonglinePairingContext; -import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.nuiton.decorator.Decorator; -import org.nuiton.decorator.JXPathDecorator; import org.nuiton.jaxx.runtime.spi.UIHandler; -import org.nuiton.jaxx.widgets.select.BeanFilterableComboBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.KeyStroke; -import javax.swing.ListCellRenderer; import java.awt.Component; import java.awt.Container; -import java.awt.Dimension; -import java.awt.event.KeyEvent; -import java.beans.PropertyChangeListener; -import java.util.Collections; -import java.util.Optional; - -import static org.nuiton.i18n.I18n.t; +import java.util.List; /** * Created on 8/29/14. @@ -69,65 +44,13 @@ import static org.nuiton.i18n.I18n.t; */ class ActivityLonglineLogbookUIHandler extends ContentOpenableUIHandler<ActivityLonglineLogbookDto, ActivityLonglineLogbookReference, ActivityLonglineLogbookUI> implements UIHandler<ActivityLonglineLogbookUI> { - private static final ImmutableSet<String> PAIRING_PROPERTIES = ImmutableSet.of( - ActivityLonglineLogbookDto.PROPERTY_LATITUDE, - ActivityLonglineLogbookDto.PROPERTY_LONGITUDE, - ActivityLonglineLogbookDto.PROPERTY_TIME_STAMP, - ActivityLonglineLogbookUIModel.PROPERTY_VALID); - private static final Logger log = LogManager.getLogger(ActivityLonglineLogbookUIHandler.class); - private final PropertyChangeListener onRecomputePairing; - private final PropertyChangeListener onActivityObsChanged; - private ActivityLonglinePairingEngine pairingEngine; - private boolean adjusting; - - ActivityLonglineLogbookUIHandler() { - onRecomputePairing = e -> onRecomputePairing(e.getPropertyName()); - onActivityObsChanged = e -> onActivityObsChanged(); - } @Override public ActivityLonglineLogbookUIModel getModel() { return ui.getModel(); } - @Override - protected ContentOpenableUIInitializer<ActivityLonglineLogbookUI> createContentUIInitializer(ActivityLonglineLogbookUI ui) { - return new ContentOpenableUIInitializer<ActivityLonglineLogbookUI>(ui) { - - @SuppressWarnings("unchecked") - protected void init(BeanFilterableComboBox comboBox) { - if (!"relatedObservedActivity".equals(comboBox.getName())) { - super.init(comboBox); - return; - } - - comboBox.getCombobox().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F4, 0), "none"); - Class referenceType = comboBox.getBeanType(); - comboBox.setI18nLabelBuilder(ObserveI18nLabelsBuilder.createFromReferenceType(ActivityLonglineObsDto.class)); - comboBox.setI18nPrefix("observe.common."); - comboBox.setMinimumSize(new Dimension(0, 24)); - - if (StringUtils.isEmpty(comboBox.getProperty())) { - comboBox.setProperty(comboBox.getName()); - } - - log.info("Init relatedObservedActivity comboBox"); - Decorator decorator = decoratorService.getDecoratorByType(referenceType); - - String entityLabel = t(ObserveI18nDecoratorHelper.getTypeI18nKey(ActivityLonglineObsDto.class)); - comboBox.setPopupTitleText(t("observe.common.DataDto.type", entityLabel)); - - comboBox.init((JXPathDecorator) decorator, Collections.emptyList()); - - JComboBox combobox = comboBox.getCombobox(); - - @SuppressWarnings("unchecked") ListCellRenderer toolTipRenderer = new ComboBoxListCellRenderer(combobox.getRenderer()); - combobox.setRenderer(toolTipRenderer); - } - }; - } - @Override protected ObserveLayoutFocusTraversalPolicy<ActivityLonglineLogbookUI> createFocusTraversalPolicy() { return new ObserveLayoutFocusTraversalPolicy<ActivityLonglineLogbookUI>() { @@ -148,101 +71,6 @@ class ActivityLonglineLogbookUIHandler extends ContentOpenableUIHandler<Activity }; } - @Override - public void afterInit(ActivityLonglineLogbookUI ui) { - super.afterInit(ui); - pairingEngine = getDataSource().newActivityLonglinePairingEngine(ui.getConfig()); - } - - private void onRecomputePairing(String propertyName) { - if (adjusting || !PAIRING_PROPERTIES.contains(propertyName)) { - return; - } - log.info(prefix + "Need to recompute pairing data."); - ActivityLonglineLogbookUIModel model = getModel(); - if (!model.isValid()) { - log.info(prefix + "Reject: model is not valid."); - return; - } - adjusting = true; - try { - ActivityLonglineLogbookDto bean = model.getBean(); - ActivityLonglinePairingResult activityLonglinePairingResult = pairingEngine.computeForActivityLogbook(model.getPairingContext(), bean); - ActivityLonglinePairingResultItem pairingActivityObs = model.getActivityObs(); - ActivityLonglineObsReference relatedObservedActivity = model.getBean().getRelatedObservedActivity(); - - model.setActivityObsCandidates(activityLonglinePairingResult.getItems()); - - if (pairingActivityObs == null) { - - if (relatedObservedActivity != null) { - // use dto value - Optional<ActivityLonglinePairingResultItem> first = model.getActivityObsCandidates().stream().filter(e -> e.getObservationActivity().equals(relatedObservedActivity)).findFirst(); - if (!first.isPresent()) { - // Should never occurs ? - bean.setRelatedObservedActivity(null); - } else { - pairingActivityObs = first.get(); - model.setActivityObs(pairingActivityObs); - bean.setRelatedObservedActivity(pairingActivityObs.getObservationActivity()); - } - } - } else { - if (!model.getActivityObsCandidates().contains(pairingActivityObs)) { - // can not keep this pairing, - model.setActivityObs(null); - bean.setRelatedObservedActivity(null); - } else { - // keep this pairing - // use pairing value - bean.setRelatedObservedActivity(pairingActivityObs.getObservationActivity()); - } - } - } finally { - adjusting = false; - } - } - - private void onActivityObsChanged() { - if (adjusting) { - return; - } - adjusting = true; - try { - ActivityLonglineLogbookUIModel model = getModel(); - ActivityLonglinePairingResultItem activityObs = model.getActivityObs(); - model.getBean().setRelatedObservedActivity(activityObs == null ? null : activityObs.getObservationActivity()); - } finally { - adjusting = false; - } - } - - @Override - protected void onOpenBeforeOpenModel() { - ActivityLonglineLogbookUIModel model = getModel(); - ActivityLonglineLogbookDto bean = model.getBean(); - model.removePropertyChangeListener(ActivityLonglineLogbookUIModel.PROPERTY_VALID, onRecomputePairing); - bean.removePropertyChangeListener(ActivityLonglineLogbookDto.PROPERTY_LATITUDE, onRecomputePairing); - bean.removePropertyChangeListener(ActivityLonglineLogbookDto.PROPERTY_LONGITUDE, onRecomputePairing); - bean.removePropertyChangeListener(ActivityLonglineLogbookDto.PROPERTY_TIME_STAMP, onRecomputePairing); - bean.removePropertyChangeListener("activityObs", onActivityObsChanged); - - super.onOpenBeforeOpenModel(); - } - - @Override - protected void onOpenAfterOpenModel() { - super.onOpenAfterOpenModel(); - ActivityLonglineLogbookUIModel model = getModel(); - ActivityLonglineLogbookDto bean = model.getBean(); - model.addPropertyChangeListener(ActivityLonglineLogbookUIModel.PROPERTY_VALID, onRecomputePairing); - bean.addPropertyChangeListener(ActivityLonglineLogbookDto.PROPERTY_LATITUDE, onRecomputePairing); - bean.addPropertyChangeListener(ActivityLonglineLogbookDto.PROPERTY_LONGITUDE, onRecomputePairing); - bean.addPropertyChangeListener(ActivityLonglineLogbookDto.PROPERTY_TIME_STAMP, onRecomputePairing); - bean.addPropertyChangeListener("activityObs", onActivityObsChanged); - onRecomputePairing(ActivityLonglineLogbookUIModel.PROPERTY_VALID); - } - @Override protected void onOpenModel() { super.onOpenModel(); @@ -260,37 +88,8 @@ class ActivityLonglineLogbookUIHandler extends ContentOpenableUIHandler<Activity form = getActivityLonglineLogbookService().loadForm(activityId); } - TripLonglinePairingContext pairingContext = pairingEngine.newTripContext(tripId); - model.openForm(form, pairingContext); + List<ActivityLonglineObsReference> allActivityLonglineObs = getActivityLonglineObsService().getActivityLonglineByTripLongline(tripId).toList(); + model.openForm(form, allActivityLonglineObs); } - - private static class ComboBoxListCellRenderer<E extends ActivityLonglinePairingResultItem> implements ListCellRenderer<E> { - - private final ListCellRenderer<? super E> renderer; - - ComboBoxListCellRenderer(ListCellRenderer<? super E> renderer) { - this.renderer = renderer; - } - - @Override - public Component getListCellRendererComponent(JList<? extends E> list, - E value, - int index, - boolean isSelected, - boolean cellHasFocus) { - Component comp = renderer.getListCellRendererComponent( - list, - value, - index, - isSelected, - cellHasFocus - ); - if (comp instanceof JLabel) { - JLabel jcomp = (JLabel) comp; - jcomp.setToolTipText(jcomp.getText()); - } - return comp; - } - } } ===================================== client/src/main/java/fr/ird/observe/client/ui/content/data/longline/logbook/ActivityLonglineLogbookUIModel.java ===================================== @@ -22,20 +22,23 @@ package fr.ird.observe.client.ui.content.data.longline.logbook; * #L% */ +import com.google.common.collect.ImmutableList; import fr.ird.observe.client.ui.content.api.data.open.ContentOpenableUIModel; import fr.ird.observe.dto.data.longline.ActivityLonglineLogbookDto; import fr.ird.observe.dto.data.longline.ActivityLonglineLogbookReference; -import fr.ird.observe.dto.data.pairing.ActivityLonglinePairingResultItem; +import fr.ird.observe.dto.data.longline.ActivityLonglineObsReference; import fr.ird.observe.dto.form.Form; import fr.ird.observe.dto.referential.longline.VesselActivityLonglineHelper; import fr.ird.observe.dto.referential.longline.VesselActivityLonglineReference; -import fr.ird.observe.services.service.actions.pairing.TripLonglinePairingContext; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.nuiton.i18n.I18n; import org.nuiton.util.DateUtil; -import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * Created on 9/26/14. @@ -45,22 +48,26 @@ import java.util.List; */ public class ActivityLonglineLogbookUIModel extends ContentOpenableUIModel<ActivityLonglineLogbookDto, ActivityLonglineLogbookReference> { - public static final String PROPERTY_SET_OPERATION = "setOperation"; public static final String PROPERTY_DATE = "date"; public static final String PROPERTY_TIME = "time"; + private static final String PROPERTY_SET_OPERATION = "setOperation"; private static final long serialVersionUID = 1L; - - private TripLonglinePairingContext pairingContext; - private List<ActivityLonglinePairingResultItem> activityObsCandidates; - private ActivityLonglinePairingResultItem activityObs; + private static final Logger log = LogManager.getLogger(ActivityLonglineLogbookUIModel.class); + private List<ActivityLonglineObsReference> allActivityObs; + private List<ActivityLonglineObsReference> activityObs; + private boolean opening = false; public ActivityLonglineLogbookUIModel() { super(ActivityLonglineLogbookDto.class, I18n.n("observe.common.ActivityLonglineLogbookDto.message.not.open")); getBean().addPropertyChangeListener(ActivityLonglineLogbookDto.PROPERTY_VESSEL_ACTIVITY_LONGLINE, evt -> { boolean oldValue = VesselActivityLonglineHelper.isSetOperation((VesselActivityLonglineReference) evt.getOldValue()); - boolean newValue = VesselActivityLonglineHelper.isSetOperation((VesselActivityLonglineReference) evt.getNewValue()); + VesselActivityLonglineReference vesselActivityLonglineReference = (VesselActivityLonglineReference) evt.getNewValue(); + boolean newValue = VesselActivityLonglineHelper.isSetOperation(vesselActivityLonglineReference); firePropertyChange(PROPERTY_SET_OPERATION, oldValue, newValue); + if (!opening) { + updateActivityObs(); + } }); } @@ -94,31 +101,45 @@ public class ActivityLonglineLogbookUIModel extends ContentOpenableUIModel<Activ } } - public void openForm(Form<ActivityLonglineLogbookDto> form, TripLonglinePairingContext pairingContext) { - this.pairingContext = pairingContext; - super.openForm(form); - } - - public TripLonglinePairingContext getPairingContext() { - return pairingContext; + public void openForm(Form<ActivityLonglineLogbookDto> form, List<ActivityLonglineObsReference> allActivityObs) { + this.allActivityObs = ImmutableList.copyOf(allActivityObs); + opening = true; + try { + super.openForm(form); + } finally { + opening = false; + } + updateActivityObs(); } - public List<ActivityLonglinePairingResultItem> getActivityObsCandidates() { - return activityObsCandidates; + public List<ActivityLonglineObsReference> getActivityObs() { + return activityObs; } - public void setActivityObsCandidates(List<ActivityLonglinePairingResultItem> activityObsCandidates) { - this.activityObsCandidates = activityObsCandidates == null ? null : new ArrayList<>(activityObsCandidates); - firePropertyChange("activityObsCandidates", null, this.activityObsCandidates); + public void setActivityObs(List<ActivityLonglineObsReference> activityObs) { + // only used for jaxx binding } - public ActivityLonglinePairingResultItem getActivityObs() { - return activityObs; + public List<ActivityLonglineObsReference> getAllActivityObs() { + return allActivityObs; } - public void setActivityObs(ActivityLonglinePairingResultItem activityObs) { - ActivityLonglinePairingResultItem oldValue = getActivityObs(); - this.activityObs = activityObs; - firePropertyChange("activityObs", oldValue, activityObs); + private void updateActivityObs() { + log.info(getPrefix() + "Will update release observed actities..."); + ActivityLonglineLogbookDto bean = getBean(); + if (allActivityObs == null || bean.getVesselActivityLonglineId() == null) { + activityObs = Collections.emptyList(); + } else { + String vesselActivityLonglineId = bean.getVesselActivityLonglineId(); + activityObs = allActivityObs.stream().filter(e -> vesselActivityLonglineId.equals(e.getVesselActivityLonglineId())).collect(Collectors.toList()); + } + log.info(getPrefix() + "Found " + activityObs.size() + " related observed activities."); + ActivityLonglineObsReference relatedObservedActivity = bean.getRelatedObservedActivity(); + boolean removeRelatedObservedActivity = !opening && relatedObservedActivity != null && !activityObs.contains(relatedObservedActivity); + firePropertyChange("activityObs", null, activityObs); + if (removeRelatedObservedActivity) { + log.info(getPrefix() + "Removed not matching related observed activity: " + relatedObservedActivity); + bean.setRelatedObservedActivity(null); + } } } ===================================== client/src/main/resources/i18n/client_en_GB.properties ===================================== @@ -363,6 +363,9 @@ observe.common.ActivityLogbookDto.action.goToOpen.short=Logbook - Open activity observe.common.ActivityLogbookDto.action.goToOpen.tip=Go to open activity (Logbook) observe.common.ActivityLonglineLogbookDto.action.addSet=Add the fishing operation observe.common.ActivityLonglineLogbookDto.action.addSet.tip=Add the fishing operation associated with this activity +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity=Choose activity +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.message=Choose an activity beyoung the universe of possible ones (time minus than %s (minutes) and distance minus than %s (km))\: +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.title=Choose the related observed activity observe.common.ActivityLonglineLogbookDto.action.moves=Change trip observe.common.ActivityLonglineLogbookDto.action.moves.tip=Change trip of activities observe.common.ActivityLonglineLogbookDto.list.message.none=< No activity for current trip > ===================================== client/src/main/resources/i18n/client_es_ES.properties ===================================== @@ -363,6 +363,9 @@ observe.common.ActivityLogbookDto.action.goToOpen.short=Logbook - Open activity observe.common.ActivityLogbookDto.action.goToOpen.tip=Go to open activity (Logbook) \#TODO observe.common.ActivityLonglineLogbookDto.action.addSet=Añadir la operación de pesca observe.common.ActivityLonglineLogbookDto.action.addSet.tip=Añadir la operación de pesca asociada a esta actividad +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity=Choose activity \#TODO +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.message=Choose an activity beyoung the universe of possible ones (time minus than %s (minutes) and distance minus than %s (km))\: \#TODO +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.title=Choose the related observed activity \#TODO observe.common.ActivityLonglineLogbookDto.action.moves=Cambiar de marea observe.common.ActivityLonglineLogbookDto.action.moves.tip=Cambiar la marea de las actividades seleccionas observe.common.ActivityLonglineLogbookDto.list.message.none=< Ninguna actividad por la marea actual > ===================================== client/src/main/resources/i18n/client_fr_FR.properties ===================================== @@ -363,6 +363,9 @@ observe.common.ActivityLogbookDto.action.goToOpen.short=Livre de bord - Activit observe.common.ActivityLogbookDto.action.goToOpen.tip=Accéder à l'activité ouverte (Livre de bord) observe.common.ActivityLonglineLogbookDto.action.addSet=Ajouter l'opération de pêche observe.common.ActivityLonglineLogbookDto.action.addSet.tip=Ajouter l'opération de pêche associée à cette activité +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity=Choisir l'activité +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.message=Veuillez choisir une activité parmis celles possible (durée de moins de %s minutes et distance moins de %s kms) \: +observe.common.ActivityLonglineLogbookDto.action.chooseRelatedObservedActivity.title=Choisir l'activité d'observation associée observe.common.ActivityLonglineLogbookDto.action.moves=Changer de marée observe.common.ActivityLonglineLogbookDto.action.moves.tip=Changer la marée des activités sélectionnées observe.common.ActivityLonglineLogbookDto.list.message.none=< Aucune activité pour la marée courante > ===================================== dto/src/main/java/fr/ird/observe/dto/data/longline/ActivityLonglineAware.java ===================================== @@ -51,4 +51,6 @@ public interface ActivityLonglineAware extends ObserveDto { Float getLatitude(); Float getLongitude(); + + String getVesselActivityLonglineId(); } ===================================== dto/src/main/java/fr/ird/observe/dto/data/longline/ActivityLonglineLogbookDto.java ===================================== @@ -70,4 +70,8 @@ public class ActivityLonglineLogbookDto extends GeneratedActivityLonglineLogbook return ActivityLonglineAware.newGPSPoint(this); } + @Override + public String getVesselActivityLonglineId() { + return vesselActivityLongline == null ? null : vesselActivityLongline.getId(); + } } ===================================== dto/src/main/java/fr/ird/observe/dto/data/longline/ActivityLonglineObsDto.java ===================================== @@ -69,4 +69,9 @@ public class ActivityLonglineObsDto extends GeneratedActivityLonglineObsDto impl public GPSPoint getGPSPoint() { return ActivityLonglineAware.newGPSPoint(this); } + + @Override + public String getVesselActivityLonglineId() { + return vesselActivityLongline == null ? null : vesselActivityLongline.getId(); + } } ===================================== dto/src/main/java/fr/ird/observe/navigation/model/edit/ObserveEditModelManager.java ===================================== @@ -179,11 +179,11 @@ public class ObserveEditModelManager { log.debug("Will close edit node from incoming: " + node); ObserveEditNode realEditNode = editModel.forNodeType(node.getClass()).orElseThrow(IllegalStateException::new); log.info("Close edit node: " + node); - realEditNode.setId(null); for (ObserveEditNodeCloseCallback c : closeCallbacks.get(node.getClass())) { log.info("Apply callback on closed edit node: " + realEditNode + " - " + c); c.onEditNodeClosed(node, adjusting); } + realEditNode.setId(null); } private void openNode(ObserveEditNode<?> node, boolean adjusting) { ===================================== services/src/main/java/fr/ird/observe/services/service/actions/pairing/ActivityLonglinePairingEngine.java ===================================== @@ -33,6 +33,7 @@ import fr.ird.observe.dto.data.pairing.TripLonglinePairingResult; import fr.ird.observe.services.ObserveServicesProvider; import java.util.ArrayList; +import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Set; @@ -53,11 +54,13 @@ public class ActivityLonglinePairingEngine { this.config = config; } - public TripLonglinePairingContext newTripContext(String tripLonglineId) { - Set<ActivityLonglineObsReference> activityLonglineObsReferenceSet = servicesProvider.getActivityLonglineObsService().getActivityLonglineByTripLongline(tripLonglineId).toSet(); - return new TripLonglinePairingContext(config, tripLonglineId, ImmutableList.copyOf(activityLonglineObsReferenceSet)); + public ActivityLonglinePairingConfig getConfig() { + return config; } + public TripLonglinePairingContext newTripContext(String tripLonglineId, Collection<ActivityLonglineObsReference> allActivityLonglineObs) { + return new TripLonglinePairingContext(config, tripLonglineId, ImmutableList.copyOf(allActivityLonglineObs)); + } public TripLonglinePairingResult computeForTrip(TripLonglinePairingContext context) { ImmutableMap.Builder<ActivityLonglineLogbookReference, ActivityLonglinePairingResult> resultBuilder = ImmutableMap.builder(); @@ -70,7 +73,7 @@ public class ActivityLonglinePairingEngine { } public ActivityLonglinePairingResult computeForActivityLogbook(TripLonglinePairingContext context, ActivityLonglineAware activityLonglineLogbook) { - ImmutableList<ActivityLonglineObsReference> activityLonglineObsList = context.getActivityLonglineObsList(); + ImmutableList<ActivityLonglineObsReference> activityLonglineObsList = context.getActivityLonglineObsList(activityLonglineLogbook.getVesselActivityLonglineId()); List<ActivityLonglinePairingResultItem> itemBuilder = new ArrayList<>(activityLonglineObsList.size()); long longlineActivityPairingMaxTime = context.getConfig().getLonglineActivityPairingMaxTime(); long longlineActivityPairingMaxDistance = context.getConfig().getLonglineActivityPairingMaxDistance(); ===================================== services/src/main/java/fr/ird/observe/services/service/actions/pairing/TripLonglinePairingContext.java ===================================== @@ -26,6 +26,8 @@ import com.google.common.collect.ImmutableList; import fr.ird.observe.dto.ObserveDto; import fr.ird.observe.dto.data.longline.ActivityLonglineObsReference; +import java.util.stream.Collectors; + /** * Created by tchemit on 15/10/2018. * @@ -35,28 +37,24 @@ public class TripLonglinePairingContext implements ObserveDto { private final ActivityLonglinePairingConfig config; private final String tripLonglineId; - private final ImmutableList<ActivityLonglineObsReference> activityLonglineObsList; + private final ImmutableList<ActivityLonglineObsReference> allActivityLonglineObs; - public TripLonglinePairingContext(ActivityLonglinePairingConfig config, String tripLonglineId, ImmutableList<ActivityLonglineObsReference> activityLonglineObsList) { + public TripLonglinePairingContext(ActivityLonglinePairingConfig config, String tripLonglineId, ImmutableList<ActivityLonglineObsReference> allActivityLonglineObs) { this.config = config; this.tripLonglineId = tripLonglineId; - this.activityLonglineObsList = activityLonglineObsList; + this.allActivityLonglineObs = allActivityLonglineObs; } public ActivityLonglinePairingConfig getConfig() { return config; } - - public ImmutableList<ActivityLonglineObsReference> getActivityLonglineObsList() { - return activityLonglineObsList; + public ImmutableList<ActivityLonglineObsReference> getActivityLonglineObsList(String vesselActivityLonglineId) { + return ImmutableList.copyOf(allActivityLonglineObs.stream().filter(e -> vesselActivityLonglineId.equals(e.getVesselActivityLonglineId())).collect(Collectors.toList())); } public String getTripLonglineId() { return tripLonglineId; } - public boolean isEnabled() { - return !activityLonglineObsList.isEmpty(); - } } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/5ed5600489dc68fa3c8d833cdce... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/compare/5ed5600489dc68fa3c8d833cdce... You're receiving this email because of your account on gitlab.com.