Author: tchemit Date: 2013-02-12 19:40:17 +0100 (Tue, 12 Feb 2013) New Revision: 407 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/407 Log: refs #1845: [ERGO] - Principe d'enregistrement lors de la fermeture de l'?\195?\169cran (on doit aussi g?\195?\169rer le cas de mod?\195?\168le invalide) Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2013-02-12 18:38:26 UTC (rev 406) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2013-02-12 18:40:17 UTC (rev 407) @@ -261,24 +261,23 @@ SwingUtil.getParentContainer(ui, JDialog.class).setVisible(false); } - public int askSaveBeforeLeaving(Component parent) { + public int askSaveBeforeLeaving(String message) { int i = JOptionPane.showConfirmDialog( - parent, - _("tutti.dialog.askSaveBeforeLeaving.message"), + getContext().getMainUI(), + message, _("tutti.dialog.askSaveBeforeLeaving.title"), JOptionPane.YES_NO_CANCEL_OPTION); return i; } - public int askSaveBeforeLeaving(String message) { + public int askCancelEditBeforeLeaving(String message) { int i = JOptionPane.showConfirmDialog( getContext().getMainUI(), message, - _("tutti.dialog.askSaveBeforeLeaving.title"), - JOptionPane.YES_NO_CANCEL_OPTION); + _("tutti.dialog.askCancelEditBeforeLeaving.title"), + JOptionPane.YES_NO_OPTION); return i; } - //------------------------------------------------------------------------// //-- Internal methods --// //------------------------------------------------------------------------// Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java 2013-02-12 18:38:26 UTC (rev 406) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java 2013-02-12 18:40:17 UTC (rev 407) @@ -46,6 +46,8 @@ import java.beans.PropertyChangeListener; import java.util.List; +import static org.nuiton.i18n.I18n._; + /** * Handler of UI {@link EditCruiseUI}. * @@ -258,7 +260,7 @@ public boolean canCloseUI(TuttiScreen nextScreen) { boolean result = true; if (getModel().isModify()) { - int answer = askSaveBeforeLeaving(ui); + int answer = askSaveBeforeLeaving(_("tutti.dialog.askSaveBeforeLeaving.saveCruise")); result = answer == JOptionPane.NO_OPTION; if (answer == JOptionPane.YES_OPTION) { ActionEvent event = new ActionEvent(nextScreen, nextScreen.ordinal(), null); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-02-12 18:38:26 UTC (rev 406) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-02-12 18:40:17 UTC (rev 407) @@ -26,6 +26,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Lists; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.persistence.entities.referential.FishingOperationLocation; @@ -57,6 +58,8 @@ import java.util.Date; import java.util.List; +import static org.nuiton.i18n.I18n._; + /** * Handler for UI {@link EditFishingOperationUI}. * @@ -91,31 +94,31 @@ } }; - + private final PropertyChangeListener coordinatePropertiesListener = new PropertyChangeListener() { private List<String> properties = Lists.newArrayList( - EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_DECIMAL_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_DEGREE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_SECOND, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DECIMAL_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DEGREE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_SECOND, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_DECIMAL_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_DEGREE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_SECOND, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DECIMAL_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DEGREE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_MINUTE, - EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_SECOND + EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_DECIMAL_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_DEGREE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_SECOND, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DECIMAL_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DEGREE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_SECOND, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_DECIMAL_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_DEGREE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_SECOND, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DECIMAL_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DEGREE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_MINUTE, + EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_SECOND ); @Override @@ -328,21 +331,67 @@ @Override public boolean onHideTab(int currentIndex, int newIndex) { - boolean result = !isAModelModified(); - if (!result) { - int answer = askSaveBeforeLeaving(ui); - ActionEvent event = new ActionEvent(this, newIndex, null); - switch (answer) { - case JOptionPane.OK_OPTION: - doAction(ui.getSaveButton(), event); - result = true; - break; + boolean result; + if (isAModelModified()) { - case JOptionPane.NO_OPTION: - doAction(ui.getCancelButton(), event); - result = true; - break; + // something was modified + + EditFishingOperationUIModel model = getModel(); + + if (model.isValid()) { + + // ask if user want to save, do not save or cancel action + + String message; + + if (TuttiEntities.isNew(model.getFishingOperation())) { + message = _("tutti.dialog.askSaveBeforeLeaving.createFishingOperation"); + } else { + message = _("tutti.dialog.askSaveBeforeLeaving.saveFishingOperation"); + } + + int answer = askSaveBeforeLeaving(message); + ActionEvent event = new ActionEvent(this, newIndex, null); + switch (answer) { + case JOptionPane.OK_OPTION: + doAction(ui.getSaveButton(), event); + result = true; + break; + + case JOptionPane.NO_OPTION: + doAction(ui.getCancelButton(), event); + result = true; + break; + default: + + // other case, use cancel action + result = false; + } + } else { + + // model is not valid, ask user to continue or not + + int answer = askCancelEditBeforeLeaving( + _("tutti.dialog.askCancelEditBeforeLeaving.cancelEditFishingOperation")); + switch (answer) { + case JOptionPane.YES_OPTION: + + // ok will revert any modification + ActionEvent event = new ActionEvent(this, newIndex, null); + doAction(ui.getCancelButton(), event); + result = true; + break; + default: + + // other case, use cancel action + result = false; + } } + + } else { + + // model not modify, can change tab + result = true; } return result; } @@ -469,7 +518,7 @@ public void installStartDateListener() { getModel().addPropertyChangeListener(EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_DATE, startDateListener); } - + public void uninstallCoordinatesListener() { getModel().removePropertyChangeListener(coordinatePropertiesListener); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java 2013-02-12 18:38:26 UTC (rev 406) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java 2013-02-12 18:40:17 UTC (rev 407) @@ -64,10 +64,6 @@ persistenceService = context.getService(PersistenceService.class); } - public FishingOperationsUI getUi() { - return ui; - } - @Override public void beforeInitUI() { @@ -232,4 +228,23 @@ return ui.getTabPane(); } + public boolean isFishingOperationModified() { + return getModel().getEditFishingOperation() != null && + getUI().getFishingOperationTabContent().getModel().isModify(); + } + + public boolean isFishingOperationValid() { + return getModel().getEditFishingOperation() != null && + getUI().getFishingOperationTabContent().getModel().isValid(); + } + + public boolean isCatchBatchModified() { + return getModel().getEditFishingOperation() != null && + getUI().getCatchesTabContent().getModel().isModify(); + } + + public boolean isCatchBatchValid() { + return getModel().getEditFishingOperation() != null && + getUI().getCatchesTabContent().getModel().isValid(); + } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java 2013-02-12 18:38:26 UTC (rev 406) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java 2013-02-12 18:40:17 UTC (rev 407) @@ -39,6 +39,7 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTabbedPane; +import java.awt.event.ActionEvent; import static org.nuiton.i18n.I18n._; import static org.nuiton.i18n.I18n.n_; @@ -77,9 +78,10 @@ private final TuttiBeanMonitor<EditCatchesUIModel> catchBatchMonitor; protected final FishingOperationsUI parentUi; + public EditCatchesUIHandler(FishingOperationsUI parentUi, EditCatchesUI ui) { super(parentUi.getHandler().getContext(), ui); - this.parentUi=parentUi; + this.parentUi = parentUi; // this.persistenceService = context.getService(PersistenceService.class); this.catchBatchMonitor = new TuttiBeanMonitor<EditCatchesUIModel>( EditCatchesUIModel.PROPERTY_SPECIES_TOTAL_WEIGHT, @@ -151,33 +153,62 @@ // (I do not even know why it is set to modified and have no time // before the demo) EditCatchesUIModel model = getModel(); - boolean result = model.isValid(); + boolean result; if (model.isModify()) { - int answer = askSaveBeforeLeaving(getUI()); - switch (answer) { - case JOptionPane.OK_OPTION: - // persist catch batch - doAction(getUI().getSaveButton(), null); + if (model.isValid()) { - result = true; - break; + // ask user to save, do not save or cancel action + int answer = askSaveBeforeLeaving( + _("tutti.dialog.askSaveBeforeLeaving.saveCatchBatch")); + switch (answer) { + case JOptionPane.OK_OPTION: - case JOptionPane.NO_OPTION: + // persist catch batch + doAction(getUI().getSaveButton(), null); - // won't save modification - // so since we will edit a new operation, nothing to do here + result = true; + break; - // persist catch batch - doAction(getUI().getCancelButton(), null); + case JOptionPane.NO_OPTION: - result = true; - break; - default: + // won't save modification + // so since we will edit a new operation, nothing to do here - // other case, use cancel action - result = false; + // persist catch batch + doAction(getUI().getCancelButton(), null); + + result = true; + break; + default: + + // other case, use cancel action + result = false; + } + } else { + + // model is not valid, ask user to loose modification or cancel + int answer = askCancelEditBeforeLeaving( + _("tutti.dialog.askCancelEditBeforeLeaving.cancelEditCatchBatch")); + switch (answer) { + case JOptionPane.YES_OPTION: + + // ok will revert any modification + ActionEvent event = new ActionEvent(this, newIndex, null); + doAction(ui.getCancelButton(), event); + result = true; + break; + default: + + // other case, use cancel action + result = false; + } } + + } else { + + // model not modify, can change tab + result = true; } return result; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIHandler.java 2013-02-12 18:38:26 UTC (rev 406) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIHandler.java 2013-02-12 18:40:17 UTC (rev 407) @@ -38,6 +38,8 @@ import java.awt.event.ActionEvent; import java.util.List; +import static org.nuiton.i18n.I18n._; + /** * Handler of UI {@link EditProgramUI}. * @@ -132,7 +134,7 @@ public boolean canCloseUI(TuttiScreen nextScreen) { boolean result = true; if (getModel().isModify()) { - int answer = askSaveBeforeLeaving(ui); + int answer = askSaveBeforeLeaving(_("tutti.dialog.askSaveBeforeLeaving.saveProgram")); result = answer == JOptionPane.NO_OPTION; if (answer == JOptionPane.YES_OPTION) { ActionEvent event = new ActionEvent(nextScreen, nextScreen.ordinal(), null); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java 2013-02-12 18:38:26 UTC (rev 406) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java 2013-02-12 18:40:17 UTC (rev 407) @@ -63,7 +63,9 @@ import java.util.List; import java.util.Map; +import static org.nuiton.i18n.I18n._; + /** * @author tchemit <chemit@codelutin.com> * @since 0.3 @@ -356,7 +358,7 @@ public boolean canCloseUI(TuttiScreen nextScreen) { boolean result = true; if (getModel().isModify()) { - int answer = askSaveBeforeLeaving(ui); + int answer = askSaveBeforeLeaving(_("tutti.dialog.askSaveBeforeLeaving.saveProtocol")); result = answer == JOptionPane.NO_OPTION; if (answer == JOptionPane.YES_OPTION) { ActionEvent event = new ActionEvent(nextScreen, nextScreen.ordinal(), null); Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-02-12 18:38:26 UTC (rev 406) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-02-12 18:40:17 UTC (rev 407) @@ -143,9 +143,16 @@ tutti.config.category.shortcuts.description=Liste des raccourcis clavier tutti.config.category.ui=Interface utilisateur tutti.config.category.ui.description=Options de l'interface utilisateur -tutti.dialog.askSaveBeforeLeaving.createFishingOperation=Vous avez fait des modifications qu vous n'avez pas enregistrées. Voulez-vous les enregistrer ? -tutti.dialog.askSaveBeforeLeaving.message=Vous avez fait des modifications qu vous n'avez pas enregistrées. Voulez-vous les enregistrer ? -tutti.dialog.askSaveBeforeLeaving.saveFishingOperation=Vous avez fait des modifications qu vous n'avez pas enregistrées. Voulez-vous les enregistrer ? +tutti.dialog.askCancelEditBeforeLeaving.cancelEditCatchBatch=La capture modifiée n'est pas valide. Voulez-vous annuler les modifications ? +tutti.dialog.askCancelEditBeforeLeaving.cancelEditFishingOperation=Le trait modifié n'est pas valide. Voulez-vous annuler les modifications ? +tutti.dialog.askCancelEditBeforeLeaving.title=Modifications non enregistrées mais invalides +tutti.dialog.askSaveBeforeLeaving.createFishingOperation=Le trait n'a pas été créé. Voulez-vous l'enregistrer ? +tutti.dialog.askSaveBeforeLeaving.message=Vous avez fait des modifications que vous n'avez pas enregistrées. Voulez-vous les enregistrer ? +tutti.dialog.askSaveBeforeLeaving.saveCatchBatch=La capture a été modifiée. Voulez-vous enregistrer les modifications ? +tutti.dialog.askSaveBeforeLeaving.saveProgram=La série de campagne a été modifiée. Voulez-vous enregistrer les modifications ? +tutti.dialog.askSaveBeforeLeaving.saveCruise=La campagne a été modifiée. Voulez-vous enregistrer les modifications ? +tutti.dialog.askSaveBeforeLeaving.saveProtocol=Le protocol a été modifié. Voulez-vous enregistrer les modifications ? +tutti.dialog.askSaveBeforeLeaving.saveFishingOperation=Le trait a été modifié. Voulez-vous enregistrer les modifications ? tutti.dialog.askSaveBeforeLeaving.title=Modifications non enregistrées tutti.dialog.catches.species.computeWeight.error.message=Erreur lors de l'élévation des poids tutti.dialog.catches.species.computeWeight.error.title=Erreur @@ -273,6 +280,8 @@ tutti.label.tab.fishingOperation=Trait tutti.label.tab.fishingOperation.general=Trait tutti.label.tab.fishingOperation.hydrology=Paramètres hydrologiques +tutti.label.tab.fishingOperation.environment=Environnement +tutti.label.tab.fishingOperation.gearShooting=Mise en oeuvre de l'engin tutti.label.tab.macroDechet=Macro déchets tutti.label.tab.observationIndividuel=Observations individuelles tutti.label.tab.plancton=Plancton