This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 1bd69d9a0d107dd8603f5ad3dfb6f2af1f3ebe64 Author: Benjamin POUSSIN <poussin@codelutin.com> Date: Sat Jul 30 16:22:05 2016 +0200 fixes #8048: [OBSERVATIONS INDIVIDUELLES] Navigation efficace pour accéder au trait précédent/suivant de la même espèce --- .../tutti/persistence/TuttiPersistenceImpl.java | 10 ++ .../persistence/TuttiPersistenceNoDbImpl.java | 10 ++ .../service/CatchBatchPersistenceService.java | 19 +++ .../service/CatchBatchPersistenceServiceImpl.java | 59 +++++++ .../ifremer/tutti/service/PersistenceService.java | 10 ++ .../operation/FishingOperationsUIHandler.java | 4 + .../species/EditSpeciesBatchPanelUIHandler.java | 25 +++ .../species/frequency/SpeciesFrequencyUI.jaxx | 6 + .../species/frequency/SpeciesFrequencyUI.jcss | 10 ++ .../frequency/SpeciesFrequencyUIHandler.java | 8 + .../species/frequency/SpeciesFrequencyUIModel.java | 34 ++++ .../SearchSpeciesInPrevOrNextCatchesAction.java | 183 +++++++++++++++++++++ .../resources/i18n/tutti-ui-swing_en_GB.properties | 9 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 9 + 14 files changed, 396 insertions(+) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java index 6c49c25..85f4970 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java @@ -1166,6 +1166,16 @@ public class TuttiPersistenceImpl implements TuttiPersistence { getCatchBatchService().recomputeCatchBatchSampleRatios(fishingOperationId); } + @Override + public Map getPrevOperationNameAndBatchId(int operationId, int taxonId) { + return getCatchBatchService().getPrevOperationNameAndBatchId(operationId, taxonId); + } + + @Override + public Map getNextOperationNameAndBatchId(int operationId, int taxonId) { + return getCatchBatchService().getNextOperationNameAndBatchId(operationId, taxonId); + } + //------------------------------------------------------------------------// //-- Species Batch methods --// //------------------------------------------------------------------------// diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java index eb4ef9b..e6d06c0 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java @@ -690,6 +690,16 @@ public class TuttiPersistenceNoDbImpl implements TuttiPersistence { throw notImplemented(); } + @Override + public Map getPrevOperationNameAndBatchId(int operationId, int taxonId) { + throw notImplemented(); + } + + @Override + public Map getNextOperationNameAndBatchId(int operationId, int taxonId) { + throw notImplemented(); + } + //------------------------------------------------------------------------// //-- Species batch methods --// //------------------------------------------------------------------------// diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceService.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceService.java index 58330a0..8c9f630 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceService.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceService.java @@ -24,6 +24,7 @@ package fr.ifremer.tutti.persistence.service; import fr.ifremer.tutti.persistence.TuttiPersistenceServiceImplementor; import fr.ifremer.tutti.persistence.entities.data.CatchBatch; +import java.util.Map; import org.springframework.transaction.annotation.Transactional; @Transactional(readOnly = true) @@ -86,4 +87,22 @@ public interface CatchBatchPersistenceService extends TuttiPersistenceServiceImp */ @Transactional(readOnly = false) void recomputeCatchBatchSampleRatios(Integer fishingOperationId); + + /** + * Search batch with same taxon in previous operation in same fishing trip + * + * @param operationId + * @param taxonId + * @return map with key: operationName and batchId + */ + Map getPrevOperationNameAndBatchId(int operationId, int taxonId); + + /** + * Search batch with same taxon in previous operation in same fishing trip + * + * @param operationId + * @param taxonId + * @return map with key: operationName and batchId + */ + Map getNextOperationNameAndBatchId(int operationId, int taxonId); } diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceImpl.java index d7bbdc9..6ec2740 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceImpl.java @@ -53,10 +53,12 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.TreeMap; +import org.hibernate.Query; @Service("batchPersistenceService") public class CatchBatchPersistenceServiceImpl @@ -684,4 +686,61 @@ public class CatchBatchPersistenceServiceImpl } + //------------------------------------------------------------------------// + //-- Other methods --// + //------------------------------------------------------------------------// + + @Override + public Map getPrevOperationNameAndBatchId(int operationId, int taxonId) { + // TODO poussin 20160729 put hql in query file (xml) and use getNamedQuery instead of createQuery + String sql = "SELECT o.id as operationId, b.id as batchId" + + " FROM OPERATION o JOIN batch b ON o.catch_batch_fk=b.root_batch_fk" + + " WHERE o.is_fishing_operation = 1" + + " AND o.fishing_trip_fk = (SELECT fishing_trip_fk FROM operation WHERE id = :operationId)" + + " AND o.fishing_end_date_time < (select fishing_end_date_time from operation where id = :operationId)" + + " AND b.reference_taxon_fk = :taxonId" + + " ORDER BY o.fishing_start_date_time DESC, b.id;"; + + Query q = getCurrentSession().createSQLQuery(sql); + q.setInteger("operationId", operationId); + q.setInteger("taxonId", taxonId); + q.setMaxResults(1); + + Object[] select = (Object[])q.uniqueResult(); + Map result = null; + if (select != null && select.length == 2) { + result = new HashMap(); + result.put("operationId", select[0]); + result.put("batchId", select[1]); + } + + return result; + } + + @Override + public Map getNextOperationNameAndBatchId(int operationId, int taxonId) { + // TODO poussin 20160729 put hql in query file (xml) and use getNamedQuery instead of createQuery + String sql = "SELECT o.id as operationId, b.id as batchId" + + " FROM OPERATION o JOIN batch b ON o.catch_batch_fk=b.root_batch_fk" + + " WHERE o.is_fishing_operation = 1" + + " AND o.fishing_trip_fk = (SELECT fishing_trip_fk FROM operation WHERE id = :operationId)" + + " AND o.fishing_end_date_time > (select fishing_end_date_time from operation where id = :operationId)" + + " AND b.reference_taxon_fk = :taxonId" + + " ORDER BY o.fishing_start_date_time ASC, b.id;"; + + Query q = getCurrentSession().createSQLQuery(sql); + q.setInteger("operationId", operationId); + q.setInteger("taxonId", taxonId); + q.setMaxResults(1); + + Object[] select = (Object[])q.uniqueResult(); + Map result = null; + if (select != null && select.length == 2) { + result = new HashMap(); + result.put("operationId", select[0]); + result.put("batchId", select[1]); + } + + return result; + } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java index fdce407..6e96104 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java @@ -1480,6 +1480,16 @@ public class PersistenceService extends AbstractTuttiService implements TuttiPer driver.recomputeCatchBatchSampleRatios(fishingOperationId); } + @Override + public Map getPrevOperationNameAndBatchId(int operationId, int taxonId) { + return driver.getPrevOperationNameAndBatchId(operationId, taxonId); + } + + @Override + public Map getNextOperationNameAndBatchId(int operationId, int taxonId) { + return driver.getNextOperationNameAndBatchId(operationId, taxonId); + } + //------------------------------------------------------------------------// //-- Species Batch methods --// //------------------------------------------------------------------------// diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java index 75fc450..3a3e393 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java @@ -223,6 +223,10 @@ public class FishingOperationsUIHandler extends AbstractTuttiTabContainerUIHandl }); } + public EditFishingOperationAction getEditFishingOperationAction() { + return editFishingOperationAction; + } + @Override protected JComponent getComponentToFocus() { return null; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/EditSpeciesBatchPanelUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/EditSpeciesBatchPanelUIHandler.java index 61beab2..6dbf14b 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/EditSpeciesBatchPanelUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/EditSpeciesBatchPanelUIHandler.java @@ -29,7 +29,9 @@ import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesB import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchTableModel; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyCellComponent; import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIModel; import fr.ifremer.tutti.ui.swing.util.AbstractTuttiUIHandler; +import java.util.Map; import jaxx.runtime.swing.CardLayout2Ext; import jaxx.runtime.validator.swing.SwingValidator; import org.jdesktop.swingx.JXTable; @@ -37,6 +39,8 @@ import org.jdesktop.swingx.JXTable; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.table.TableColumn; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import static org.nuiton.i18n.I18n.n; import static org.nuiton.i18n.I18n.t; @@ -48,6 +52,9 @@ import static org.nuiton.i18n.I18n.t; */ public class EditSpeciesBatchPanelUIHandler extends AbstractTuttiUIHandler<EditSpeciesBatchPanelUIModel, EditSpeciesBatchPanelUI> { + /** Logger. */ + private static final Log log = LogFactory.getLog(EditSpeciesBatchPanelUIHandler.class); + protected SpeciesOrBenthosBatchUISupport speciesOrBenthosBatchUISupport; @Override @@ -116,6 +123,24 @@ public class EditSpeciesBatchPanelUIHandler extends AbstractTuttiUIHandler<EditS false); frequencyEditor.getHandler().editBatch(editor, frequenciesTitle); + SpeciesFrequencyUIModel model = frequencyEditor.getModel(); + try { + int fishingOperationId = model.getFishingOperation().getIdAsInt(); + int taxonId = model.getBatch().getSpecies().getReferenceTaxonId(); + + Map map = getPersistenceService().getPrevOperationNameAndBatchId( + fishingOperationId, taxonId); + model.setCanGoPrevBatch(map != null); + + map = getPersistenceService().getNextOperationNameAndBatchId( + fishingOperationId, taxonId); + model.setCanGoNextBatch(map != null); + } catch (Exception eee) { + log.warn("Can't check navigation between batch", eee); + model.setCanGoPrevBatch(false); + model.setCanGoNextBatch(false); + } + // open frequency editor ui.switchToEditFrequency(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx index 7c37a53..2189d3f 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jaxx @@ -36,6 +36,7 @@ fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.actions.SaveAndStaySpeciesFrequencyAction fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.actions.SaveAndCloseSpeciesFrequencyAction fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.actions.SaveAndContinueSpeciesFrequencyAction + fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.actions.SearchSpeciesInPrevOrNextCatchesAction; fr.ifremer.tutti.ui.swing.util.TuttiUI fr.ifremer.tutti.ui.swing.util.TuttiUIUtil fr.ifremer.tutti.ui.swing.util.WideDataBeanFilterableComboBox @@ -103,9 +104,14 @@ public boolean leaveIfConfirmed() { return handler.leaveIfConfirmed(); } <SaveAndCloseSpeciesFrequencyAction id="saveAndCloseAction" constructorParams="this"/> <SaveAndContinueSpeciesFrequencyAction id="saveAndContinueAction" constructorParams="this"/> + <SearchSpeciesInPrevOrNextCatchesAction id="searchSpeciesInPrevCatchesAction" constructorParams="this, true"/> + <SearchSpeciesInPrevOrNextCatchesAction id="searchSpeciesInNextCatchesAction" constructorParams="this, false"/> + <JToolBar id='speciesFrequencyTabToolBar'> <JMenuBar id='menu'> <JMenu id='menuAction'> + <JMenuItem id='searchSpeciesInPrevCatchesButton'/> + <JMenuItem id='searchSpeciesInNextCatchesButton'/> <JMenu id='menuImportMultiPost'> <JMenuItem id='importMultiPostFullButton'/> <JMenuItem id='importMultiPostOnlyFrequenciesButton'/> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss index 6392378..2532078 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUI.jcss @@ -81,6 +81,16 @@ ComputableDataEditor { i18nMnemonic: "tutti.toolbar.menuExportMultiPost.action.mnemonic"; } +#searchSpeciesInPrevCatchesButton { + action: {searchSpeciesInPrevCatchesAction}; + enabled: {getModel().isCanGoPrevBatch()}; +} + +#searchSpeciesInNextCatchesButton { + action: {searchSpeciesInNextCatchesAction}; + enabled: {getModel().isCanGoNextBatch()}; +} + #importMultiPostFullButton { actionIcon: import; text: "tutti.editSpeciesFrequencies.action.importMultiPostFull"; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java index 74fc75c..f0925f8 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java @@ -95,6 +95,7 @@ import javax.swing.table.TableColumnModel; import java.awt.Color; import java.awt.Component; import java.awt.Font; +import java.awt.event.ActionEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; @@ -106,6 +107,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import javax.swing.KeyStroke; import static org.nuiton.i18n.I18n.t; @@ -419,6 +421,12 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci @Override public void afterInit(SpeciesFrequencyUI ui) { + // add short cut to menu item + getUI().getSearchSpeciesInPrevCatchesButton().setAccelerator( + KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.CTRL_MASK)); + getUI().getSearchSpeciesInNextCatchesButton().setAccelerator( + KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK)); + applySpeciesFrequencyRafaleAction = new ApplySpeciesFrequencyRafaleAction(ui); initUI(ui); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java index 42b8325..cc6a9ed 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIModel.java @@ -104,6 +104,10 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa public static final String PROPERTY_CAN_EDIT_LENGTH_STEP = "canEditLengthStep"; + public static final String PROPERTY_CAN_GO_PREV_BATCH = "canGoPrevBatch"; + + public static final String PROPERTY_CAN_GO_NEXT_BATCH = "canGoNextBatch"; + public static final String PROPERTY_COPY_INDIVIDUAL_OBSERVATION_MODE = "copyIndividualObservationMode"; public static final String PROPERTY_COPY_INDIVIDUAL_OBSERVATION_ALL = "copyIndividualObservationAll"; @@ -264,6 +268,16 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa private CopyIndividualObservationMode copyIndividualObservationMode; /** + * computed when species change, used to enable or disable menu + */ + private boolean canGoPrevBatch = true; + + /** + * computed when species change, used to enable or disable menu + */ + private boolean canGoNextBatch = true; + + /** * Is the model is loading? */ private boolean initBatchEdition; @@ -688,6 +702,26 @@ public class SpeciesFrequencyUIModel extends AbstractTuttiTableUIModel<SpeciesBa return CopyIndividualObservationMode.SIZE == copyIndividualObservationMode; } + public boolean isCanGoPrevBatch() { + return canGoPrevBatch; + } + + public void setCanGoPrevBatch(boolean canGoPrevBatch) { + boolean old = this.canGoPrevBatch; + this.canGoPrevBatch = canGoPrevBatch; + firePropertyChange(PROPERTY_CAN_GO_PREV_BATCH, old, canGoPrevBatch); + } + + public boolean isCanGoNextBatch() { + return canGoNextBatch; + } + + public void setCanGoNextBatch(boolean canGoNextBatch) { + boolean old = this.canGoNextBatch; + this.canGoNextBatch = canGoNextBatch; + firePropertyChange(PROPERTY_CAN_GO_NEXT_BATCH, old, canGoNextBatch); + } + public Set<SpeciesFrequencyRowModel> getEmptyRows() { return emptyRows; } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/SearchSpeciesInPrevOrNextCatchesAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/SearchSpeciesInPrevOrNextCatchesAction.java new file mode 100644 index 0000000..bdc5111 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/SearchSpeciesInPrevOrNextCatchesAction.java @@ -0,0 +1,183 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.actions; + +/* + * #%L + * Tutti :: UI + * $Id:$ + * $HeadURL:$ + * %% + * Copyright (C) 2012 - 2015 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% + */ + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; +import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUIModel; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.EditSpeciesBatchPanelUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesOrBenthosBatchUISupport; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIHandler; +import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyUIModel; +import fr.ifremer.tutti.ui.swing.content.operation.fishing.actions.EditFishingOperationAction; +import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import javax.swing.JOptionPane; +import jaxx.runtime.SwingUtil; +import org.jdesktop.swingx.JXTable; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 28/07/2016 + * + * @author Benjamin POUSSIN - poussin@codelutin.com + * @since 4.6 + */ +public class SearchSpeciesInPrevOrNextCatchesAction extends SaveSupportAction { + + /** Logger. */ + private static final Log log = LogFactory.getLog(SearchSpeciesInPrevOrNextCatchesAction.class); + + protected boolean prev; + protected Map operationIdAndBatchId; + protected SpeciesFrequencyUIHandler handler; + + + public SearchSpeciesInPrevOrNextCatchesAction(SpeciesFrequencyUI ui, boolean prev) { + super(ui); + this.prev = prev; + handler = ui.getHandler(); + + if (prev) { + putValue(NAME, t("tutti.editSpeciesFrequencies.action.searchSpeciesInPrevCatches")); + putValue(SHORT_DESCRIPTION, t("tutti.editSpeciesFrequencies.action.searchSpeciesInPrevCatches.tip")); + putValue(MNEMONIC_KEY, (int) SwingUtil.getFirstCharAt(t("tutti.editSpeciesFrequencies.action.searchSpeciesInPrevCatches.mnemonic"), 'Z')); +// putValue(SMALL_ICON, SwingUtil.createActionIcon("checkSave")); + } else { + putValue(NAME, t("tutti.editSpeciesFrequencies.action.searchSpeciesInNextCatches")); + putValue(SHORT_DESCRIPTION, t("tutti.editSpeciesFrequencies.action.searchSpeciesInNextCatches.tip")); + putValue(MNEMONIC_KEY, (int) SwingUtil.getFirstCharAt(t("tutti.editSpeciesFrequencies.action.searchSpeciesInNextCatches.mnemonic"), 'Z')); +// putValue(SMALL_ICON, SwingUtil.createActionIcon("checkSave")); + } + + } + + @Override + public void actionPerformed(ActionEvent e) { + + operationIdAndBatchId = search(); + if (operationIdAndBatchId != null) { + if (checkSave()) { + move(); + } + } else { + JOptionPane.showOptionDialog(handler.getTopestUI(), + t("tutti.informCantFindBatchWithSpecies.message"), + t("tutti.informCantFindBatchWithSpecies.title"), + JOptionPane.OK_OPTION, + JOptionPane.INFORMATION_MESSAGE, + null, + new String[]{t("tutti.option.ok")}, + t("tutti.option.ok")); + } + } + + protected Map search() { + Map result; + // FIXME poussin rechercher dans un trait precedent s'il y a la meme espece + // si oui faire l'action, sinon dire qu'on a rien trouve. + SpeciesFrequencyUIModel model = handler.getModel(); + int fishingOperationId = model.getFishingOperation().getIdAsInt(); + int taxonId = model.getBatch().getSpecies().getReferenceTaxonId(); + + log.debug(String.format("looking for fishingOperationId: %s, taxonId: %s", fishingOperationId, taxonId)); + if (prev) { + result = + handler.getPersistenceService().getPrevOperationNameAndBatchId( + fishingOperationId, taxonId); + } else { + result = + handler.getPersistenceService().getNextOperationNameAndBatchId( + fishingOperationId, taxonId); + } + + log.debug(String.format("search result: %s", result)); + return result; + } + + protected boolean checkSave() { + boolean doAction = true; + if (handler.getModel().isModify()) { + + // Ask confirmation to quit screen + doAction = handler.askCancelEditBeforeLeaving(); + } + return doAction; + } + + public void move() { + + EditSpeciesBatchPanelUI oldBatchUI = handler.getUI().getParentContainer(EditSpeciesBatchPanelUI.class); + SpeciesOrBenthosBatchUISupport sbbs = oldBatchUI.getModel().getSpeciesOrBenthosBatchUISupport(); + + FishingOperationsUI foUI = handler.getUI().getParentContainer(FishingOperationsUI.class); + FishingOperationsUIModel foModel = foUI.getModel(); + List<FishingOperation> list = foModel.getFishingOperation(); + Optional<FishingOperation> op = list.stream().filter((FishingOperation o) -> { + return Objects.equals(o.getIdAsInt(), operationIdAndBatchId.get("operationId")); + }).findFirst(); + + // reposition screen on batch table, must be done after load + EditFishingOperationAction changeAction = foUI.getHandler().getEditFishingOperationAction(); + changeAction.addPropertyChangeListener(changeAction.PROPERTY_DONE, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + changeAction.removePropertyChangeListener(changeAction.PROPERTY_DONE, this); + + // go to batch table + foUI.getTabPane().setSelectedIndex(1); + EditCatchesUI catchUI = foUI.getCatchesTabContent(); + EditSpeciesBatchPanelUI batchUI = catchUI.getEditSpeciesBatchPanelUI(sbbs); + // select table row + SpeciesBatchUI speciesUI = batchUI.getEditBatchesUI(); + JXTable table = speciesUI.getTable(); + String batchId = String.valueOf(operationIdAndBatchId.get("batchId")); + for (int i = 0, max = table.getRowCount(); i < max; i++) { + Object value = table.getValueAt(i, 1); + if (Objects.equals(value, batchId)) { + table.setRowSelectionInterval(i, i); + break; + } + } + } + }); + + log.debug(String.format("switch to operation: %s", op)); + foModel.setSelectedFishingOperation(op.get()); + + } +} \ No newline at end of file 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 be6ad99..6b3bded 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 @@ -1587,6 +1587,12 @@ tutti.editSpeciesFrequencies.action.saveAndContinue.tip= tutti.editSpeciesFrequencies.action.saveAndStay= tutti.editSpeciesFrequencies.action.saveAndStay.mnemonic= tutti.editSpeciesFrequencies.action.saveAndStay.tip= +tutti.editSpeciesFrequencies.action.searchSpeciesInNextCatches= +tutti.editSpeciesFrequencies.action.searchSpeciesInNextCatches.mnemonic= +tutti.editSpeciesFrequencies.action.searchSpeciesInNextCatches.tip= +tutti.editSpeciesFrequencies.action.searchSpeciesInPrevCatches= +tutti.editSpeciesFrequencies.action.searchSpeciesInPrevCatches.mnemonic= +tutti.editSpeciesFrequencies.action.searchSpeciesInPrevCatches.tip= tutti.editSpeciesFrequencies.addMeasure= tutti.editSpeciesFrequencies.askBeforeSave.help= tutti.editSpeciesFrequencies.askBeforeSave.message= @@ -2034,6 +2040,8 @@ tutti.importPupitri.melagWeight.title= tutti.importPupitri.title= tutti.importPupitri.trunkFile.extension= tutti.importPupitri.trunkFile.extension.description= +tutti.informCantFindBatchWithSpecies.message= +tutti.informCantFindBatchWithSpecies.title= tutti.io.error.copyFile= tutti.label.tab.accidental= tutti.label.tab.benthos= @@ -2318,6 +2326,7 @@ tutti.option.continue= tutti.option.edit= tutti.option.import= tutti.option.notSaveCatch= +tutti.option.ok= tutti.option.quit= tutti.option.resetCatch= tutti.option.saveAndQuit= 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 806ef8f..78d15de 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 @@ -1478,6 +1478,12 @@ tutti.editSpeciesFrequencies.action.saveAndContinue.tip=Enregistrer les mensurat tutti.editSpeciesFrequencies.action.saveAndStay=Enregistrer et Rester tutti.editSpeciesFrequencies.action.saveAndStay.mnemonic=S tutti.editSpeciesFrequencies.action.saveAndStay.tip=Enregistrer les mensurations et rester sur cet écran +tutti.editSpeciesFrequencies.action.searchSpeciesInNextCatches=Rechercher cette espèce -> +tutti.editSpeciesFrequencies.action.searchSpeciesInNextCatches.mnemonic=P +tutti.editSpeciesFrequencies.action.searchSpeciesInNextCatches.tip=Rechercher cette espèce dans un trait suivant +tutti.editSpeciesFrequencies.action.searchSpeciesInPrevCatches=<- Rechercher cette espèce +tutti.editSpeciesFrequencies.action.searchSpeciesInPrevCatches.mnemonic=N +tutti.editSpeciesFrequencies.action.searchSpeciesInPrevCatches.tip=Rechercher cette espèce dans un trait précédent tutti.editSpeciesFrequencies.addMeasure=Ajout d'un individu de taille <strong>%1$s</strong>%3$s (classe de taille <strong>%2$s</strong>%3$s) tutti.editSpeciesFrequencies.askBeforeSave.help=Que voulez-vous faire?<ul><li><strong>Non</strong> pour rester sur cet écran</li><li><strong>Oui</strong> pour enregisrer les mensurations avec poids</li></ul> tutti.editSpeciesFrequencies.askBeforeSave.message=La saisie comporte des classes de taille avec et sans poids associés.<br/><strong>Seules les classes de taille avec poids seront dans ce cas sauvegardées.</strong> @@ -1896,6 +1902,8 @@ tutti.importPupitri.melagWeight.title=Melag détecté tutti.importPupitri.title=Import Pupitri tutti.importPupitri.trunkFile.extension=tnk tutti.importPupitri.trunkFile.extension.description=Fichier du trémie (.tnk) +tutti.informCantFindBatchWithSpecies.message=Impossible de trouver cette espèce +tutti.informCantFindBatchWithSpecies.title=Impossible de trouver cette espèce tutti.io.error.copyFile=Impossible de copier le fichier tutti.label.tab.accidental=Captures accidentelles tutti.label.tab.benthos=Benthos @@ -2145,6 +2153,7 @@ tutti.option.continue=Continuer tutti.option.edit=Éditer tutti.option.import=Importer tutti.option.notSaveCatch=Ne pas enregistrer les modifications +tutti.option.ok=Ok tutti.option.quit=Quitter tutti.option.resetCatch=Annuler les modifications tutti.option.saveAndQuit=Enregistrer et quitter -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.